Module Name: src
Committed By: dyoung
Date: Tue May 19 23:43:44 UTC 2009
Modified Files:
src/sys/dev/ata: wd.c
src/sys/dev/scsipi: sd.c
Log Message:
Use disk_predetach().
To generate a diff of this commit:
cvs rdiff -u -r1.375 -r1.376 src/sys/dev/ata/wd.c
cvs rdiff -u -r1.284 -r1.285 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.375 src/sys/dev/ata/wd.c:1.376
--- src/sys/dev/ata/wd.c:1.375 Tue May 19 19:56:10 2009
+++ src/sys/dev/ata/wd.c Tue May 19 23:43:44 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: wd.c,v 1.375 2009/05/19 19:56:10 dyoung Exp $ */
+/* $NetBSD: wd.c,v 1.376 2009/05/19 23:43:44 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.375 2009/05/19 19:56:10 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.376 2009/05/19 23:43:44 dyoung Exp $");
#include "opt_ata.h"
@@ -132,7 +132,7 @@
int wdprint(void *, char *);
void wdperror(const struct wd_softc *);
-static void wdlastclose(struct wd_softc *);
+static int wdlastclose(device_t);
static bool wd_suspend(device_t PMF_FN_PROTO);
static int wd_standby(struct wd_softc *, int);
@@ -439,17 +439,7 @@
struct wd_softc *sc = device_private(self);
int bmaj, cmaj, i, mn, rc, s;
- rc = 0;
- mutex_enter(&sc->sc_dk.dk_openlock);
- if (sc->sc_dk.dk_openmask == 0)
- ; /* nothing to do */
- else if ((flags & DETACH_FORCE) == 0)
- rc = EBUSY;
- else
- wdlastclose(sc);
- mutex_exit(&sc->sc_dk.dk_openlock);
-
- if (rc != 0)
+ if ((rc = disk_predetach(&sc->sc_dk, wdlastclose, self, flags)) != 0)
return rc;
/* locate the major number */
@@ -1000,15 +990,19 @@
/*
* Caller must hold wd->sc_dk.dk_openlock.
*/
-static void
-wdlastclose(struct wd_softc *wd)
+static int
+wdlastclose(device_t self)
{
+ struct wd_softc *wd = device_private(self);
+
wd_flushcache(wd, AT_WAIT);
if (! (wd->sc_flags & WDF_KLABEL))
wd->sc_flags &= ~WDF_LOADED;
wd->atabus->ata_delref(wd->drvp);
+
+ return 0;
}
int
@@ -1034,7 +1028,7 @@
wd->sc_dk.dk_copenmask | wd->sc_dk.dk_bopenmask;
if (wd->sc_dk.dk_openmask == 0)
- wdlastclose(wd);
+ wdlastclose(wd->sc_dev);
mutex_exit(&wd->sc_dk.dk_openlock);
return 0;
Index: src/sys/dev/scsipi/sd.c
diff -u src/sys/dev/scsipi/sd.c:1.284 src/sys/dev/scsipi/sd.c:1.285
--- src/sys/dev/scsipi/sd.c:1.284 Tue May 19 19:56:11 2009
+++ src/sys/dev/scsipi/sd.c Tue May 19 23:43:44 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: sd.c,v 1.284 2009/05/19 19:56:11 dyoung Exp $ */
+/* $NetBSD: sd.c,v 1.285 2009/05/19 23:43:44 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.284 2009/05/19 19:56:11 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.285 2009/05/19 23:43:44 dyoung Exp $");
#include "opt_scsi.h"
#include "rnd.h"
@@ -103,7 +103,7 @@
static bool sd_suspend(device_t PMF_FN_PROTO);
static bool sd_shutdown(device_t, int);
static int sd_interpret_sense(struct scsipi_xfer *);
-static void sdlastclose(struct sd_softc *);
+static int sdlastclose(device_t);
static int sd_mode_sense(struct sd_softc *, u_int8_t, void *, size_t, int,
int, int *);
@@ -332,17 +332,7 @@
struct sd_softc *sd = device_private(self);
int s, bmaj, cmaj, i, mn, rc;
- rc = 0;
- mutex_enter(&sd->sc_dk.dk_openlock);
- if (sd->sc_dk.dk_openmask == 0)
- ; /* nothing to do */
- else if ((flags & DETACH_FORCE) == 0)
- rc = EBUSY;
- else
- sdlastclose(sd);
- mutex_exit(&sd->sc_dk.dk_openlock);
-
- if (rc != 0)
+ if ((rc = disk_predetach(&sd->sc_dk, sdlastclose, self, flags)) != 0)
return rc;
/* locate the major number */
@@ -578,9 +568,10 @@
/*
* Caller must hold sd->sc_dk.dk_openlock.
*/
-static void
-sdlastclose(struct sd_softc *sd)
+static int
+sdlastclose(device_t self)
{
+ struct sd_softc *sd = device_private(self);
struct scsipi_periph *periph = sd->sc_periph;
struct scsipi_adapter *adapt = periph->periph_channel->chan_adapter;
@@ -609,6 +600,8 @@
scsipi_wait_drain(periph);
scsipi_adapter_delref(adapt);
+
+ return 0;
}
/*
@@ -634,7 +627,7 @@
sd->sc_dk.dk_copenmask | sd->sc_dk.dk_bopenmask;
if (sd->sc_dk.dk_openmask == 0)
- sdlastclose(sd);
+ sdlastclose(sd->sc_dev);
mutex_exit(&sd->sc_dk.dk_openlock);
return (0);