Module Name: src
Committed By: dyoung
Date: Tue May 19 19:56:11 UTC 2009
Modified Files:
src/sys/dev/ata: wd.c
src/sys/dev/scsipi: sd.c
Log Message:
Delete wdactivate() and sdactivate(). They were no-ops, but as a
side-effect of registering them, config_detach(9) cleared DVF_ACTIVE
before it called wddetach() or sddetach(). Even though sd(4)'s
detachment may have subsequently failed with EBUSY, we could not
begin new disk I/O on sd(4) because the device had been deactivated.
By analogy to sdstrategy(), test device_is_active() in wdstrategy()
and if it is false set b_errno to EIO instead of initiating new
disk I/O.
XXX We should decline more politely to start new I/O, since
XXX !device_is_active() may mean simply that the device is suspended.
XXX I suppose that EIO is safe as long as system suspension is
XXX all-or-nothing.
To generate a diff of this commit:
cvs rdiff -u -r1.374 -r1.375 src/sys/dev/ata/wd.c
cvs rdiff -u -r1.283 -r1.284 src/sys/dev/scsipi/sd.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/ata/wd.c
diff -u src/sys/dev/ata/wd.c:1.374 src/sys/dev/ata/wd.c:1.375
--- src/sys/dev/ata/wd.c:1.374 Fri May 15 23:49:28 2009
+++ src/sys/dev/ata/wd.c Tue May 19 19:56:10 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: wd.c,v 1.374 2009/05/15 23:49:28 dyoung Exp $ */
+/* $NetBSD: wd.c,v 1.375 2009/05/19 19:56:10 dyoung Exp $ */
/*
* Copyright (c) 1998, 2001 Manuel Bouyer. All rights reserved.
@@ -59,7 +59,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.374 2009/05/15 23:49:28 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.375 2009/05/19 19:56:10 dyoung Exp $");
#include "opt_ata.h"
@@ -129,7 +129,6 @@
int wdprobe(device_t, cfdata_t, void *);
void wdattach(device_t, device_t, void *);
int wddetach(device_t, int);
-int wdactivate(device_t, enum devact);
int wdprint(void *, char *);
void wdperror(const struct wd_softc *);
@@ -138,7 +137,7 @@
static int wd_standby(struct wd_softc *, int);
CFATTACH_DECL3_NEW(wd, sizeof(struct wd_softc),
- wdprobe, wdattach, wddetach, wdactivate, NULL, NULL, DVF_DETACH_SHUTDOWN);
+ wdprobe, wdattach, wddetach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
extern struct cfdriver wd_cd;
@@ -435,25 +434,6 @@
}
int
-wdactivate(device_t self, enum devact act)
-{
- int rv = 0;
-
- switch (act) {
- case DVACT_ACTIVATE:
- rv = EOPNOTSUPP;
- break;
-
- case DVACT_DEACTIVATE:
- /*
- * Nothing to do; we key off the device's DVF_ACTIVATE.
- */
- break;
- }
- return (rv);
-}
-
-int
wddetach(device_t self, int flags)
{
struct wd_softc *sc = device_private(self);
@@ -548,8 +528,10 @@
goto done;
}
- /* If device invalidated (e.g. media change, door open), error. */
- if ((wd->sc_flags & WDF_LOADED) == 0) {
+ /* If device invalidated (e.g. media change, door open,
+ * device suspension), then error.
+ */
+ if ((wd->sc_flags & WDF_LOADED) == 0 || !device_is_active(wd->sc_dev)) {
bp->b_error = EIO;
goto done;
}
Index: src/sys/dev/scsipi/sd.c
diff -u src/sys/dev/scsipi/sd.c:1.283 src/sys/dev/scsipi/sd.c:1.284
--- src/sys/dev/scsipi/sd.c:1.283 Sun May 17 18:11:34 2009
+++ src/sys/dev/scsipi/sd.c Tue May 19 19:56:11 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: sd.c,v 1.283 2009/05/17 18:11:34 dyoung Exp $ */
+/* $NetBSD: sd.c,v 1.284 2009/05/19 19:56:11 dyoung Exp $ */
/*-
* Copyright (c) 1998, 2003, 2004 The NetBSD Foundation, Inc.
@@ -47,7 +47,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.283 2009/05/17 18:11:34 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.284 2009/05/19 19:56:11 dyoung Exp $");
#include "opt_scsi.h"
#include "rnd.h"
@@ -126,12 +126,11 @@
static int sdmatch(device_t, cfdata_t, void *);
static void sdattach(device_t, device_t, void *);
-static int sdactivate(device_t, enum devact);
static int sddetach(device_t, int);
static void sd_set_properties(struct sd_softc *);
CFATTACH_DECL3_NEW(sd, sizeof(struct sd_softc), sdmatch, sdattach, sddetach,
- sdactivate, NULL, NULL, DVF_DETACH_SHUTDOWN);
+ NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
extern struct cfdriver sd_cd;
@@ -328,25 +327,6 @@
}
static int
-sdactivate(device_t self, enum devact act)
-{
- int rv = 0;
-
- switch (act) {
- case DVACT_ACTIVATE:
- rv = EOPNOTSUPP;
- break;
-
- case DVACT_DEACTIVATE:
- /*
- * Nothing to do; we key off the device's DVF_ACTIVE.
- */
- break;
- }
- return (rv);
-}
-
-static int
sddetach(device_t self, int flags)
{
struct sd_softc *sd = device_private(self);