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);