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