summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Sing <jsing@cvs.openbsd.org>2013-01-18 06:49:17 +0000
committerJoel Sing <jsing@cvs.openbsd.org>2013-01-18 06:49:17 +0000
commit402be8551b86623d49c0a730dd9b9d7d2679738a (patch)
tree03c5bd6aa60a9c918433a5a076dc6d5f3d805772
parent91f2ec6e0320d7c82c9f68df096d1f1304914a81 (diff)
Clean up and rework workunit completion for RAID 0. Ensure that we remove
the workunit from the pending queue and restart deferred workunits, even in error conditions. ok krw@
-rw-r--r--sys/dev/softraid_raid0.c56
1 files changed, 23 insertions, 33 deletions
diff --git a/sys/dev/softraid_raid0.c b/sys/dev/softraid_raid0.c
index a94462b02c0..ae0e846fc16 100644
--- a/sys/dev/softraid_raid0.c
+++ b/sys/dev/softraid_raid0.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: softraid_raid0.c,v 1.31 2013/01/17 04:07:39 jsing Exp $ */
+/* $OpenBSD: softraid_raid0.c,v 1.32 2013/01/18 06:49:16 jsing Exp $ */
/*
* Copyright (c) 2008 Marco Peereboom <marco@peereboom.us>
*
@@ -250,10 +250,10 @@ sr_raid0_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;
- int s, pend;
+ int s;
- DNPRINTF(SR_D_INTR, "%s: sr_intr bp %x xs %x\n",
- DEVNAME(sc), bp, xs);
+ DNPRINTF(SR_D_INTR, "%s: %s %s intr bp %x xs %x\n",
+ DEVNAME(sc), sd->sd_meta.ssd_name, sd->sd_name, bp, xs);
s = splbio();
@@ -264,34 +264,29 @@ sr_raid0_intr(struct buf *bp)
wu->swu_ios_failed);
if (wu->swu_ios_complete >= wu->swu_io_count) {
- if (wu->swu_ios_failed)
- goto bad;
-
- xs->error = XS_NOERROR;
-
- pend = 0;
- TAILQ_FOREACH(wup, &sd->sd_wu_pendq, swu_link) {
- if (wu == wup) {
- /* wu on pendq, remove */
- TAILQ_REMOVE(&sd->sd_wu_pendq, wu, swu_link);
- pend = 1;
-
- if (wu->swu_collider) {
- /* restart deferred wu */
- wu->swu_collider->swu_state =
- SR_WU_INPROGRESS;
- TAILQ_REMOVE(&sd->sd_wu_defq,
- wu->swu_collider, swu_link);
- sr_raid_startwu(wu->swu_collider);
- }
+ TAILQ_FOREACH(wup, &sd->sd_wu_pendq, swu_link)
+ if (wup == wu)
break;
- }
- }
- if (!pend)
- printf("%s: wu: %p not on pending queue\n",
+ if (wup == NULL)
+ panic("%s: wu %p not on pending queue",
DEVNAME(sc), wu);
+ TAILQ_REMOVE(&sd->sd_wu_pendq, wu, swu_link);
+
+ if (wu->swu_collider) {
+ /* restart deferred wu */
+ wu->swu_collider->swu_state = SR_WU_INPROGRESS;
+ TAILQ_REMOVE(&sd->sd_wu_defq,
+ wu->swu_collider, swu_link);
+ sr_raid_startwu(wu->swu_collider);
+ }
+
+ if (wu->swu_ios_failed)
+ xs->error = XS_DRIVER_STUFFUP;
+ else
+ xs->error = XS_NOERROR;
+
sr_scsi_done(sd, xs);
if (sd->sd_sync && sd->sd_wu_pending == 0)
@@ -299,9 +294,4 @@ sr_raid0_intr(struct buf *bp)
}
splx(s);
- return;
-bad:
- xs->error = XS_DRIVER_STUFFUP;
- sr_scsi_done(sd, xs);
- splx(s);
}