tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Problems with raidframe under NetBSD-5.1/i386
On Sat, 8 Jan 2011 15:48:41 +0000 (UTC)
christos%astron.com@localhost (Christos Zoulas) wrote:
> In article <20110107205035.7d03116f%quad.oster.net@localhost>,
> Greg Oster <oster%cs.usask.ca@localhost> wrote:
> >On Fri, 7 Jan 2011 15:22:03 -0800
> >buhrow%lothlorien.nfbcal.org@localhost (Brian Buhrow) wrote:
> >
> >> hello Greg. Regarding problem 1, the inability to
> >> reconstruct disks in raid sets with wedges in them, I confess I
> >> don't understand the vnode stuff entirely, but rf_getdisksize() in
> >> rf_netbsdkintf.c looks suspicious to me. I'm a little unclear, but
> >> it looks like it tries to get the disk size a number of ways,
> >> including by checking for a possible wedge on the component. I
> >> wonder if that's what's sending the reference count too high?
> >> -thanks
> >
> >In rf_reconstruct.c:rf_ReconstructInPlace() we have this:
> >
> > retcode = VOP_IOCTL(vp, DIOCGPART, &dpart, FREAD,
> > curlwp->l_cred);
> >
> >I think will fail for wedges... it should be doing:
> >
> > retcode = VOP_IOCTL(vp, DIOCGWEDGEINFO, &dkw, FREAD,
> > l->l_cred);
> >
> >for the wedge case (see rf_getdisksize()). Now: since the kernel
> >prints:
>
> You mean something like this [untested, probably doesn't even
> compile]?
Ya... something like that... except this 'disk_info()'should be merged
with rf_getdisksize(). (rf_getdisksize() just needs to return the
sector size and partition size -- num_blocks can be easily calculated
afterwards.)
Later...
Greg Oster
> Index: rf_reconstruct.c
> ===================================================================
> RCS file: /cvsroot/src/sys/dev/raidframe/rf_reconstruct.c,v
> retrieving revision 1.110
> diff -u -u -r1.110 rf_reconstruct.c
> --- rf_reconstruct.c 19 Nov 2010 06:44:40 -0000 1.110
> +++ rf_reconstruct.c 8 Jan 2011 15:47:48 -0000
> @@ -339,6 +339,45 @@
> rebuild the data "on the spot".
>
> */
> +static int
> +disk_info(struct vnode *vp, uint64_t *partition_size, uint32_t
> *sector_size) +{
> + struct dkwedge_info dkw;
> + struct partinfo dpart;
> + int error;
> + if ((error = VOP_IOCTL(vp, DIOCGWEDGEINFO, &dkw, FREAD,
> + curlwp->l_cred)) == 0) {
> + struct plistref *pref;
> + *partition_size = dkw.dkw_size;
> +
> + if ((error = VOP_IOCTL(vp, DIOCGDISKINFO, &pref,
> FREAD,
> + curlwp->l_cred)) == 0) {
> + prop_dictionary_t disc_dict;
> + if ((error = prop_dictionary_copyin_ioctl(pref,
> FREAD,
> + &disk_dict)) == 0) {
> + prop_dictionary_t geom_dict =
> + prop_dictionary_get(disk_dict,
> "geometry");
> + if (geom_dict != NULL) {
> + if
> (prop_dictionary_get_uint32(geom_dict,
> + "sector-size", sector_size));
> + return 0;
> + else
> + error = ESRCH;
> + }
> + }
> + }
> + /*
> + * Compat, should be removed when everything has been
> + * converted to wedges
> + */
> + if ((error = VOP_IOCTL(vp, DIOCGPART, &dpart, FREAD,
> + curlwp->l_cred)) == 0) {
> + sector_size = dpart.disklab->d_secsize;
> + partition_size = dpart.part->p_size;
> + return 0;
> + }
> + return error;
> +}
>
> int
> rf_ReconstructInPlace(RF_Raid_t *raidPtr, RF_RowCol_t col)
> @@ -348,12 +387,13 @@
> const RF_LayoutSW_t *lp;
> RF_ComponentLabel_t *c_label;
> int numDisksDone = 0, rc;
> - struct partinfo dpart;
> struct pathbuf *pb;
> struct vnode *vp;
> struct vattr va;
> int retcode;
> int ac;
> + uint64_t partition_size;
> + uint32_t sector_size;
>
> lp = raidPtr->Layout.map;
> if (!lp->SubmitReconBuffer) {
> @@ -462,19 +502,18 @@
> return(retcode);
> }
>
> - retcode = VOP_IOCTL(vp, DIOCGPART, &dpart, FREAD,
> curlwp->l_cred);
> - if (retcode) {
> +
> + if ((retcode = disk_info(vp, §or_size,
> &partition_size)) != 0) { RF_LOCK_MUTEX(raidPtr->mutex);
> raidPtr->reconInProgress--;
> RF_UNLOCK_MUTEX(raidPtr->mutex);
> RF_SIGNAL_COND(raidPtr->waitForReconCond);
> - return(retcode);
> + return retcode;
> }
> RF_LOCK_MUTEX(raidPtr->mutex);
> - raidPtr->Disks[col].blockSize =
> dpart.disklab->d_secsize;
> + raidPtr->Disks[col].blockSize = sector_size;
>
> - raidPtr->Disks[col].numBlocks = dpart.part->p_size -
> - rf_protectedSectors;
> + raidPtr->Disks[col].numBlocks = partition_size -
> rf_protectedSectors;
> raidPtr->raid_cinfo[col].ci_vp = vp;
> raidPtr->raid_cinfo[col].ci_dev = va.va_rdev;
Later...
Greg Oster
Home |
Main Index |
Thread Index |
Old Index