[issue750] vinum patch2 to test - (was Re: vinum problems)
Matthew Dillon
dillon at apollo.backplane.com
Mon Jul 30 01:08:03 PDT 2007
I have added infrastructure to the kernel to allow vinum to obtain
vnodes representing devices by name early in the boot sequence.
If you have a vinum ROOT (I think that's just two people), please
update to the latest HEAD and then apply this patch to vinum and
see if it works.
NOTE: Testing vinum with the 'vn' device will not work with this patch,
because the 'vn' device is not considered a managed disk device yet.
But testing with ccd, or a vn-backed ccd, will work. I hope to resolve
the issue soon.
Ultimately the new synthesized VFS will become our devfs. Right now
it can't be mounted and works strictly with managed disk devices only.
Index: dev/raid/vinum/vinuminterrupt.c
===================================================================
RCS file: /cvs/src/sys/dev/raid/vinum/vinuminterrupt.c,v
retrieving revision 1.11
diff -u -p -r1.11 vinuminterrupt.c
--- dev/raid/vinum/vinuminterrupt.c 10 Sep 2006 01:26:36 -0000 1.11
+++ dev/raid/vinum/vinuminterrupt.c 29 Jul 2007 22:25:02 -0000
@@ -305,8 +305,6 @@ struct request *rq; /* point
struct rqgroup *rqg; /* and to the request group */
struct rqelement *prqe; /* point to the parity block */
struct drive *drive; /* drive to access */
- cdev_t dev;
-
rqg = rqe->rqg; /* and to our request group */
rq = rqg->rq; /* point to our request */
ubio = rq->bio; /* user's buffer header */
@@ -393,10 +391,9 @@ rqe->b.b_data = &ubio->bio_buf->b_
rqe->b.b_bcount = rqe->datalen << DEV_BSHIFT; /* length to write */
rqe->b.b_resid = rqe->b.b_bcount; /* nothing transferred */
rqe->b.b_bio1.bio_offset += (off_t)rqe->dataoffset << DEV_BSHIFT; /* point to the correct block */
- dev = DRIVE[rqe->driveno].dev;
- rqe->b.b_bio1.bio_driver_info = dev;
- rqg->active++; /* another active request */
drive = &DRIVE[rqe->driveno]; /* drive to access */
+ rqe->b.b_bio1.bio_driver_info = drive->dev;
+ rqg->active++; /* another active request */
/* We can't sleep here, so we just increment the counters. */
drive->active++;
@@ -408,10 +405,9 @@ vinum_conf.maxactive = vinum_conf.act
#if VINUMDEBUG
if (debug & DEBUG_ADDRESSES)
log(LOG_DEBUG,
- " %s dev %d.%d, sd %d, offset 0x%llx, devoffset 0x%llx, length %d\n",
+ " %s dev %s, sd %d, offset 0x%llx, devoffset 0x%llx, length %d\n",
(rqe->b.b_cmd == BUF_CMD_READ) ? "Read" : "Write",
- major(dev),
- minor(dev),
+ drive->devicename,
rqe->sdno,
rqe->b.b_bio1.bio_offset - ((off_t)SD[rqe->sdno].driveoffset << DEV_BSHIFT),
rqe->b.b_bio1.bio_offset,
@@ -419,7 +415,7 @@ rqe->b.b_bcount);
if (debug & DEBUG_LASTREQS)
logrq(loginfo_raid5_data, (union rqinfou) rqe, ubio);
#endif
- dev_dstrategy(dev, &rqe->b.b_bio1);
+ vn_strategy(drive->vp, &rqe->b.b_bio1);
}
}
}
@@ -431,10 +427,9 @@ rqe->b.b_bio1.bio_done = complete_rq
rqg->flags &= ~XFR_PARITYOP; /* reset flags that brought us here */
rqe->b.b_bcount = rqe->buflen << DEV_BSHIFT; /* length to write */
rqe->b.b_resid = rqe->b.b_bcount; /* nothing transferred */
- dev = DRIVE[rqe->driveno].dev;
- rqe->b.b_bio1.bio_driver_info = dev;
- rqg->active++; /* another active request */
drive = &DRIVE[rqe->driveno]; /* drive to access */
+ rqe->b.b_bio1.bio_driver_info = drive->dev;
+ rqg->active++; /* another active request */
/* We can't sleep here, so we just increment the counters. */
drive->active++;
@@ -447,10 +442,9 @@
#if VINUMDEBUG
if (debug & DEBUG_ADDRESSES)
log(LOG_DEBUG,
- " %s dev %d.%d, sd %d, offset 0x%llx, devoffset 0x%llx, length %d\n",
+ " %s dev %s, sd %d, offset 0x%llx, devoffset 0x%llx, length %d\n",
(rqe->b.b_cmd == BUF_CMD_READ) ? "Read" : "Write",
- major(dev),
- minor(dev),
+ device->devicename,
rqe->sdno,
rqe->b.b_bio1.bio_offset - ((off_t)SD[rqe->sdno].driveoffset << DEV_BSHIFT),
rqe->b.b_bio1.bio_offset,
@@ -458,7 +452,7 @@ rqe->b.b_bcount);
if (debug & DEBUG_LASTREQS)
logrq(loginfo_raid5_parity, (union rqinfou) rqe, ubio);
#endif
- dev_dstrategy(dev, &rqe->b.b_bio1);
+ vn_strategy(drive->vp, &rqe->b.b_bio1);
}
/* Local Variables: */
Index: dev/raid/vinum/vinumio.c
===================================================================
RCS file: /cvs/src/sys/dev/raid/vinum/vinumio.c,v
retrieving revision 1.27
diff -u -p -r1.27 vinumio.c
--- dev/raid/vinum/vinumio.c 16 Jul 2007 21:31:06 -0000 1.27
+++ dev/raid/vinum/vinumio.c 30 Jul 2007 07:19:04 -0000
@@ -41,6 +41,7 @@
#include "vinumhdr.h"
#include "request.h"
#include <vm/vm_zone.h>
+#include <sys/nlookup.h>
static char *sappend(char *txt, char *s);
static int drivecmp(const void *va, const void *vb);
@@ -52,113 +53,70 @@ */
int
open_drive(struct drive *drive, struct proc *p, int verbose)
{
- int devmajor; /* major devs for disk device */
- int devminor; /* minor devs for disk device */
- int unit;
- int slice;
- int part;
- char *dname;
-
- if (bcmp(drive->devicename, "/dev/", 5)) /* device name doesn't start with /dev */
- return ENOENT; /* give up */
- if (drive->flags & VF_OPEN) /* open already, */
- return EBUSY; /* don't do it again */
+#if 0
+ struct nlookupdata nd;
+#endif
+ int error;
+ const char *dname;
/*
- * Yes, Bruce, I know this is horrible, but we
- * don't have a root file system when we first
- * try to do this. If you can come up with a
- * better solution, I'd really like it. I'm
- * just putting it in now to add ammuntion to
- * moving the system to devfs.
+ * Fail if already open
*/
- dname = &drive->devicename[5];
- drive->dev = NULL; /* no device yet */
-
- /* Find the device */
- if (bcmp(dname, "ad", 2) == 0) /* IDE disk */
- devmajor = 116;
- else if (bcmp(dname, "wd", 2) == 0) /* IDE disk */
- devmajor = 3;
- else if (bcmp(dname, "da", 2) == 0)
- devmajor = 13;
- else if (bcmp(dname, "vn", 2) == 0)
- devmajor = 43;
- else if (bcmp(dname, "md", 2) == 0)
- devmajor = 95;
- else if (bcmp(dname, "vkd", 3) == 0) {
- devmajor = 97;
- dname += 1;
- } else if (bcmp(dname, "amrd", 4) == 0) {
- devmajor = 133;
- dname += 2;
- } else if (bcmp(dname, "mlxd", 4) == 0) {
- devmajor = 131;
- dname += 2;
- } else if (bcmp(dname, "idad", 4) == 0) {
- devmajor = 109;
- dname += 2;
- } else if (bcmp(dname, "twed", 4) == 0) { /* 3ware raid */
- devmajor = 147;
- dname += 2;
- } else if (bcmp(dname, "ar", 2) == 0) {
- devmajor = 157;
- } else
- return ENODEV;
- dname += 2; /* point past */
+ if (drive->flags & VF_OPEN)
+ return EBUSY;
+ dname = drive->devicename;
/*
- * Found the device. Require the form
- * <unit>s<slice><partition>
+ * Severe hack to disallow opening partition 'c'
*/
- if (*dname < '0' || *dname > '9')
- return(ENODEV);
- unit = strtol(dname, &dname, 10);
- if (*dname != 's')
- return(ENODEV);
- ++dname;
+ if (strncmp(dname, "/dev", 4) == 0 && dname[strlen(dname)-1] == 'c')
+ return ENOTTY;
+#if 0
/*
- * Convert slice number to value suitable for
- * dkmakeminor(). 0->0, 1->2, 2->3, etc.
+ * Open via filesystem (future)
*/
- slice = strtol(dname, &dname, 10);
- if (slice > 0)
- ++slice;
-
- if (*dname < 'a' || *dname > 'p')
- return ENODEV;
-
- part = *dname - 'a';
- devminor = dkmakeminor(unit, slice, part);
-
+ error = nlookup_init(&nd, drive->devicename, UIO_SYSSPACE, NLC_FOLLOW);
+ if (error)
+ return error;
+ error = vn_open(&nd, NULL, FREAD|FWRITE, 0);
+ drive->vp = nd.nl_open_vp;
+ nd.nl_open_vp = NULL;
+ nlookup_done(&nd);
+#else
/*
- * Disallow partition c
+ * Open via synthesized vnode backed by disk device
*/
- if (part == 2)
- return ENOTTY; /* not buying that */
-
- drive->dev = udev2dev(makeudev(devmajor, devminor), 0);
-
- if (drive->dev == NULL)
- return ENODEV;
+ error = vn_opendisk(drive->devicename, FREAD|FWRITE, &drive->vp);
+ if (error)
+ return error;
+#endif
- drive->dev->si_iosize_max = DFLTPHYS;
- if (dev_is_good(drive->dev))
- drive->lasterror = dev_dopen(drive->dev, FWRITE, 0, proc0.p_ucred);
- else
- drive->lasterror = ENOENT;
+ if (error == 0 && drive->vp == NULL)
+ error = ENODEV;
- if (drive->lasterror != 0) { /* failed */
- drive->state = drive_down; /* just force it down */
- if (verbose)
+ /*
+ * A huge amount of pollution all over vinum requires that our low
+ * level drive be a device.
+ */
+ if (error == 0 && drive->vp->v_type != VCHR) {
+ vn_close(drive->vp, FREAD|FWRITE);
+ drive->vp = NULL;
+ error = ENODEV;
+ }
+ if (error) {
+ drive->state = drive_down;
+ if (verbose) {
log(LOG_WARNING,
"vinum open_drive %s: failed with error %d\n",
- drive->devicename, drive->lasterror);
- } else
- drive->flags |= VF_OPEN; /* we're open now */
-
- return drive->lasterror;
+ drive->devicename, error);
+ }
+ } else {
+ drive->dev = drive->vp->v_rdev;
+ drive->flags |= VF_OPEN;
+ }
+ drive->lasterror = error;
+ return error;
}
/*
@@ -224,12 +182,9 @@ drive->lasterror = open_drive(drive,
if (drive->lasterror)
return drive->lasterror;
- drive->lasterror = dev_dioctl(
- drive->dev,
- DIOCGPART,
- (caddr_t) & drive->partinfo,
- FREAD,
- proc0.p_ucred);
+ drive->lasterror = VOP_IOCTL(drive->vp, DIOCGPART,
+ (caddr_t)&drive->partinfo,
+ FREAD|FWRITE, proc0.p_ucred);
if (drive->lasterror) {
if (verbose)
log(LOG_WARNING,
@@ -277,8 +232,11 @@ * If we can't access the drive, we
* the queues, which spec_close() will try to
* do. Get rid of them here first.
*/
- drive->lasterror = dev_dclose(drive->dev, 0, 0);
- drive->flags &= ~VF_OPEN; /* no longer open */
+ if (drive->vp) {
+ drive->lasterror = vn_close(drive->vp, FREAD|FWRITE);
+ drive->vp = NULL;
+ }
+ drive->flags &= ~VF_OPEN;
}
/*
@@ -337,7 +295,7 @@ bp->b_bio1.bio_offset = offset; /
saveaddr = bp->b_data;
bp->b_data = buf;
bp->b_bcount = len;
- dev_dstrategy(drive->dev, &bp->b_bio1);
+ vn_strategy(drive->vp, &bp->b_bio1);
error = biowait(bp);
bp->b_data = saveaddr;
bp->b_flags |= B_INVAL | B_AGE;
@@ -673,11 +631,9 @@ && (drive->state != drive_referenc
wlabel_on = 1; /* enable writing the label */
error = 0;
#if 1
- error = dev_dioctl(drive->dev, /* make the label writeable */
- DIOCWLABEL,
- (caddr_t) & wlabel_on,
- FWRITE,
- proc0.p_ucred);
+ error = VOP_IOCTL(drive->vp, DIOCWLABEL,
+ (caddr_t)&wlabel_on,
+ FREAD|FWRITE, proc0.p_ucred);
#endif
if (error == 0)
error = write_drive(drive, (char *) vhdr, VINUMHEADERLEN, VINUM_LABEL_OFFSET);
@@ -687,12 +643,11 @@ if (error == 0)
error = write_drive(drive, config, MAXCONFIG, VINUM_CONFIG_OFFSET + MAXCONFIG); /* second copy */
wlabel_on = 0; /* enable writing the label */
#if 1
- if (error == 0)
- error = dev_dioctl(drive->dev, /* make the label non-writeable again */
- DIOCWLABEL,
- (caddr_t) & wlabel_on,
- FWRITE,
- proc0.p_ucred);
+ if (error == 0) {
+ error = VOP_IOCTL(drive->vp, DIOCWLABEL,
+ (caddr_t)&wlabel_on,
+ FREAD|FWRITE, proc0.p_ucred);
+ }
#endif
unlockdrive(drive);
if (error) {
Index: dev/raid/vinum/vinumrequest.c
===================================================================
RCS file: /cvs/src/sys/dev/raid/vinum/vinumrequest.c,v
retrieving revision 1.19
diff -u -p -r1.19 vinumrequest.c
--- dev/raid/vinum/vinumrequest.c 7 Jun 2007 22:58:38 -0000 1.19
+++ dev/raid/vinum/vinumrequest.c 29 Jul 2007 22:32:45 -0000
@@ -436,6 +436,7 @@ if (debug & DEBUG_LASTREQS)
logrq(loginfo_rqe, (union rqinfou) rqe, rq->bio);
#endif
/* fire off the request */
+ /* XXX this had better not be a low level drive */
dev_dstrategy(dev, &rqe->b.b_bio1);
}
}
@@ -899,7 +900,6 @@ /* Perform I/O on a subdisk */
sdio(struct bio *bio)
{
cdev_t dev;
- cdev_t sddev;
struct sd *sd;
struct sdbuf *sbp;
daddr_t endoffset;
@@ -945,7 +945,6 @@ bp->b_flags |= B_ERROR;
biodone(bio);
return;
}
- sddev = DRIVE[sd->driveno].dev; /* device */
bzero(sbp, sizeof(struct sdbuf)); /* start with nothing */
sbp->b.b_cmd = bp->b_cmd;
sbp->b.b_bcount = bp->b_bcount; /* number of bytes to transfer */
@@ -975,10 +974,9 @@ }
#if VINUMDEBUG
if (debug & DEBUG_ADDRESSES)
log(LOG_DEBUG,
- " %s dev %d.%d, sd %d, offset 0x%llx, devoffset 0x%llx, length %d\n",
+ " %s dev %s, sd %d, offset 0x%llx, devoffset 0x%llx, length %d\n",
(sbp->b.b_cmd == BUF_CMD_READ) ? "Read" : "Write",
- major(sddev),
- minor(sddev),
+ drive->devicename,
sbp->sdno,
sbp->b.b_bio1.bio_offset - ((off_t)SD[sbp->sdno].driveoffset << DEV_BSHIFT),
sbp->b.b_bio1.bio_offset,
@@ -989,7 +987,7 @@ #if VINUMDEBUG
if (debug & DEBUG_LASTREQS)
logrq(loginfo_sdiol, (union rqinfou) &sbp->b.b_bio1, &sbp->b.b_bio1);
#endif
- dev_dstrategy(sddev, &sbp->b.b_bio1);
+ vn_strategy(drive->vp, &sbp->b.b_bio1);
crit_exit();
}
Index: dev/raid/vinum/vinumvar.h
===================================================================
RCS file: /cvs/src/sys/dev/raid/vinum/vinumvar.h,v
retrieving revision 1.11
diff -u -p -r1.11 vinumvar.h
--- dev/raid/vinum/vinumvar.h 7 Jun 2007 22:58:38 -0000 1.11
+++ dev/raid/vinum/vinumvar.h 29 Jul 2007 23:20:58 -0000
@@ -433,8 +433,10 @@ } *freelist;
struct partinfo partinfo; /* partition information */
/* XXX kludge until we get this struct cleaned up */
#if _KERNEL
- cdev_t dev; /* device information */
+ struct vnode *vp;
+ struct cdev *dev;
#else
+ char vp [sizeof (int *)];
char dev [sizeof (int *)];
#endif
#ifdef VINUMDEBUG
More information about the Bugs
mailing list