Module Name:    src
Committed By:   riastradh
Date:           Mon Mar 28 12:38:34 UTC 2022

Modified Files:
        src/sys/kern: subr_devsw.c vfs_subr.c
        src/sys/sys: conf.h

Log Message:
driver(9): Make vdevgone call config_detach_commit if appropriate.

Make sure to do this before spec_node_lookup_by_dev -- that might wait
for a concurrent revoke to complete, which in turn might wait for a
concurrent open to complete, which in turn might be waiting for the
device to commit to detaching.


To generate a diff of this commit:
cvs rdiff -u -r1.42 -r1.43 src/sys/kern/subr_devsw.c
cvs rdiff -u -r1.492 -r1.493 src/sys/kern/vfs_subr.c
cvs rdiff -u -r1.158 -r1.159 src/sys/sys/conf.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_devsw.c
diff -u src/sys/kern/subr_devsw.c:1.42 src/sys/kern/subr_devsw.c:1.43
--- src/sys/kern/subr_devsw.c:1.42	Mon Mar 28 12:34:08 2022
+++ src/sys/kern/subr_devsw.c	Mon Mar 28 12:38:33 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_devsw.c,v 1.42 2022/03/28 12:34:08 riastradh Exp $	*/
+/*	$NetBSD: subr_devsw.c,v 1.43 2022/03/28 12:38:33 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2002, 2007, 2008 The NetBSD Foundation, Inc.
@@ -69,7 +69,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_devsw.c,v 1.42 2022/03/28 12:34:08 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_devsw.c,v 1.43 2022/03/28 12:38:33 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_dtrace.h"
@@ -1068,6 +1068,24 @@ bdev_discard(dev_t dev, off_t pos, off_t
 	return rv;
 }
 
+void
+bdev_detached(dev_t dev)
+{
+	const struct bdevsw *d;
+	device_t dv;
+	int unit;
+
+	if ((d = bdevsw_lookup(dev)) == NULL)
+		return;
+	if (d->d_devtounit == NULL)
+		return;
+	if ((unit = (*d->d_devtounit)(dev)) == -1)
+		return;
+	if ((dv = device_lookup(d->d_cfdriver, unit)) == NULL)
+		return;
+	config_detach_commit(dv);
+}
+
 int
 cdev_open(dev_t dev, int flag, int devtype, lwp_t *l)
 {
@@ -1288,6 +1306,24 @@ cdev_type(dev_t dev)
 	return d->d_flag & D_TYPEMASK;
 }
 
+void
+cdev_detached(dev_t dev)
+{
+	const struct cdevsw *d;
+	device_t dv;
+	int unit;
+
+	if ((d = cdevsw_lookup(dev)) == NULL)
+		return;
+	if (d->d_devtounit == NULL)
+		return;
+	if ((unit = (*d->d_devtounit)(dev)) == -1)
+		return;
+	if ((dv = device_lookup(d->d_cfdriver, unit)) == NULL)
+		return;
+	config_detach_commit(dv);
+}
+
 /*
  * nommap(dev, off, prot)
  *

Index: src/sys/kern/vfs_subr.c
diff -u src/sys/kern/vfs_subr.c:1.492 src/sys/kern/vfs_subr.c:1.493
--- src/sys/kern/vfs_subr.c:1.492	Mon Mar 28 12:37:46 2022
+++ src/sys/kern/vfs_subr.c	Mon Mar 28 12:38:33 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_subr.c,v 1.492 2022/03/28 12:37:46 riastradh Exp $	*/
+/*	$NetBSD: vfs_subr.c,v 1.493 2022/03/28 12:38:33 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008, 2019, 2020
@@ -69,7 +69,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.492 2022/03/28 12:37:46 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.493 2022/03/28 12:38:33 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -512,6 +512,20 @@ vdevgone(int maj, int minl, int minh, en
 	for (mn = minl; mn <= minh; mn++) {
 		dev = makedev(maj, mn);
 		/*
+		 * Notify anyone trying to get at this device that it
+		 * has been detached, and then revoke it.
+		 */
+		switch (type) {
+		case VBLK:
+			bdev_detached(dev);
+			break;
+		case VCHR:
+			cdev_detached(dev);
+			break;
+		default:
+			panic("invalid specnode type: %d", type);
+		}
+		/*
 		 * Passing 0 as flags, instead of VDEAD_NOWAIT, means
 		 * spec_node_lookup_by_dev will wait for vnodes it
 		 * finds concurrently being revoked before returning.

Index: src/sys/sys/conf.h
diff -u src/sys/sys/conf.h:1.158 src/sys/sys/conf.h:1.159
--- src/sys/sys/conf.h:1.158	Mon Mar 28 12:34:17 2022
+++ src/sys/sys/conf.h	Mon Mar 28 12:38:33 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: conf.h,v 1.158 2022/03/28 12:34:17 riastradh Exp $	*/
+/*	$NetBSD: conf.h,v 1.159 2022/03/28 12:38:33 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 1990, 1993
@@ -172,6 +172,8 @@ dev_type_dump(bdev_dump);
 dev_type_size(bdev_size);
 dev_type_discard(bdev_discard);
 
+void	bdev_detached(dev_t);
+
 dev_type_open(cdev_open);
 dev_type_close(cdev_close);
 dev_type_read(cdev_read);
@@ -184,6 +186,8 @@ dev_type_mmap(cdev_mmap);
 dev_type_kqfilter(cdev_kqfilter);
 dev_type_discard(cdev_discard);
 
+void	cdev_detached(dev_t);
+
 int	cdev_type(dev_t);
 int	cdev_flags(dev_t);
 int	bdev_type(dev_t);

Reply via email to