On Sun, Mar 26, 2000 at 01:15:07AM -0800, Alfred Perlstein wrote:
> I'm about to wander down vinum's source again.
>
> With a kernel and vinum module dated approx Tue Feb 29 06:53:56
> PST 2000 everything works fine.
>
> I recently (tonight) I cvsup'd to 5.0 to play with Matt's SMP stuff
> and came across a problem where it seems that 5.0 doesn't get any
> IO down to my vinum striped disks.
>
> I'll get panics, but then rebooting both my old and new kernels+modules
> the vinum volume is "clean" which leads me to belive that somewhere
> writes just aren't making it through to my disks.
>
> If I do a reboot I'll loose something like thousands of buffers
> but yet my vinum drive is "marked clean" on boot without the need
> for fsck.
>
> Anyhow, I just wanted to let you guys know what's going on hopefully
> you'll have a solution faster than I will.
I already fixed that and send it to Greg
--
B.Walter COSMO-Project http://www.cosmo-project.de
[EMAIL PROTECTED] Usergroup [EMAIL PROTECTED]
Index: vinuminterrupt.c
===================================================================
RCS file: /vol/cvs/src/sys/dev/vinum/vinuminterrupt.c,v
retrieving revision 1.27
diff -u -u -r1.27 vinuminterrupt.c
--- vinuminterrupt.c 2000/03/20 11:28:32 1.27
+++ vinuminterrupt.c 2000/03/25 19:14:25
@@ -342,7 +342,8 @@
if ((rqe->b.b_iocmd == BIO_READ) /* this was a read
*/
&&((rqe->flags & XFR_BAD_SUBDISK) == 0)) { /* and we can write this
block */
- rqe->b.b_flags &= ~B_DONE; /* we're writing now */
+ rqe->b.b_flags &= ~B_DONE; /* we're not done */
+ rqe->b.b_iocmd = BIO_WRITE; /* we're writing now */
rqe->b.b_iodone = complete_rqe; /* call us here when done
*/
rqe->flags &= ~XFR_PARITYOP; /* reset flags that
brought us here */
rqe->b.b_data = &bp->b_data[rqe->useroffset << DEV_BSHIFT]; /*
point to the user data */
@@ -381,7 +382,8 @@
}
/* Finally, write the parity block */
rqe = &rqg->rqe[0];
- rqe->b.b_flags &= ~B_DONE; /* we're writing now */
+ rqe->b.b_flags &= ~B_DONE; /* we're not done */
+ rqe->b.b_iocmd = BIO_WRITE; /* writing now */
rqe->b.b_iodone = complete_rqe; /* call us here when done
*/
rqg->flags &= ~XFR_PARITYOP; /* reset flags that
brought us here */
rqe->b.b_bcount = rqe->buflen << DEV_BSHIFT; /* length to write */
Index: vinumraid5.c
===================================================================
RCS file: /vol/cvs/src/sys/dev/vinum/vinumraid5.c,v
retrieving revision 1.7
diff -u -u -r1.7 vinumraid5.c
--- vinumraid5.c 2000/03/20 10:44:13 1.7
+++ vinumraid5.c 2000/03/25 20:40:59
@@ -493,7 +493,7 @@
rqe->driveno = sd->driveno;
if (build_rq_buffer(rqe, plex)) /* build the buffer */
return REQUEST_ENOMEM; /* can't do it */
- rqe->b.b_iocmd == BIO_READ; /* we must read first */
+ rqe->b.b_iocmd = BIO_READ; /* we must read first */
m.sdcount++; /* adjust the subdisk
count */
rqno++; /* and point to the next
request */
}
Index: vinumrequest.c
===================================================================
RCS file: /vol/cvs/src/sys/dev/vinum/vinumrequest.c,v
retrieving revision 1.46
diff -u -u -r1.46 vinumrequest.c
--- vinumrequest.c 2000/03/20 11:28:34 1.46
+++ vinumrequest.c 2000/03/25 23:54:29
@@ -792,11 +792,11 @@
/* Initialize the buf struct */
/* copy these flags from user bp */
bp->b_flags = ubp->b_flags & (B_ORDERED | B_NOCACHE | B_ASYNC);
- bp->b_iocmd = BIO_READ; /* inform us when it's
done */
+ bp->b_iocmd = ubp->b_iocmd;
BUF_LOCKINIT(bp); /* get a lock for the
buffer */
BUF_LOCK(bp, LK_EXCLUSIVE); /* and lock it */
- bp->b_iodone = complete_rqe; /* by calling us here */
+ bp->b_iodone = complete_rqe; /* calling us here when
+done */
/*
* You'd think that we wouldn't need to even
* build the request buffer for a dead subdisk,
@@ -921,6 +921,7 @@
}
bzero(sbp, sizeof(struct sdbuf)); /* start with nothing */
sbp->b.b_flags = bp->b_flags;
+ sbp->b.b_iocmd = bp->b_iocmd;
sbp->b.b_bufsize = bp->b_bufsize; /* buffer size */
sbp->b.b_bcount = bp->b_bcount; /* number of bytes to
transfer */
sbp->b.b_resid = bp->b_resid; /* and amount waiting */
Index: vinumrevive.c
===================================================================
RCS file: /vol/cvs/src/sys/dev/vinum/vinumrevive.c,v
retrieving revision 1.23
diff -u -u -r1.23 vinumrevive.c
--- vinumrevive.c 2000/03/20 10:44:14 1.23
+++ vinumrevive.c 2000/03/25 17:33:57
@@ -213,7 +213,7 @@
"Relaunch revive conflict sd %d: %p\n%s dev %d.%d, offset 0x%x,
length %ld\n",
rq->sdno,
rq,
- rq->bp->b_flags == BIO_READ ? "Read" : "Write",
+ rq->bp->b_iocmd == BIO_READ ? "Read" : "Write",
major(rq->bp->b_dev),
minor(rq->bp->b_dev),
rq->bp->b_blkno,