diff options
author | Thordur I. Bjornsson <thib@cvs.openbsd.org> | 2009-06-17 01:30:33 +0000 |
---|---|---|
committer | Thordur I. Bjornsson <thib@cvs.openbsd.org> | 2009-06-17 01:30:33 +0000 |
commit | 3ee68d23a3466d2029ffb173fb427cbe52bf1c22 (patch) | |
tree | 9836d4f2fe25decc84e3ffcba4a9c31e9b946d7c /sys/dev/ata | |
parent | c51365090d32d88879756762d7720c7761a80060 (diff) |
Revert bufq's. this is inline with the major midlayer reverts that
have been going on. this appears to bring us back to stable state.
lots of testing by oga and ariane and my self.
Diffstat (limited to 'sys/dev/ata')
-rw-r--r-- | sys/dev/ata/wd.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/sys/dev/ata/wd.c b/sys/dev/ata/wd.c index e6d9f45e2f6..b70a68ba61e 100644 --- a/sys/dev/ata/wd.c +++ b/sys/dev/ata/wd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wd.c,v 1.74 2009/06/03 22:09:30 thib Exp $ */ +/* $OpenBSD: wd.c,v 1.75 2009/06/17 01:30:30 thib Exp $ */ /* $NetBSD: wd.c,v 1.193 1999/02/28 17:15:27 explorer Exp $ */ /* @@ -119,7 +119,7 @@ struct wd_softc { /* General disk infos */ struct device sc_dev; struct disk sc_dk; - + struct buf sc_q; /* IDE disk soft states */ struct ata_bio sc_wdc_bio; /* current transfer */ struct buf *sc_bp; /* buf being transferred */ @@ -396,12 +396,13 @@ int wddetach(struct device *self, int flags) { struct wd_softc *sc = (struct wd_softc *)self; - struct buf *bp; + struct buf *dp, *bp; int s, bmaj, cmaj, mn; /* Remove unprocessed buffers from queue */ s = splbio(); - while ((bp = BUFQ_GET(sc->sc_dk.dk_bufq)) != NULL) { + for (dp = &sc->sc_q; (bp = dp->b_actf) != NULL; ) { + dp->b_actf = bp->b_actf; bp->b_error = ENXIO; bp->b_flags |= B_ERROR; biodone(bp); @@ -474,7 +475,7 @@ wdstrategy(struct buf *bp) goto done; /* Queue transfer on drive, activate drive and controller if idle. */ s = splbio(); - BUFQ_ADD(wd->sc_dk.dk_bufq, bp); + disksort(&wd->sc_q, bp); wdstart(wd); splx(s); device_unref(&wd->sc_dev); @@ -498,15 +499,18 @@ void wdstart(void *arg) { struct wd_softc *wd = arg; - struct buf *bp = NULL; + struct buf *dp, *bp = NULL; WDCDEBUG_PRINT(("wdstart %s\n", wd->sc_dev.dv_xname), DEBUG_XFERS); while (wd->openings > 0) { /* Is there a buf for us ? */ - if ((bp = BUFQ_GET(wd->sc_dk.dk_bufq)) == NULL) + dp = &wd->sc_q; + if ((bp = dp->b_actf) == NULL) /* yes, an assign */ return; + dp->b_actf = bp->b_actf; + /* * Make the command. First lock the device */ |