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

Reply via email to