summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorjakllsch <jakllsch@NetBSD.org>2009-12-27 01:37:17 +0000
committerjakllsch <jakllsch@NetBSD.org>2009-12-27 01:37:17 +0000
commita70f4ed59678efda8c09d58fa2c4ef3187e694e9 (patch)
tree8e54a3fb1464e33f8ddd557421ae438b33ebeadf /sys/dev
parent3fab09205c67addd0feb0bcb61df7dd27e9c5737 (diff)
Implement and use a dkminphys() that calls the parent device's minphys
function with b_dev temporarily adjusted to the parent device's dev_t. Fixes PR/37390.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/dkwedge/dk.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/sys/dev/dkwedge/dk.c b/sys/dev/dkwedge/dk.c
index ef0a7731cf5..ce981a908b1 100644
--- a/sys/dev/dkwedge/dk.c
+++ b/sys/dev/dkwedge/dk.c
@@ -1,4 +1,4 @@
-/* $NetBSD: dk.c,v 1.51 2009/09/08 21:14:33 pooka Exp $ */
+/* $NetBSD: dk.c,v 1.52 2009/12/27 01:37:17 jakllsch Exp $ */
/*-
* Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.51 2009/09/08 21:14:33 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.52 2009/12/27 01:37:17 jakllsch Exp $");
#ifdef _KERNEL_OPT
#include "opt_dkwedge.h"
@@ -95,6 +95,7 @@ struct dkwedge_softc {
static void dkstart(struct dkwedge_softc *);
static void dkiodone(struct buf *);
static void dkrestart(void *);
+static void dkminphys(struct buf *);
static int dklastclose(struct dkwedge_softc *);
static int dkwedge_detach(device_t, int);
@@ -1242,6 +1243,23 @@ dkrestart(void *v)
}
/*
+ * dkminphys:
+ *
+ * Call parent's minphys function.
+ */
+static void
+dkminphys(struct buf *bp)
+{
+ struct dkwedge_softc *sc = dkwedge_lookup(bp->b_dev);
+ dev_t dev;
+
+ dev = bp->b_dev;
+ bp->b_dev = sc->sc_pdev;
+ (*sc->sc_parent->dk_driver->d_minphys)(bp);
+ bp->b_dev = dev;
+}
+
+/*
* dkread: [devsw entry point]
*
* Read from a wedge.
@@ -1254,8 +1272,7 @@ dkread(dev_t dev, struct uio *uio, int flags)
if (sc->sc_state != DKW_STATE_RUNNING)
return (ENXIO);
- return (physio(dkstrategy, NULL, dev, B_READ,
- sc->sc_parent->dk_driver->d_minphys, uio));
+ return (physio(dkstrategy, NULL, dev, B_READ, dkminphys, uio));
}
/*
@@ -1271,8 +1288,7 @@ dkwrite(dev_t dev, struct uio *uio, int flags)
if (sc->sc_state != DKW_STATE_RUNNING)
return (ENXIO);
- return (physio(dkstrategy, NULL, dev, B_WRITE,
- sc->sc_parent->dk_driver->d_minphys, uio));
+ return (physio(dkstrategy, NULL, dev, B_WRITE, dkminphys, uio));
}
/*