summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/conf/files3
-rw-r--r--sys/ddb/db_command.c17
-rw-r--r--sys/ddb/db_command.h3
-rw-r--r--sys/ddb/db_interface.h6
-rw-r--r--sys/dev/ata/wd.c18
-rw-r--r--sys/dev/flash.c10
-rw-r--r--sys/dev/flashvar.h3
-rw-r--r--sys/dev/vnd.c28
-rw-r--r--sys/kern/kern_bufq.c154
-rw-r--r--sys/kern/subr_disk.c11
-rw-r--r--sys/scsi/cd.c40
-rw-r--r--sys/scsi/cd.h3
-rw-r--r--sys/scsi/sd.c40
-rw-r--r--sys/scsi/sdvar.h3
-rw-r--r--sys/sys/buf.h24
-rw-r--r--sys/sys/disk.h4
16 files changed, 111 insertions, 256 deletions
diff --git a/sys/conf/files b/sys/conf/files
index 84d1f578eb8..28e45437fd7 100644
--- a/sys/conf/files
+++ b/sys/conf/files
@@ -1,4 +1,4 @@
-# $OpenBSD: files,v 1.466 2009/06/16 16:42:41 ariane Exp $
+# $OpenBSD: files,v 1.467 2009/06/17 01:30:30 thib Exp $
# $NetBSD: files,v 1.87 1996/05/19 17:17:50 jonathan Exp $
# @(#)files.newconf 7.5 (Berkeley) 5/10/93
@@ -656,7 +656,6 @@ file kern/exec_subr.c
file kern/init_main.c
file kern/init_sysent.c
file kern/kern_acct.c accounting
-file kern/kern_bufq.c
file kern/kern_clock.c
file kern/kern_descrip.c
file kern/kern_event.c
diff --git a/sys/ddb/db_command.c b/sys/ddb/db_command.c
index e814d5c39e9..de2eff827c3 100644
--- a/sys/ddb/db_command.c
+++ b/sys/ddb/db_command.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: db_command.c,v 1.52 2009/06/03 22:09:30 thib Exp $ */
+/* $OpenBSD: db_command.c,v 1.53 2009/06/17 01:30:30 thib Exp $ */
/* $NetBSD: db_command.c,v 1.20 1996/03/30 22:30:05 christos Exp $ */
/*
@@ -39,7 +39,6 @@
#include <sys/msgbuf.h>
#include <sys/malloc.h>
#include <sys/mount.h>
-#include <sys/buf.h>
#include <uvm/uvm_extern.h>
#include <machine/db_machdep.h> /* type definitions */
@@ -297,19 +296,6 @@ db_buf_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
/*ARGSUSED*/
void
-db_bufq_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
-{
- boolean_t full = FALSE;
-
- if (modif[0] == 'f')
- full = TRUE;
-
- db_bufq_print((struct bufq *) addr, full, db_printf);
-}
-
-
-/*ARGSUSED*/
-void
db_map_print_cmd(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
{
boolean_t full = FALSE;
@@ -472,7 +458,6 @@ struct db_command db_show_cmds[] = {
{ "all", NULL, 0, db_show_all_cmds },
{ "breaks", db_listbreak_cmd, 0, NULL },
{ "buf", db_buf_print_cmd, 0, NULL },
- { "bufq", db_bufq_print_cmd, 0, NULL },
{ "extents", db_extent_print_cmd, 0, NULL },
{ "malloc", db_malloc_print_cmd, 0, NULL },
{ "map", db_map_print_cmd, 0, NULL },
diff --git a/sys/ddb/db_command.h b/sys/ddb/db_command.h
index af92b6a6cbd..867a05d703c 100644
--- a/sys/ddb/db_command.h
+++ b/sys/ddb/db_command.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: db_command.h,v 1.23 2009/06/03 22:09:30 thib Exp $ */
+/* $OpenBSD: db_command.h,v 1.24 2009/06/17 01:30:30 thib Exp $ */
/* $NetBSD: db_command.h,v 1.8 1996/02/05 01:56:55 christos Exp $ */
/*
@@ -39,7 +39,6 @@ int db_cmd_search(char *, struct db_command *, struct db_command **);
void db_cmd_list(struct db_command *);
void db_command(struct db_command **, struct db_command *);
void db_buf_print_cmd(db_expr_t, int, db_expr_t, char *);
-void db_bufq_print_cmd(db_expr_t, int, db_expr_t, char *);
void db_map_print_cmd(db_expr_t, int, db_expr_t, char *);
void db_malloc_print_cmd(db_expr_t, int, db_expr_t, char *);
void db_mount_print_cmd(db_expr_t, int, db_expr_t, char *);
diff --git a/sys/ddb/db_interface.h b/sys/ddb/db_interface.h
index 90b19086b8f..e15ef4bbcdd 100644
--- a/sys/ddb/db_interface.h
+++ b/sys/ddb/db_interface.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: db_interface.h,v 1.11 2009/06/03 22:09:30 thib Exp $ */
+/* $OpenBSD: db_interface.h,v 1.12 2009/06/17 01:30:30 thib Exp $ */
/* $NetBSD: db_interface.h,v 1.1 1996/02/05 01:57:03 christos Exp $ */
/*
@@ -61,10 +61,6 @@ struct nfsreq;
void db_show_all_nfsreqs(db_expr_t, int, db_expr_t, char *);
void db_nfsreq_print(struct nfsreq *, int, int (*)(const char *, ...));
-/* kern/kern_bufq.c */
-struct bufq;
-void db_bufq_print(struct bufq *, int, int (*)(const char *, ...));
-
/* ufs/ffs/ffs_softdep.c */
struct worklist;
void worklist_print(struct worklist *, int, int (*)(const char *, ...));
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
*/
diff --git a/sys/dev/flash.c b/sys/dev/flash.c
index ea87e89ce61..3e04aa4a268 100644
--- a/sys/dev/flash.c
+++ b/sys/dev/flash.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: flash.c,v 1.11 2009/06/04 23:13:21 deraadt Exp $ */
+/* $OpenBSD: flash.c,v 1.12 2009/06/17 01:30:30 thib Exp $ */
/*
* Copyright (c) 2005 Uwe Stuehler <uwe@openbsd.org>
@@ -814,7 +814,7 @@ flashstrategy(struct buf *bp)
/* Queue the transfer. */
s = splbio();
- BUFQ_ADD(sc->sc_dk.dk_bufq, bp);
+ disksort(&sc->sc_q, bp);
flashstart(sc);
splx(s);
device_unref(&sc->sc_dev);
@@ -877,13 +877,15 @@ flashsize(dev_t dev)
void
flashstart(struct flash_softc *sc)
{
- struct buf *bp;
+ struct buf *dp, *bp;
while (1) {
/* Remove the next buffer from the queue or stop. */
- bp = BUFQ_GET(sc->sc_dk.dk_bufq);
+ dp = &sc->sc_q;
+ bp = dp->b_actf;
if (bp == NULL)
return;
+ dp->b_actf = bp->b_actf;
/* Transfer this buffer now. */
_flashstart(sc, bp);
diff --git a/sys/dev/flashvar.h b/sys/dev/flashvar.h
index 0be3d979424..d6b150b4393 100644
--- a/sys/dev/flashvar.h
+++ b/sys/dev/flashvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: flashvar.h,v 1.3 2009/06/03 22:09:30 thib Exp $ */
+/* $OpenBSD: flashvar.h,v 1.4 2009/06/17 01:30:30 thib Exp $ */
/*
* Copyright (c) 2005 Uwe Stuehler <uwe@openbsd.org>
@@ -77,6 +77,7 @@ struct flash_softc {
struct device sc_dev;
/* Disk device information */
struct disk sc_dk;
+ struct buf sc_q;
struct buf *sc_bp;
int sc_flags;
/* Flash controller tag */
diff --git a/sys/dev/vnd.c b/sys/dev/vnd.c
index 8cbda77ef91..43c78122563 100644
--- a/sys/dev/vnd.c
+++ b/sys/dev/vnd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vnd.c,v 1.92 2009/06/04 05:57:27 krw Exp $ */
+/* $OpenBSD: vnd.c,v 1.93 2009/06/17 01:30:30 thib Exp $ */
/* $NetBSD: vnd.c,v 1.26 1996/03/30 23:06:11 christos Exp $ */
/*
@@ -125,7 +125,6 @@ struct pool vndbufpl;
struct vnd_softc {
struct device sc_dev;
struct disk sc_dk;
- int sc_active; /* XXX */
char sc_file[VNDNLEN]; /* file we're covering */
int sc_flags; /* flags */
@@ -135,6 +134,7 @@ struct vnd_softc {
size_t sc_ntracks; /* # of tracks per cylinder */
struct vnode *sc_vp; /* vnode */
struct ucred *sc_cred; /* credentials */
+ struct buf sc_tab; /* transfer queue */
blf_ctx *sc_keyctx; /* key context */
struct rwlock sc_rwlock;
};
@@ -499,8 +499,8 @@ vndstrategy(struct buf *bp)
biodone(bp);
splx(s);
- /* If nothing more is queued, we are done. */
- if (!vnd->sc_active)
+ /* If nothing more is queued, we are done. */
+ if (!vnd->sc_tab.b_active)
return;
/*
@@ -508,8 +508,9 @@ vndstrategy(struct buf *bp)
* routine might queue using same links.
*/
s = splbio();
- bp = BUFQ_GET(vnd->sc_dk.dk_bufq);
- vnd->sc_active--;
+ bp = vnd->sc_tab.b_actf;
+ vnd->sc_tab.b_actf = bp->b_actf;
+ vnd->sc_tab.b_active--;
splx(s);
}
}
@@ -609,8 +610,8 @@ vndstrategy(struct buf *bp)
*/
nbp->vb_buf.b_cylinder = nbp->vb_buf.b_blkno;
s = splbio();
- BUFQ_ADD(vnd->sc_dk.dk_bufq, &nbp->vb_buf);
- vnd->sc_active++;
+ disksort(&vnd->sc_tab, &nbp->vb_buf);
+ vnd->sc_tab.b_active++;
vndstart(vnd);
splx(s);
bn += sz;
@@ -633,9 +634,8 @@ vndstart(struct vnd_softc *vnd)
* Dequeue now since lower level strategy routine might
* queue using same links
*/
- bp = BUFQ_GET(vnd->sc_dk.dk_bufq);
- if (bp == NULL)
- return;
+ bp = vnd->sc_tab.b_actf;
+ vnd->sc_tab.b_actf = bp->b_actf;
DNPRINTF(VDB_IO,
"vndstart(%d): bp %p vp %p blkno %x addr %p cnt %lx\n",
@@ -675,11 +675,11 @@ vndiodone(struct buf *bp)
}
pbp->b_resid -= vbp->vb_buf.b_bcount;
putvndbuf(vbp);
- if (vnd->sc_active) {
+ if (vnd->sc_tab.b_active) {
disk_unbusy(&vnd->sc_dk, (pbp->b_bcount - pbp->b_resid),
(pbp->b_flags & B_READ));
- if (BUFQ_PEEK(vnd->sc_dk.dk_bufq) != NULL)
- vnd->sc_active--;
+ if (!vnd->sc_tab.b_actf)
+ vnd->sc_tab.b_active--;
}
if (pbp->b_resid == 0) {
DNPRINTF(VDB_IO, "vndiodone: pbp %p iodone\n", pbp);
diff --git a/sys/kern/kern_bufq.c b/sys/kern/kern_bufq.c
deleted file mode 100644
index 8af3a312f0f..00000000000
--- a/sys/kern/kern_bufq.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/* $OpenBSD: kern_bufq.c,v 1.2 2009/06/04 19:16:13 thib Exp $ */
-
-/*
- * Copyright (c) 2008, 2009 Thordur I. Bjornsson <thib@openbsd.org>
- * Copyright (c) 2004 Ted Unangst <tedu@openbsd.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/malloc.h>
-#include <sys/pool.h>
-#include <sys/proc.h>
-#include <sys/buf.h>
-#include <sys/errno.h>
-
-#include <sys/disklabel.h>
-
-/* plain old disksort. */
-struct buf *bufq_disksort_get(struct bufq *, int);
-void bufq_disksort_add(struct bufq *, struct buf *);
-int bufq_disksort_init(struct bufq *);
-
-struct bufq *
-bufq_init(int type)
-{
- struct bufq *bq;
- int error;
-
- KASSERT(type = BUFQ_DISKSORT);
-
- bq = malloc(sizeof(*bq), M_DEVBUF, M_NOWAIT|M_ZERO);
- if (bq == NULL)
- return (NULL);
-
- /* For now, only plain old disksort. */
- bq->bufq_type = type;
- bq->bufq_get = bufq_disksort_get;
- bq->bufq_add = bufq_disksort_add;
-
- error = bufq_disksort_init(bq);
- if (error) {
- free(bq, M_DEVBUF);
- return (NULL);
- }
-
- return (bq);
-}
-
-void
-bufq_destroy(struct bufq *bq)
-{
- bufq_drain(bq);
-
- if (bq->bufq_data != NULL)
- free(bq->bufq_data, M_DEVBUF);
-
- free(bq, M_DEVBUF);
-}
-
-void
-bufq_drain(struct bufq *bq)
-{
- struct buf *bp;
- int s;
-
- s = splbio();
- while ((bp = BUFQ_GET(bq)) != NULL) {
- bp->b_error = ENXIO;
- bp->b_flags |= B_ERROR;
- biodone(bp);
- }
- splx(s);
-
-}
-
-void
-bufq_disksort_add(struct bufq *bq, struct buf *bp)
-{
- struct buf *bufq;
-
- splassert(IPL_BIO);
-
- bufq = (struct buf *)bq->bufq_data;
-
- disksort(bufq, bp);
-}
-
-struct buf *
-bufq_disksort_get(struct bufq *bq, int peeking)
-{
- struct buf *bufq, *bp;
-
- splassert(IPL_BIO);
-
- bufq = (struct buf *)bq->bufq_data;
- bp = bufq->b_actf;
- if (bp == NULL)
- return (NULL);
- if (!peeking)
- bufq->b_actf = bp->b_actf;
- return (bp);
-}
-
-int
-bufq_disksort_init(struct bufq *bq)
-{
- int error = 0;
-
- bq->bufq_data = malloc(sizeof(struct buf), M_DEVBUF,
- M_WAITOK|M_ZERO);
-
- if (bq->bufq_data == NULL)
- error = ENOMEM;
-
- return (error);
-}
-
-#ifdef DDB
-#include <machine/db_machdep.h>
-#include <ddb/db_interface.h>
-#include <ddb/db_output.h>
-
-void
-db_bufq_print(struct bufq *bq, int full, int (*pr)(const char *, ...))
-{
- struct buf *bp, *dp;
-
-
- (*pr)(" type %i\n bufq_add %p bufq_get %p bufq_data %p",
- bq->bufq_type, bq->bufq_add, bq->bufq_get, bq->bufq_data);
-
- if (full) {
- printf("bufs on queue:\n");
- bp = (struct buf *)bq->bufq_data;
- while ((dp = bp->b_actf) != NULL) {
- printf("%p\n", bp);
- bp = dp;
- }
- }
-}
-
-#endif
diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c
index d33a152d299..e1dbaa310b6 100644
--- a/sys/kern/subr_disk.c
+++ b/sys/kern/subr_disk.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: subr_disk.c,v 1.94 2009/06/14 00:09:40 deraadt Exp $ */
+/* $OpenBSD: subr_disk.c,v 1.95 2009/06/17 01:30:30 thib Exp $ */
/* $NetBSD: subr_disk.c,v 1.17 1996/03/16 23:17:08 christos Exp $ */
/*
@@ -768,10 +768,6 @@ disk_construct(struct disk *diskp, char *lockname)
rw_init(&diskp->dk_lock, "dklk");
mtx_init(&diskp->dk_mtx, IPL_BIO);
- diskp->dk_bufq = bufq_init(BUFQ_DEFAULT);
- if (diskp->dk_bufq == NULL)
- return (1);
-
diskp->dk_flags |= DKF_CONSTRUCTED;
return (0);
@@ -785,8 +781,7 @@ disk_attach(struct disk *diskp)
{
if (!ISSET(diskp->dk_flags, DKF_CONSTRUCTED))
- if (disk_construct(diskp, diskp->dk_name))
- panic("disk_attach: can't construct disk");
+ disk_construct(diskp, diskp->dk_name);
/*
* Allocate and initialize the disklabel structures. Note that
@@ -829,8 +824,6 @@ disk_detach(struct disk *diskp)
*/
free(diskp->dk_label, M_DEVBUF);
- bufq_destroy(diskp->dk_bufq);
-
/*
* Remove from the disklist.
*/
diff --git a/sys/scsi/cd.c b/sys/scsi/cd.c
index 619b06aad28..64b8e7adc8a 100644
--- a/sys/scsi/cd.c
+++ b/sys/scsi/cd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cd.c,v 1.147 2009/06/03 22:09:30 thib Exp $ */
+/* $OpenBSD: cd.c,v 1.148 2009/06/17 01:30:30 thib Exp $ */
/* $NetBSD: cd.c,v 1.100 1997/04/02 02:29:30 mycroft Exp $ */
/*
@@ -98,6 +98,7 @@ void cdrestart(void *);
void cdminphys(struct buf *);
void cdgetdisklabel(dev_t, struct cd_softc *, struct disklabel *, int);
void cddone(struct scsi_xfer *);
+void cd_kill_buffers(struct cd_softc *);
int cd_setchan(struct cd_softc *, int, int, int, int, int);
int cd_getvol(struct cd_softc *cd, struct ioc_vol *, int);
int cd_setvol(struct cd_softc *, const struct ioc_vol *, int);
@@ -247,7 +248,7 @@ cddetach(struct device *self, int flags)
struct cd_softc *cd = (struct cd_softc *)self;
int bmaj, cmaj, mn;
- bufq_drain(cd->sc_dk.dk_bufq);
+ cd_kill_buffers(cd);
/* Locate the lowest minor number to be detached. */
mn = DISKMINOR(self->dv_unit, 0);
@@ -498,7 +499,7 @@ cdstrategy(struct buf *bp)
/*
* Place it in the queue of disk activities for this disk
*/
- BUFQ_ADD(cd->sc_dk.dk_bufq, bp);
+ disksort(&cd->buf_queue, bp);
/*
* Tell the device to get going on the transfer if it's
@@ -545,7 +546,8 @@ cdstart(void *v)
{
struct cd_softc *cd = v;
struct scsi_link *sc_link = cd->sc_link;
- struct buf *bp = NULL;
+ struct buf *bp = 0;
+ struct buf *dp;
struct scsi_rw_big cmd_big;
struct scsi_rw cmd_small;
struct scsi_generic *cmdp;
@@ -570,9 +572,13 @@ cdstart(void *v)
return;
}
- /* See if there is a buf with work for us to do..*/
- if ((bp = BUFQ_GET(cd->sc_dk.dk_bufq)) == NULL)
+ /*
+ * See if there is a buf with work for us to do..
+ */
+ dp = &cd->buf_queue;
+ if ((bp = dp->b_actf) == NULL) /* yes, an assign */
return;
+ dp->b_actf = bp->b_actf;
/*
* If the device has become invalid, abort all the
@@ -649,7 +655,7 @@ cdstart(void *v)
/*
* The device can't start another i/o. Try again later.
*/
- BUFQ_ADD(cd->sc_dk.dk_bufq, bp);
+ dp->b_actf = bp;
disk_unbusy(&cd->sc_dk, 0, 0);
timeout_add(&cd->sc_timeout, 1);
return;
@@ -1947,6 +1953,26 @@ cd_interpret_sense(struct scsi_xfer *xs)
return (EJUSTRETURN); /* use generic handler in scsi_base */
}
+/*
+ * Remove unprocessed buffers from queue.
+ */
+void
+cd_kill_buffers(struct cd_softc *cd)
+{
+ struct buf *dp, *bp;
+ int s;
+
+ s = splbio();
+ for (dp = &cd->buf_queue; (bp = dp->b_actf) != NULL; ) {
+ dp->b_actf = bp->b_actf;
+
+ bp->b_error = ENXIO;
+ bp->b_flags |= B_ERROR;
+ biodone(bp);
+ }
+ splx(s);
+}
+
#if defined(__macppc__)
int
cd_eject(void)
diff --git a/sys/scsi/cd.h b/sys/scsi/cd.h
index e5ef94bcea5..e65f750f7c7 100644
--- a/sys/scsi/cd.h
+++ b/sys/scsi/cd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: cd.h,v 1.20 2009/06/03 22:09:30 thib Exp $ */
+/* $OpenBSD: cd.h,v 1.21 2009/06/17 01:30:30 thib Exp $ */
/* $NetBSD: scsi_cd.h,v 1.6 1996/03/19 03:06:39 mycroft Exp $ */
/*
@@ -293,6 +293,7 @@ struct cd_softc {
#ifdef CDDA
struct cd_parms orig_params; /* filled in when CD-DA mode starts */
#endif
+ struct buf buf_queue;
struct timeout sc_timeout;
void *sc_cdpwrhook; /* our power hook */
};
diff --git a/sys/scsi/sd.c b/sys/scsi/sd.c
index 27e9ee7e65e..8f9d44c4e6d 100644
--- a/sys/scsi/sd.c
+++ b/sys/scsi/sd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sd.c,v 1.155 2009/06/03 22:09:30 thib Exp $ */
+/* $OpenBSD: sd.c,v 1.156 2009/06/17 01:30:30 thib Exp $ */
/* $NetBSD: sd.c,v 1.111 1997/04/02 02:29:41 mycroft Exp $ */
/*-
@@ -90,6 +90,7 @@ int sd_reassign_blocks(struct sd_softc *, u_long);
int sd_interpret_sense(struct scsi_xfer *);
int sd_get_parms(struct sd_softc *, struct disk_parms *, int);
void sd_flush(struct sd_softc *, int);
+void sd_kill_buffers(struct sd_softc *);
void viscpy(u_char *, u_char *, int);
@@ -267,7 +268,7 @@ sdactivate(struct device *self, enum devact act)
case DVACT_DEACTIVATE:
sd->flags |= SDF_DYING;
- bufq_drain(sd->sc_dk.dk_bufq);
+ sd_kill_buffers(sd);
break;
}
@@ -281,7 +282,7 @@ sddetach(struct device *self, int flags)
struct sd_softc *sd = (struct sd_softc *)self;
int bmaj, cmaj, mn;
- bufq_drain(sd->sc_dk.dk_bufq);
+ sd_kill_buffers(sd);
/* Locate the lowest minor number to be detached. */
mn = DISKMINOR(self->dv_unit, 0);
@@ -549,8 +550,10 @@ sdstrategy(struct buf *bp)
s = splbio();
- /* Place it in the queue of disk activities for this disk */
- BUFQ_ADD(sd->sc_dk.dk_bufq, bp);
+ /*
+ * Place it in the queue of disk activities for this disk
+ */
+ disksort(&sd->buf_queue, bp);
/*
* Tell the device to get going on the transfer if it's
@@ -599,6 +602,7 @@ sdstart(void *v)
struct sd_softc *sd = (struct sd_softc *)v;
struct scsi_link *sc_link = sd->sc_link;
struct buf *bp = 0;
+ struct buf *dp;
struct scsi_rw_big cmd_big;
struct scsi_rw_12 cmd_12;
struct scsi_rw_16 cmd_16;
@@ -633,8 +637,10 @@ sdstart(void *v)
/*
* See if there is a buf with work for us to do..
*/
- if ((bp = BUFQ_GET(sd->sc_dk.dk_bufq)) == NULL)
+ dp = &sd->buf_queue;
+ if ((bp = dp->b_actf) == NULL) /* yes, an assign */
return;
+ dp->b_actf = bp->b_actf;
/*
* If the device has become invalid, abort all the
@@ -741,7 +747,7 @@ sdstart(void *v)
/*
* The device can't start another i/o. Try again later.
*/
- BUFQ_ADD(sd->sc_dk.dk_bufq, bp);
+ dp->b_actf = bp;
disk_unbusy(&sd->sc_dk, 0, 0);
timeout_add(&sd->sc_timeout, 1);
return;
@@ -1489,3 +1495,23 @@ sd_flush(struct sd_softc *sd, int flags)
} else
sd->flags &= ~SDF_DIRTY;
}
+
+/*
+ * Remove unprocessed buffers from queue.
+ */
+void
+sd_kill_buffers(struct sd_softc *sd)
+{
+ struct buf *dp, *bp;
+ int s;
+
+ s = splbio();
+ for (dp = &sd->buf_queue; (bp = dp->b_actf) != NULL; ) {
+ dp->b_actf = bp->b_actf;
+
+ bp->b_error = ENXIO;
+ bp->b_flags |= B_ERROR;
+ biodone(bp);
+ }
+ splx(s);
+}
diff --git a/sys/scsi/sdvar.h b/sys/scsi/sdvar.h
index 2498b15edac..a6cd1541c02 100644
--- a/sys/scsi/sdvar.h
+++ b/sys/scsi/sdvar.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sdvar.h,v 1.17 2009/06/03 22:09:30 thib Exp $ */
+/* $OpenBSD: sdvar.h,v 1.18 2009/06/17 01:30:32 thib Exp $ */
/* $NetBSD: sdvar.h,v 1.7 1998/08/17 00:49:03 mycroft Exp $ */
/*-
@@ -69,6 +69,7 @@ struct sd_softc {
u_long rot_rate; /* rotational rate, in RPM */
daddr64_t disksize; /* total number sectors */
} params;
+ struct buf buf_queue;
void *sc_sdhook; /* our shutdown hook */
struct timeout sc_timeout;
};
diff --git a/sys/sys/buf.h b/sys/sys/buf.h
index 522a320711f..ded9e03f319 100644
--- a/sys/sys/buf.h
+++ b/sys/sys/buf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: buf.h,v 1.65 2009/06/15 17:01:26 beck Exp $ */
+/* $OpenBSD: buf.h,v 1.66 2009/06/17 01:30:32 thib Exp $ */
/* $NetBSD: buf.h,v 1.25 1997/04/09 21:12:17 mycroft Exp $ */
/*
@@ -106,28 +106,6 @@ struct buf {
struct workhead b_dep; /* List of filesystem dependencies. */
};
-/* BUFQ: flexible buffer queue routines. */
-#define BUFQ_DISKSORT 1
-#define BUFQ_DEFAULT BUFQ_DISKSORT
-
-struct bufq {
- struct buf *(*bufq_get)(struct bufq *, int);
- void (*bufq_add)(struct bufq *, struct buf *);
- void *bufq_data;
- int bufq_type;
-};
-
-TAILQ_HEAD(bufq_tailq, buf);
-
-#define BUFQ_ADD(_bufq, _bp) (_bufq)->bufq_add(_bufq, _bp)
-#define BUFQ_GET(_bufq) (_bufq)->bufq_get(_bufq, 0)
-#define BUFQ_PEEK(_bufq) (_bufq)->bufq_get(_bufq, 1)
-
-struct bufq *bufq_init(int);
-void bufq_destroy(struct bufq *);
-void bufq_drain(struct bufq *);
-
-
/*
* For portability with historic industry practice, the cylinder number has
* to be maintained in the `b_resid' field.
diff --git a/sys/sys/disk.h b/sys/sys/disk.h
index d044367c5af..9005ace6f7f 100644
--- a/sys/sys/disk.h
+++ b/sys/sys/disk.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: disk.h,v 1.19 2009/06/03 22:09:30 thib Exp $ */
+/* $OpenBSD: disk.h,v 1.20 2009/06/17 01:30:32 thib Exp $ */
/* $NetBSD: disk.h,v 1.11 1996/04/28 20:22:50 thorpej Exp $ */
/*
@@ -54,7 +54,6 @@
#include <sys/mutex.h>
struct buf;
-struct bufq;
struct disklabel;
#define DS_DISKNAMELEN 16
@@ -102,7 +101,6 @@ struct disk {
int dk_byteshift; /* shift to convert bytes to blks */
struct dkdriver *dk_driver; /* pointer to driver */
- struct bufq *dk_bufq;
/*
* Disk label information. Storage for the in-core disk label