diff options
author | grog <grog@FreeBSD.org> | 1999-10-17 23:55:10 +0000 |
---|---|---|
committer | grog <grog@FreeBSD.org> | 1999-10-17 23:55:10 +0000 |
commit | a1894992f3a34ed9a115828857bb2e6050aaca93 (patch) | |
tree | d358a81d983c6371a19104f55e16de5e3dd95e62 /sys | |
parent | 12aedb126c2e4077c597628ebac93e134fbdad1c (diff) | |
download | FreeBSD-src-a1894992f3a34ed9a115828857bb2e6050aaca93.zip FreeBSD-src-a1894992f3a34ed9a115828857bb2e6050aaca93.tar.gz |
launch_requests:
Put splbio protection around the main launch loop. We've seen cases where
the bottom half was cutting off the branch on which we're sitting.
Experienced-by: Michael Reifenberger <root@nihil.plaut.de>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/vinum/vinumrequest.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/dev/vinum/vinumrequest.c b/sys/dev/vinum/vinumrequest.c index 346527e..d527845 100644 --- a/sys/dev/vinum/vinumrequest.c +++ b/sys/dev/vinum/vinumrequest.c @@ -383,6 +383,7 @@ launch_requests(struct request *rq, int reviveok) } /* Now fire off the requests */ + s = splbio(); /* lock out the interrupt routines */ for (rqg = rq->rqg; rqg != NULL; rqg = rqg->next) { /* through the whole request chain */ for (rqno = 0; rqno < rqg->count; rqno++) { rqe = &rqg->rqe[rqno]; @@ -419,11 +420,9 @@ launch_requests(struct request *rq, int reviveok) logrq(loginfo_rqe, (union rqinfou) rqe, rq->bp); #endif - if ((rqe->b.b_flags & B_READ) == 0) { - s = splbio(); + if ((rqe->b.b_flags & B_READ) == 0) rqe->b.b_vp->v_numoutput++; /* one more output going */ - splx(s); - } + rqe->b.b_flags |= B_ORDERED; /* stick to the request order */ /* fire off the request */ @@ -431,6 +430,7 @@ launch_requests(struct request *rq, int reviveok) } } } + splx(s); return 0; } |