To deal with an issue jordan found and to be able to boot softraid the
code needs to start using the vnode api.
Please test. I am particularly interested in rebuilds and hotspares
that initiate a rebuild.
Index: softraid.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid.c,v
retrieving revision 1.169
diff -u -p -r1.169 softraid.c
--- softraid.c 31 Jul 2009 16:05:25 -0000 1.169
+++ softraid.c 4 Aug 2009 23:12:37 -0000
@@ -273,7 +273,7 @@ int
sr_meta_probe(struct sr_discipline *sd, dev_t *dt, int no_chunk)
{
struct sr_softc *sc = sd->sd_sc;
- struct bdevsw *bdsw;
+ struct vnode *vn;
struct sr_chunk *ch_entry, *ch_prev = NULL;
struct sr_chunk_head *cl;
char devname[32];
@@ -305,23 +305,28 @@ sr_meta_probe(struct sr_discipline *sd,
continue;
} else {
sr_meta_getdevname(sc, dev, devname, sizeof(devname));
- bdsw = bdevsw_lookup(dev);
+ if (bdevvp(dev, &vn)) {
+ printf("%s:, sr_meta_probe: can't allocate "
+ "vnode\n");
+ goto unwind;
+ }
/*
* XXX leaving dev open for now; move this to attach
* and figure out the open/close dance for unwind.
*/
- error = bdsw->d_open(dev, FREAD | FWRITE, S_IFBLK,
- curproc);
+ error = VOP_OPEN(vn, FREAD | FWRITE, NOCRED, 0);
if (error) {
DNPRINTF(SR_D_META,"%s: sr_meta_probe can't "
"open %s\n", DEVNAME(sc), devname);
/* dev isn't open but will be closed anyway */
+ vput(vn);
goto unwind;
}
strlcpy(ch_entry->src_devname, devname,
- sizeof(ch_entry->src_devname));
+ sizeof(ch_entry->src_devname));
+ ch_entry->src_vn = vn;
}
/* determine if this is a device we understand */
@@ -385,12 +390,12 @@ sr_meta_rw(struct sr_discipline *sd, dev
DNPRINTF(SR_D_META, "%s: sr_meta_rw(0x%x, %p, %d, %llu 0x%x)\n",
DEVNAME(sc), dev, md, sz, ofs, flags);
+ bzero(&b, sizeof(b));
+
if (md == NULL) {
printf("%s: read invalid metadata pointer\n", DEVNAME(sc));
goto done;
}
-
- bzero(&b, sizeof(b));
b.b_flags = flags | B_PHYS;
b.b_blkno = ofs;
b.b_bcount = sz;
@@ -400,10 +405,16 @@ sr_meta_rw(struct sr_discipline *sd, dev
b.b_error = 0;
b.b_proc = curproc;
b.b_dev = dev;
- b.b_vp = NULL;
b.b_iodone = NULL;
+ if (bdevvp(dev, &b.b_vp)) {
+ printf("%s:, sr_meta_native_bootprobe: can't allocate vnode\n");
+ goto done;
+ }
+ if ((b.b_flags & B_READ) == 0)
+ b.b_vp->v_numoutput++;
+
LIST_INIT(&b.b_dep);
- bdevsw_lookup(b.b_dev)->d_strategy(&b);
+ VOP_STRATEGY(&b);
biowait(&b);
if (b.b_flags & B_ERROR) {
@@ -413,6 +424,9 @@ sr_meta_rw(struct sr_discipline *sd, dev
}
rv = 0;
done:
+ if (b.b_vp)
+ vput(b.b_vp);
+
return (rv);
}
@@ -837,7 +851,7 @@ int
sr_meta_native_bootprobe(struct sr_softc *sc, struct device *dv,
struct sr_metadata_list_head *mlh)
{
- struct bdevsw *bdsw;
+ struct vnode *vn;
struct disklabel label;
struct sr_metadata *md;
struct sr_discipline *fake_sd;
@@ -853,40 +867,38 @@ sr_meta_native_bootprobe(struct sr_softc
if (majdev == -1)
goto done;
dev = MAKEDISKDEV(majdev, dv->dv_unit, RAW_PART);
- bdsw = &bdevsw[majdev];
-
- /*
- * The devices are being opened with S_IFCHR instead of
- * S_IFBLK so that the SCSI mid-layer does not whine when
- * media is not inserted in certain devices like zip drives
- * and such.
- */
+ if (bdevvp(dev, &vn)) {
+ printf("%s:, sr_meta_native_bootprobe: can't allocate vnode\n");
+ goto done;
+ }
/* open device */
- error = (*bdsw->d_open)(dev, FREAD, S_IFCHR, curproc);
+ error = VOP_OPEN(vn, FREAD, NOCRED, 0);
if (error) {
DNPRINTF(SR_D_META, "%s: sr_meta_native_bootprobe open "
"failed\n", DEVNAME(sc));
+ vput(vn);
goto done;
}
/* get disklabel */
- error = (*bdsw->d_ioctl)(dev, DIOCGDINFO, (void *)&label, FREAD,
- curproc);
+ error = VOP_IOCTL(vn, DIOCGDINFO, (caddr_t)&label, FREAD, NOCRED, 0);
if (error) {
DNPRINTF(SR_D_META, "%s: sr_meta_native_bootprobe ioctl "
"failed\n", DEVNAME(sc));
- error = (*bdsw->d_close)(dev, FREAD, S_IFCHR, curproc);
+ VOP_CLOSE(vn, FREAD | FWRITE, NOCRED, 0);
+ vrele(vn);
goto done;
}
/* we are done, close device */
- error = (*bdsw->d_close)(dev, FREAD, S_IFCHR, curproc);
+ error = VOP_CLOSE(vn, FREAD | FWRITE, NOCRED, 0);
if (error) {
DNPRINTF(SR_D_META, "%s: sr_meta_native_bootprobe close "
"failed\n", DEVNAME(sc));
goto done;
}
+ vrele(vn);
md = malloc(SR_META_SIZE * 512, M_DEVBUF, M_ZERO);
if (md == NULL) {
@@ -911,23 +923,35 @@ sr_meta_native_bootprobe(struct sr_softc
/* open partition */
devr = MAKEDISKDEV(majdev, dv->dv_unit, i);
- error = (*bdsw->d_open)(devr, FREAD, S_IFCHR, curproc);
+ if (bdevvp(devr, &vn)) {
+ printf("%s:, sr_meta_native_bootprobe: can't allocate "
+ "vnode for partition\n");
+ goto done;
+ }
+ error = VOP_OPEN(vn, FREAD, NOCRED, 0);
if (error) {
DNPRINTF(SR_D_META, "%s: sr_meta_native_bootprobe "
"open failed, partition %d\n",
DEVNAME(sc), i);
+ vput(vn);
continue;
}
if (sr_meta_native_read(fake_sd, devr, md, NULL)) {
printf("%s: native bootprobe could not read native "
"metadata\n", DEVNAME(sc));
+ VOP_CLOSE(vn, FREAD, NOCRED, 0);
+ vrele(vn);
continue;
}
/* are we a softraid partition? */
- if (md->ssdi.ssd_magic != SR_MAGIC)
+ if (md->ssdi.ssd_magic != SR_MAGIC) {
+ VOP_CLOSE(vn, FREAD, NOCRED, 0);
+ vrele(vn);
continue;
+ }
+
sr_meta_getdevname(sc, devr, devname, sizeof(devname));
if (sr_meta_validate(fake_sd, devr, md, NULL) == 0) {
if (md->ssdi.ssd_flags & BIOC_SCNOAUTOASSEMBLE) {
@@ -940,18 +964,20 @@ sr_meta_native_bootprobe(struct sr_softc
bcopy(md, &mle->sml_metadata,
SR_META_SIZE * 512);
mle->sml_mm = devr;
+ mle->sml_vn = vn;
SLIST_INSERT_HEAD(mlh, mle, sml_link);
rv = SR_META_CLAIMED;
}
}
/* we are done, close partition */
- error = (*bdsw->d_close)(devr, FREAD, S_IFCHR, curproc);
+ error = VOP_CLOSE(vn, FREAD, NOCRED, 0);
if (error) {
DNPRINTF(SR_D_META, "%s: sr_meta_native_bootprobe "
"close failed\n", DEVNAME(sc));
continue;
}
+ vrele(vn);
}
free(fake_sd, M_DEVBUF);
@@ -1121,6 +1147,7 @@ sr_boot_assembly(struct sr_softc *sc)
mle = SLIST_FIRST(&vol->sml);
sr_meta_getdevname(sc, mle->sml_mm, devname, sizeof(devname));
hotspare->src_dev_mm = mle->sml_mm;
+ hotspare->src_vn = mle->sml_vn;
strlcpy(hotspare->src_devname, devname,
sizeof(hotspare->src_devname));
hotspare->src_size = metadata->ssdi.ssd_size;
@@ -1252,19 +1279,16 @@ sr_meta_native_probe(struct sr_softc *sc
char *devname;
int error, part;
daddr64_t size;
- struct bdevsw *bdsw;
- dev_t dev;
DNPRINTF(SR_D_META, "%s: sr_meta_native_probe(%s)\n",
DEVNAME(sc), ch_entry->src_devname);
- dev = ch_entry->src_dev_mm;
devname = ch_entry->src_devname;
- bdsw = bdevsw_lookup(dev);
- part = DISKPART(dev);
+ part = DISKPART(ch_entry->src_dev_mm);
/* get disklabel */
- error = bdsw->d_ioctl(dev, DIOCGDINFO, (void *)&label, FREAD, curproc);
+ error = VOP_IOCTL(ch_entry->src_vn, DIOCGDINFO, (caddr_t)&label, FREAD,
+ NOCRED, 0);
if (error) {
DNPRINTF(SR_D_META, "%s: %s can't obtain disklabel\n",
DEVNAME(sc), devname);
@@ -2186,7 +2210,7 @@ sr_hotspare(struct sr_softc *sc, dev_t d
struct sr_chunk *hotspare, *chunk, *last;
struct sr_uuid uuid;
struct disklabel label;
- struct bdevsw *bdsw;
+ struct vnode *vn;
daddr64_t size;
char devname[32];
int rv = EINVAL;
@@ -2213,20 +2237,25 @@ sr_hotspare(struct sr_softc *sc, dev_t d
/* XXX - See if there is an existing degraded volume... */
/* Open device. */
- bdsw = bdevsw_lookup(dev);
- if (bdsw->d_open(dev, FREAD | FWRITE, S_IFBLK, curproc)) {
+ if (bdevvp(dev, &vn)) {
+ printf("%s:, sr_meta_native_bootprobe: can't allocate vnode\n");
+ goto done;
+ }
+ if (VOP_OPEN(vn, FREAD | FWRITE, NOCRED, 0)) {
DNPRINTF(SR_D_META,"%s: sr_hotspare cannot open %s\n",
DEVNAME(sc), devname);
+ vput(vn);
goto fail;
}
open = 1; /* close dev on error */
/* Get partition details. */
part = DISKPART(dev);
- if ((*bdsw->d_ioctl)(dev, DIOCGDINFO, (void *)&label, FREAD,
- curproc)) {
+ if (VOP_IOCTL(vn, DIOCGDINFO, (caddr_t)&label, FREAD, NOCRED, 0)) {
DNPRINTF(SR_D_META, "%s: sr_hotspare ioctl failed\n",
DEVNAME(sc));
+ VOP_CLOSE(vn, FREAD | FWRITE, NOCRED, 0);
+ vrele(vn);
goto fail;
}
if (label.d_partitions[part].p_fstype != FS_RAID) {
@@ -2248,6 +2277,7 @@ sr_hotspare(struct sr_softc *sc, dev_t d
hotspare = malloc(sizeof(struct sr_chunk), M_DEVBUF, M_WAITOK | M_ZERO);
hotspare->src_dev_mm = dev;
+ hotspare->src_vn = vn;
strlcpy(hotspare->src_devname, devname, sizeof(hm->scmi.scm_devname));
hotspare->src_size = size;
@@ -2334,8 +2364,10 @@ done:
free(sd, M_DEVBUF);
if (sm)
free(sm, M_DEVBUF);
- if (open)
- (*bdsw->d_close)(dev, FREAD | FWRITE, S_IFCHR, curproc);
+ if (open) {
+ VOP_CLOSE(vn, FREAD | FWRITE, NOCRED, 0);
+ vrele(vn);
+ }
return (rv);
}
@@ -2452,7 +2484,7 @@ sr_rebuild_init(struct sr_discipline *sd
int rv = EINVAL, part;
int c, found, open = 0;
char devname[32];
- struct bdevsw *bdsw;
+ struct vnode *vn;
daddr64_t size, csize;
struct disklabel label;
struct sr_meta_chunk *old, *new;
@@ -2500,19 +2532,22 @@ sr_rebuild_init(struct sr_discipline *sd
/* populate meta entry */
sr_meta_getdevname(sc, dev, devname, sizeof(devname));
- bdsw = bdevsw_lookup(dev);
+ if (bdevvp(dev, &vn)) {
+ printf("%s:, sr_ioctl_setstate: can't allocate vnode\n");
+ goto done;
+ }
- if (bdsw->d_open(dev, FREAD | FWRITE, S_IFBLK, curproc)) {
+ if (VOP_OPEN(vn, FREAD | FWRITE, NOCRED, 0)) {
DNPRINTF(SR_D_META,"%s: sr_ioctl_setstate can't "
"open %s\n", DEVNAME(sc), devname);
+ vput(vn);
goto done;
}
open = 1; /* close dev on error */
/* get partition */
part = DISKPART(dev);
- if ((*bdsw->d_ioctl)(dev, DIOCGDINFO, (void *)&label, FREAD,
- curproc)) {
+ if (VOP_IOCTL(vn, DIOCGDINFO, (caddr_t)&label, FREAD, NOCRED, 0)) {
DNPRINTF(SR_D_META, "%s: sr_ioctl_setstate ioctl failed\n",
DEVNAME(sc));
goto done;
@@ -2548,6 +2583,7 @@ sr_rebuild_init(struct sr_discipline *sd
/* recreate metadata */
open = 0; /* leave dev open from here on out */
sd->sd_vol.sv_chunks[found]->src_dev_mm = dev;
+ sd->sd_vol.sv_chunks[found]->src_vn = vn;
new->scmi.scm_volid = old->scmi.scm_volid;
new->scmi.scm_chunk_id = found;
strlcpy(new->scmi.scm_devname, devname,
@@ -2574,8 +2610,10 @@ sr_rebuild_init(struct sr_discipline *sd
rv = 0;
done:
- if (open)
- (*bdsw->d_close)(dev, FREAD | FWRITE, S_IFCHR, curproc);
+ if (open) {
+ VOP_CLOSE(vn, FREAD | FWRITE, NOCRED, 0);
+ vrele(vn);
+ }
return (rv);
}
@@ -3049,10 +3087,10 @@ sr_chunks_unwind(struct sr_softc *sc, st
dev = ch_entry->src_dev_mm;
DNPRINTF(SR_D_IOCTL, "%s: sr_chunks_unwind closing: %s\n",
DEVNAME(sc), ch_entry->src_devname);
- if (dev != NODEV)
- bdevsw_lookup(dev)->d_close(dev, FWRITE, S_IFBLK,
- curproc);
-
+ if (dev != NODEV) {
+ VOP_CLOSE(ch_entry->src_vn, FREAD | FWRITE, NOCRED, 0);
+ vrele(ch_entry->src_vn);
+ }
free(ch_entry, M_DEVBUF);
}
SLIST_INIT(cl);
@@ -3362,7 +3400,7 @@ sr_raid_startwu(struct sr_workunit *wu)
/* start all individual ios */
TAILQ_FOREACH(ccb, &wu->swu_ccb, ccb_link) {
- bdevsw_lookup(ccb->ccb_buf.b_dev)->d_strategy(&ccb->ccb_buf);
+ VOP_STRATEGY(&ccb->ccb_buf);
}
}
Index: softraid_aoe.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid_aoe.c,v
retrieving revision 1.8
diff -u -p -r1.8 softraid_aoe.c
--- softraid_aoe.c 24 Jul 2009 14:13:28 -0000 1.8
+++ softraid_aoe.c 4 Aug 2009 23:12:37 -0000
@@ -745,10 +745,13 @@ resleep:
buf.b_error = 0;
buf.b_proc = curproc;
buf.b_dev = sd->sd_vol.sv_chunks[0]->src_dev_mm;
+ buf.b_vp = sd->sd_vol.sv_chunks[0]->src_vn;
+ if ((buf.b_flags & B_READ) == 0)
+ buf.b_vp->v_numoutput++;
LIST_INIT(&buf.b_dep);
s = splbio();
- bdevsw_lookup(buf.b_dev)->d_strategy(&buf);
+ VOP_STRATEGY(&buf);
biowait(&buf);
splx(s);
@@ -808,10 +811,13 @@ resleep:
buf.b_error = 0;
buf.b_proc = curproc;
buf.b_dev = sd->sd_vol.sv_chunks[0]->src_dev_mm;
+ buf.b_vp = sd->sd_vol.sv_chunks[0]->src_vn;
+ if ((buf.b_flags & B_READ) == 0)
+ buf.b_vp->v_numoutput++;
LIST_INIT(&buf.b_dep);
s = splbio();
- bdevsw_lookup(buf.b_dev)->d_strategy(&buf);
+ VOP_STRATEGY(&buf);
biowait(&buf);
splx(s);
Index: softraid_crypto.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid_crypto.c,v
retrieving revision 1.39
diff -u -p -r1.39 softraid_crypto.c
--- softraid_crypto.c 11 Jun 2009 19:42:59 -0000 1.39
+++ softraid_crypto.c 4 Aug 2009 23:12:37 -0000
@@ -597,7 +597,9 @@ sr_crypto_rw2(struct sr_workunit *wu, st
ccb->ccb_wu = wu;
ccb->ccb_target = 0;
ccb->ccb_buf.b_dev = sd->sd_vol.sv_chunks[0]->src_dev_mm;
- ccb->ccb_buf.b_vp = NULL;
+ ccb->ccb_buf.b_vp = sd->sd_vol.sv_chunks[0]->src_vn;
+ if ((ccb->ccb_buf.b_flags & B_READ) == 0)
+ ccb->ccb_buf.b_vp->v_numoutput++;
LIST_INIT(&ccb->ccb_buf.b_dep);
Index: softraid_raid0.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid_raid0.c,v
retrieving revision 1.15
diff -u -p -r1.15 softraid_raid0.c
--- softraid_raid0.c 2 Jun 2009 21:23:11 -0000 1.15
+++ softraid_raid0.c 4 Aug 2009 23:12:37 -0000
@@ -303,7 +303,9 @@ sr_raid0_rw(struct sr_workunit *wu)
B_READ : B_WRITE;
ccb->ccb_target = chunk;
ccb->ccb_buf.b_dev = sd->sd_vol.sv_chunks[chunk]->src_dev_mm;
- ccb->ccb_buf.b_vp = NULL;
+ ccb->ccb_buf.b_vp = sd->sd_vol.sv_chunks[chunk]->src_vn;
+ if ((ccb->ccb_buf.b_flags & B_READ) == 0)
+ ccb->ccb_buf.b_vp->v_numoutput++;
LIST_INIT(&ccb->ccb_buf.b_dep);
TAILQ_INSERT_TAIL(&wu->swu_ccb, ccb, ccb_link);
Index: softraid_raid1.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid_raid1.c,v
retrieving revision 1.18
diff -u -p -r1.18 softraid_raid1.c
--- softraid_raid1.c 12 Jul 2009 16:34:58 -0000 1.18
+++ softraid_raid1.c 4 Aug 2009 23:12:37 -0000
@@ -339,6 +339,7 @@ sr_raid1_rw(struct sr_workunit *wu)
struct sr_discipline *sd = wu->swu_dis;
struct scsi_xfer *xs = wu->swu_xs;
struct sr_ccb *ccb;
+ struct buf *b;
struct sr_chunk *scp;
int ios, x, i, s, rt;
daddr64_t blk;
@@ -365,23 +366,24 @@ sr_raid1_rw(struct sr_workunit *wu)
sd->sd_meta->ssd_devname);
goto bad;
}
+ b = &ccb->ccb_buf;
if (xs->flags & SCSI_POLL) {
- ccb->ccb_buf.b_flags = 0;
- ccb->ccb_buf.b_iodone = NULL;
+ b->b_flags = 0;
+ b->b_iodone = NULL;
} else {
- ccb->ccb_buf.b_flags = B_CALL;
- ccb->ccb_buf.b_iodone = sr_raid1_intr;
+ b->b_flags = B_CALL;
+ b->b_iodone = sr_raid1_intr;
}
- ccb->ccb_buf.b_flags |= B_PHYS;
- ccb->ccb_buf.b_blkno = blk;
- ccb->ccb_buf.b_bcount = xs->datalen;
- ccb->ccb_buf.b_bufsize = xs->datalen;
- ccb->ccb_buf.b_resid = xs->datalen;
- ccb->ccb_buf.b_data = xs->data;
- ccb->ccb_buf.b_error = 0;
- ccb->ccb_buf.b_proc = curproc;
+ b->b_flags |= B_PHYS;
+ b->b_blkno = blk;
+ b->b_bcount = xs->datalen;
+ b->b_bufsize = xs->datalen;
+ b->b_resid = xs->datalen;
+ b->b_data = xs->data;
+ b->b_error = 0;
+ b->b_proc = curproc;
ccb->ccb_wu = wu;
if (xs->flags & SCSI_DATA_IN) {
@@ -394,7 +396,7 @@ ragain:
switch (scp->src_meta.scm_status) {
case BIOC_SDONLINE:
case BIOC_SDSCRUB:
- ccb->ccb_buf.b_flags |= B_READ;
+ b->b_flags |= B_READ;
break;
case BIOC_SDOFFLINE:
@@ -419,7 +421,7 @@ ragain:
case BIOC_SDONLINE:
case BIOC_SDSCRUB:
case BIOC_SDREBUILD:
- ccb->ccb_buf.b_flags |= B_WRITE;
+ b->b_flags |= B_WRITE;
break;
case BIOC_SDHOTSPARE: /* should never happen */
@@ -434,18 +436,20 @@ ragain:
}
ccb->ccb_target = x;
- ccb->ccb_buf.b_dev = sd->sd_vol.sv_chunks[x]->src_dev_mm;
- ccb->ccb_buf.b_vp = NULL;
+ b->b_dev = sd->sd_vol.sv_chunks[x]->src_dev_mm;
+ b->b_vp = sd->sd_vol.sv_chunks[x]->src_vn;
+ if ((b->b_flags & B_READ) == 0)
+ b->b_vp->v_numoutput++;
- LIST_INIT(&ccb->ccb_buf.b_dep);
+ LIST_INIT(&b->b_dep);
TAILQ_INSERT_TAIL(&wu->swu_ccb, ccb, ccb_link);
DNPRINTF(SR_D_DIS, "%s: %s: sr_raid1: b_bcount: %d "
"b_blkno: %x b_flags 0x%0x b_data %p\n",
DEVNAME(sd->sd_sc), sd->sd_meta->ssd_devname,
- ccb->ccb_buf.b_bcount, ccb->ccb_buf.b_blkno,
- ccb->ccb_buf.b_flags, ccb->ccb_buf.b_data);
+ b->b_bcount, b->b_blkno,
+ b->b_flags, b->b_data);
}
s = splbio();
@@ -483,21 +487,22 @@ sr_raid1_intr(struct buf *bp)
struct sr_discipline *sd = wu->swu_dis;
struct scsi_xfer *xs = wu->swu_xs;
struct sr_softc *sc = sd->sd_sc;
+ struct buf *b;
int s, pend;
DNPRINTF(SR_D_INTR, "%s: sr_intr bp %x xs %x\n",
DEVNAME(sc), bp, xs);
+ b = &ccb->ccb_buf;
DNPRINTF(SR_D_INTR, "%s: sr_intr: b_bcount: %d b_resid: %d"
" b_flags: 0x%0x block: %lld target: %d\n", DEVNAME(sc),
- ccb->ccb_buf.b_bcount, ccb->ccb_buf.b_resid, ccb->ccb_buf.b_flags,
- ccb->ccb_buf.b_blkno, ccb->ccb_target);
+ b->b_bcount, b->b_resid, b->b_flags, b->b_blkno, ccb->ccb_target);
s = splbio();
- if (ccb->ccb_buf.b_flags & B_ERROR) {
+ if (b->b_flags & B_ERROR) {
DNPRINTF(SR_D_INTR, "%s: i/o error on block %lld target: %d\n",
- DEVNAME(sc), ccb->ccb_buf.b_blkno, ccb->ccb_target);
+ DEVNAME(sc), b->b_blkno, ccb->ccb_target);
wu->swu_ios_failed++;
ccb->ccb_state = SR_CCB_FAILED;
if (ccb->ccb_target != -1)
@@ -520,7 +525,7 @@ sr_raid1_intr(struct buf *bp)
if (wu->swu_ios_failed == wu->swu_ios_complete) {
if (xs->flags & SCSI_DATA_IN) {
printf("%s: retrying read on block %lld\n",
- DEVNAME(sc), ccb->ccb_buf.b_blkno);
+ DEVNAME(sc), b->b_blkno);
sr_ccb_put(ccb);
TAILQ_INIT(&wu->swu_ccb);
wu->swu_state = SR_WU_RESTART;
@@ -530,8 +535,7 @@ sr_raid1_intr(struct buf *bp)
goto retry;
} else {
printf("%s: permanently fail write on block "
- "%lld\n", DEVNAME(sc),
- ccb->ccb_buf.b_blkno);
+ "%lld\n", DEVNAME(sc), b->b_blkno);
xs->error = XS_DRIVER_STUFFUP;
goto bad;
}
Index: softraid_raid6.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid_raid6.c,v
retrieving revision 1.2
diff -u -p -r1.2 softraid_raid6.c
--- softraid_raid6.c 4 Aug 2009 20:17:14 -0000 1.2
+++ softraid_raid6.c 4 Aug 2009 23:12:37 -0000
@@ -394,6 +394,8 @@ sr_raid6_rw(struct sr_workunit *wu)
datalen = xs->datalen;
lbaoffs = blk << DEV_BSHIFT;
+ pbuf = NULL;
+ qbuf = NULL;
if (xs->flags & SCSI_DATA_OUT)
/* create write workunit */
if ((wu_w = sr_wu_get(sd, 0)) == NULL) {
@@ -529,6 +531,16 @@ sr_raid6_rw(struct sr_workunit *wu)
}
/* XXX: bag of fail */
+#if 0
+ if (wu_w == NULL)
+ if ((wu_w = sr_wu_get(sd, 0)) == NULL)
+ goto bad;
+ wu->swu_flags |= SR_WUF_FAIL;
+ if (sr_raid6_addio(wu_w, 0, 0, 0, pbuf, 0,
+ SR_CCBF_FREEBUF, NULL, data,
+ gf_inv(gf_pow[chunk])))
+ goto bad;
+#else
wu->swu_flags |= SR_WUF_FAIL;
sr_raid_startwu(wu);
while ((wu->swu_flags & SR_WUF_FAILIOCOMP) ==
0) {
@@ -542,17 +554,10 @@ sr_raid6_rw(struct sr_workunit *wu)
sr_wu_put(wu);
scsi_done(xs);
return(0);
-
+#endif
break;
case SR_FAILX+SR_FAILY:
/* Dx, Dy failed */
-
- /* cheat.. get other failed drive */
- for (fchunk=0; fchunk<no_chunk+2; fchunk++) {
- if (fchunk != chunk && fchunk != qchunk
&& fchunk != pchunk)
- break;
- }
-
printf("Disk %llx & %llx offline, "
"regenerating Dx+Dy\n", chunk, fchunk);
qbuf = sr_get_block(sd, length);
@@ -593,6 +598,20 @@ sr_raid6_rw(struct sr_workunit *wu)
/* XXX: bag of fail */
+#if 0
+ if (wu_w == NULL)
+ if ((wu_w = sr_wu_get(sd, 0)) == NULL)
+ goto bad;
+ wu->swu_flags |= SR_WUF_FAIL;
+ if (sr_raid6_addio(wu_w, 0, 0, 0, pbuf, 0,
+ SR_CCBF_FREEBUF, NULL, data,
+ gf_inv(gf_pow[255+chunk-fchunk] ^ 1)))
+ goto bad;
+ if (sr_raid6_addio(wu_w, 0, 0, 0, qbuf, 0,
+ SR_CCBF_FREEBUF, NULL, data,
+ gf_inv(gf_pow[chunk] ^ gf_pow[fchunk])))
+ goto bad;
+#else
wu->swu_flags |= SR_WUF_FAIL;
sr_raid_startwu(wu);
while ((wu->swu_flags & SR_WUF_FAILIOCOMP) ==
0) {
@@ -611,7 +630,7 @@ sr_raid6_rw(struct sr_workunit *wu)
sr_wu_put(wu);
scsi_done(xs);
return(0);
-
+#endif
break;
default:
printf("%s: is offline, can't read\n",
@@ -719,6 +738,10 @@ queued:
return (0);
bad:
/* wu is unwound by sr_wu_put */
+ if (pbuf)
+ sr_put_block(sd, pbuf);
+ if (qbuf)
+ sr_put_block(sd, qbuf);
if (wu_w)
sr_wu_put(wu_w);
return (1);
@@ -952,7 +975,9 @@ sr_raid6_addio(struct sr_workunit *wu, i
ccb->ccb_buf.b_error = 0;
ccb->ccb_buf.b_proc = curproc;
ccb->ccb_buf.b_dev = sd->sd_vol.sv_chunks[dsk]->src_dev_mm;
- ccb->ccb_buf.b_vp = NULL;
+ ccb->ccb_buf.b_vp = sd->sd_vol.sv_chunks[dsk]->src_vn;
+ if ((ccb->ccb_buf.b_flags & B_READ) == 0)
+ ccb->ccb_buf.b_vp->v_numoutput++;
ccb->ccb_wu = wu;
ccb->ccb_target = dsk;
@@ -1003,6 +1028,11 @@ sr_raid6_xorq(void *q, void *d, int len,
/* Have to do this a byte at a time */
while (len--)
qbuf[len] ^= gf_mul(data[len], gn);
+
+ /* Fast mode:
+ * gpow = gf_pow + index;
+ * while (len--) qbuf[len] ^= gpow[gf_log[data[len]]];
+ */
}
/* Create GF256 log/pow tables: polynomial = 0x11D */
Index: softraid_raidp.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid_raidp.c,v
retrieving revision 1.9
diff -u -p -r1.9 softraid_raidp.c
--- softraid_raidp.c 4 Aug 2009 20:17:14 -0000 1.9
+++ softraid_raidp.c 4 Aug 2009 23:12:38 -0000
@@ -729,7 +729,9 @@ sr_raidp_addio(struct sr_workunit *wu, i
ccb->ccb_buf.b_error = 0;
ccb->ccb_buf.b_proc = curproc;
ccb->ccb_buf.b_dev = sd->sd_vol.sv_chunks[dsk]->src_dev_mm;
- ccb->ccb_buf.b_vp = NULL;
+ ccb->ccb_buf.b_vp = sd->sd_vol.sv_chunks[dsk]->src_vn;
+ if ((ccb->ccb_buf.b_flags & B_READ) == 0)
+ ccb->ccb_buf.b_vp->v_numoutput++;
ccb->ccb_wu = wu;
ccb->ccb_target = dsk;
Index: softraidvar.h
===================================================================
RCS file: /cvs/src/sys/dev/softraidvar.h,v
retrieving revision 1.80
diff -u -p -r1.80 softraidvar.h
--- softraidvar.h 23 Jul 2009 15:15:25 -0000 1.80
+++ softraidvar.h 4 Aug 2009 23:12:38 -0000
@@ -20,6 +20,7 @@
#define SOFTRAIDVAR_H
#include <crypto/md5.h>
+#include <sys/vnode.h>
#define SR_UUID_MAX 16
struct sr_uuid {
@@ -341,6 +342,7 @@ struct sr_aoe {
struct sr_metadata_list {
u_int8_t sml_metadata[SR_META_SIZE * 512];
dev_t sml_mm;
+ struct vnode *sml_vn;
u_int32_t sml_chunk_id;
int sml_used;
@@ -369,6 +371,7 @@ struct sr_chunk {
/* runtime data */
dev_t src_dev_mm; /* major/minor */
+ struct vnode *src_vn; /* vnode */
/* helper members before metadata makes it onto the chunk */
int src_meta_ondisk;/* set when meta is on disk */