Module Name:    src
Committed By:   dyoung
Date:           Tue May 19 23:42:05 UTC 2009

Modified Files:
        src/sys/kern: subr_disk.c
        src/sys/sys: disk.h

Log Message:
Encapsulate the checks that I do before detaching a disk(9) provider
in a pre-detachment routine, disk_predetach().


To generate a diff of this commit:
cvs rdiff -u -r1.95 -r1.96 src/sys/kern/subr_disk.c
cvs rdiff -u -r1.52 -r1.53 src/sys/sys/disk.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/subr_disk.c
diff -u src/sys/kern/subr_disk.c:1.95 src/sys/kern/subr_disk.c:1.96
--- src/sys/kern/subr_disk.c:1.95	Sat Apr  4 07:30:10 2009
+++ src/sys/kern/subr_disk.c	Tue May 19 23:42:05 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_disk.c,v 1.95 2009/04/04 07:30:10 ad Exp $	*/
+/*	$NetBSD: subr_disk.c,v 1.96 2009/05/19 23:42:05 dyoung Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1999, 2000, 2009 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_disk.c,v 1.95 2009/04/04 07:30:10 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_disk.c,v 1.96 2009/05/19 23:42:05 dyoung Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -216,6 +216,25 @@
 	diskp->dk_stats = iostat_alloc(IOSTAT_DISK, diskp, diskp->dk_name);
 }
 
+int
+disk_predetach(struct disk *dk, int (*lastclose)(device_t),
+    device_t self, int flags)
+{
+	int rc;
+
+	rc = 0;
+	mutex_enter(&dk->dk_openlock);
+	if (dk->dk_openmask == 0)
+		;	/* nothing to do */
+	else if ((flags & DETACH_FORCE) == 0)
+		rc = EBUSY;
+	else if (lastclose != NULL)
+		rc = (*lastclose)(self);
+	mutex_exit(&dk->dk_openlock);
+
+	return rc;
+}
+
 /*
  * Detach a disk.
  */

Index: src/sys/sys/disk.h
diff -u src/sys/sys/disk.h:1.52 src/sys/sys/disk.h:1.53
--- src/sys/sys/disk.h:1.52	Sat Apr  4 07:30:09 2009
+++ src/sys/sys/disk.h	Tue May 19 23:42:05 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: disk.h,v 1.52 2009/04/04 07:30:09 ad Exp $	*/
+/*	$NetBSD: disk.h,v 1.53 2009/05/19 23:42:05 dyoung Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 2004 The NetBSD Foundation, Inc.
@@ -497,6 +497,7 @@
 struct proc;
 
 void	disk_attach(struct disk *);
+int	disk_predetach(struct disk *, int (*)(device_t), device_t, int);
 void	disk_detach(struct disk *);
 void	disk_init(struct disk *, const char *, const struct dkdriver *);
 void	disk_destroy(struct disk *);

Reply via email to