summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkrw <krw@openbsd.org>2010-01-11 00:44:40 +0000
committerkrw <krw@openbsd.org>2010-01-11 00:44:40 +0000
commitb0c05ea7cc53a88d6cd1a3815335bab77e8bf22e (patch)
tree70c8174ce5ea380b15cc4db5cb6e1e8b556f8d49
parentremove some debug code that snuck in somehow. (diff)
downloadwireguard-openbsd-b0c05ea7cc53a88d6cd1a3815335bab77e8bf22e.tar.xz
wireguard-openbsd-b0c05ea7cc53a88d6cd1a3815335bab77e8bf22e.zip
Be as careful with sd/cd buf queue manipulations as was found necessary for
st's queue manipulations. i.e. ensure b_actb is correctly updated as the queue becomes empty or has an i/o requeued on it. Tested on claudio@'s backup crashing box. ok dlg@ beck@
-rw-r--r--sys/scsi/cd.c6
-rw-r--r--sys/scsi/sd.c6
2 files changed, 10 insertions, 2 deletions
diff --git a/sys/scsi/cd.c b/sys/scsi/cd.c
index 49ab9d6f73b..2ea0cbddcef 100644
--- a/sys/scsi/cd.c
+++ b/sys/scsi/cd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cd.c,v 1.158 2010/01/09 21:12:06 dlg Exp $ */
+/* $OpenBSD: cd.c,v 1.159 2010/01/11 00:44:40 krw Exp $ */
/* $NetBSD: cd.c,v 1.100 1997/04/02 02:29:30 mycroft Exp $ */
/*
@@ -561,6 +561,8 @@ cd_buf_dequeue(struct cd_softc *sc)
bp = sc->sc_buf_queue.b_actf;
if (bp != NULL)
sc->sc_buf_queue.b_actf = bp->b_actf;
+ if (sc->sc_buf_queue.b_actf == NULL)
+ sc->sc_buf_queue.b_actb = &sc->sc_buf_queue.b_actf;
mtx_leave(&sc->sc_queue_mtx);
return (bp);
@@ -572,6 +574,8 @@ cd_buf_requeue(struct cd_softc *sc, struct buf *bp)
mtx_enter(&sc->sc_queue_mtx);
bp->b_actf = sc->sc_buf_queue.b_actf;
sc->sc_buf_queue.b_actf = bp;
+ if (bp->b_actf == NULL)
+ sc->sc_buf_queue.b_actb = &bp->b_actf;
mtx_leave(&sc->sc_queue_mtx);
}
diff --git a/sys/scsi/sd.c b/sys/scsi/sd.c
index 08a398c319c..59ef8378445 100644
--- a/sys/scsi/sd.c
+++ b/sys/scsi/sd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sd.c,v 1.177 2010/01/11 00:14:52 beck Exp $ */
+/* $OpenBSD: sd.c,v 1.178 2010/01/11 00:44:40 krw Exp $ */
/* $NetBSD: sd.c,v 1.111 1997/04/02 02:29:41 mycroft Exp $ */
/*-
@@ -600,6 +600,8 @@ sd_buf_dequeue(struct sd_softc *sc)
bp = sc->sc_buf_queue.b_actf;
if (bp != NULL)
sc->sc_buf_queue.b_actf = bp->b_actf;
+ if (sc->sc_buf_queue.b_actf == NULL)
+ sc->sc_buf_queue.b_actb = &sc->sc_buf_queue.b_actf;
mtx_leave(&sc->sc_buf_mtx);
return (bp);
@@ -611,6 +613,8 @@ sd_buf_requeue(struct sd_softc *sc, struct buf *bp)
mtx_enter(&sc->sc_buf_mtx);
bp->b_actf = sc->sc_buf_queue.b_actf;
sc->sc_buf_queue.b_actf = bp;
+ if (bp->b_actf == NULL)
+ sc->sc_buf_queue.b_actb = &bp->b_actf;
mtx_leave(&sc->sc_buf_mtx);
}