Module Name:    src
Committed By:   dyoung
Date:           Tue May 19 20:25:41 UTC 2009

Modified Files:
        src/sys/dev: md.c

Log Message:
Add a detachment hook.  Detach md(4) at shutdown.


To generate a diff of this commit:
cvs rdiff -u -r1.58 -r1.59 src/sys/dev/md.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/md.c
diff -u src/sys/dev/md.c:1.58 src/sys/dev/md.c:1.59
--- src/sys/dev/md.c:1.58	Mon May  4 16:20:41 2009
+++ src/sys/dev/md.c	Tue May 19 20:25:41 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.58 2009/05/04 16:20:41 manu Exp $	*/
+/*	$NetBSD: md.c,v 1.59 2009/05/19 20:25:41 dyoung Exp $	*/
 
 /*
  * Copyright (c) 1995 Gordon W. Ross, Leo Weppelman.
@@ -46,7 +46,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: md.c,v 1.58 2009/05/04 16:20:41 manu Exp $");
+__KERNEL_RCSID(0, "$NetBSD: md.c,v 1.59 2009/05/19 20:25:41 dyoung Exp $");
 
 #include "opt_md.h"
 #include "opt_tftproot.h"
@@ -95,6 +95,7 @@
 void	mdattach(int);
 
 static void	md_attach(device_t, device_t, void *);
+static int	md_detach(device_t, int);
 
 static dev_type_open(mdopen);
 static dev_type_close(mdclose);
@@ -116,8 +117,8 @@
 static struct dkdriver mddkdriver = { mdstrategy, NULL };
 
 extern struct cfdriver md_cd;
-CFATTACH_DECL_NEW(md, sizeof(struct md_softc),
-	0, md_attach, 0, NULL);
+CFATTACH_DECL3_NEW(md, sizeof(struct md_softc),
+	0, md_attach, md_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
 
 extern size_t md_root_size;
 
@@ -159,8 +160,7 @@
 }
 
 static void
-md_attach(device_t parent, device_t self,
-    void *aux)
+md_attach(device_t parent, device_t self, void *aux)
 {
 	struct md_softc *sc = device_private(self);
 
@@ -186,6 +186,30 @@
 		aprint_error_dev(self, "couldn't establish power handler\n");
 }
 
+static int
+md_detach(device_t self, int flags)
+{
+	struct md_softc *sc = device_private(self);
+	int rc;
+
+	rc = 0;
+	mutex_enter(&sc->sc_dkdev.dk_openlock);
+	if (sc->sc_dkdev.dk_openmask == 0)
+		;	/* nothing to do */
+	else if ((flags & DETACH_FORCE) == 0)
+		rc = EBUSY;
+	mutex_exit(&sc->sc_dkdev.dk_openlock);
+
+	if (rc != 0)
+		return rc;
+
+	pmf_device_deregister(self);
+	disk_detach(&sc->sc_dkdev);
+	disk_destroy(&sc->sc_dkdev);
+	bufq_free(sc->sc_buflist);
+	return 0;
+}
+
 /*
  * operational routines:
  * open, close, read, write, strategy,

Reply via email to