summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgrog <grog@FreeBSD.org>1999-10-17 23:55:10 +0000
committergrog <grog@FreeBSD.org>1999-10-17 23:55:10 +0000
commita1894992f3a34ed9a115828857bb2e6050aaca93 (patch)
treed358a81d983c6371a19104f55e16de5e3dd95e62
parent12aedb126c2e4077c597628ebac93e134fbdad1c (diff)
downloadFreeBSD-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>
-rw-r--r--sys/dev/vinum/vinumrequest.c8
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;
}
OpenPOWER on IntegriCloud