summaryrefslogtreecommitdiffstats
path: root/sys/dev/softraid.c
diff options
context:
space:
mode:
authorjsing <jsing@openbsd.org>2013-01-18 23:19:44 +0000
committerjsing <jsing@openbsd.org>2013-01-18 23:19:44 +0000
commit100e801d1dc40f76e3dae40a36e43674b6727ba3 (patch)
tree1e182199c8d7d43a3887520e2de351ac6584312f /sys/dev/softraid.c
parentsync (diff)
downloadwireguard-openbsd-100e801d1dc40f76e3dae40a36e43674b6727ba3.tar.xz
wireguard-openbsd-100e801d1dc40f76e3dae40a36e43674b6727ba3.zip
The workunit completion needs to run at IPL_BIO, at least for now.
Diffstat (limited to 'sys/dev/softraid.c')
-rw-r--r--sys/dev/softraid.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/sys/dev/softraid.c b/sys/dev/softraid.c
index e9af9a6784b..79fc8acaad6 100644
--- a/sys/dev/softraid.c
+++ b/sys/dev/softraid.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid.c,v 1.287 2013/01/18 09:56:52 jsing Exp $ */
+/* $OpenBSD: softraid.c,v 1.288 2013/01/18 23:19:44 jsing Exp $ */
/*
* Copyright (c) 2007, 2008, 2009 Marco Peereboom <marco@peereboom.us>
* Copyright (c) 2008 Chris Kuethe <ckuethe@openbsd.org>
@@ -2248,6 +2248,9 @@ sr_wu_done_callback(void *arg1, void *arg2)
struct sr_workunit *wu = (struct sr_workunit *)arg2;
struct scsi_xfer *xs = wu->swu_xs;
struct sr_workunit *wup;
+ int s;
+
+ s = splbio();
TAILQ_FOREACH(wup, &sd->sd_wu_pendq, swu_link)
if (wup == wu)
@@ -2276,13 +2279,15 @@ sr_wu_done_callback(void *arg1, void *arg2)
*/
if (sd->sd_scsi_done) {
sd->sd_scsi_done(wu);
- return;
- }
+ } else {
+ sr_scsi_done(sd, xs);
- sr_scsi_done(sd, xs);
+ /* XXX - move to sr_scsi_done? */
+ if (sd->sd_sync && sd->sd_wu_pending == 0)
+ wakeup(sd);
+ }
- if (sd->sd_sync && sd->sd_wu_pending == 0)
- wakeup(sd);
+ splx(s);
}
void