Module Name:    src
Committed By:   hannken
Date:           Sat Mar 19 13:51:35 UTC 2022

Modified Files:
        src/sys/arch/evbarm/fdt: fdt_machdep.c
        src/sys/arch/x86/x86: x86_autoconf.c
        src/sys/arch/zaurus/zaurus: autoconf.c
        src/sys/kern: init_main.c kern_subr.c

Log Message:
Fix locking after opendisk(), VOP_IOCTL() needs an unlocked vnode,
vn_rdwr() needs flag IO_NODELOCKED.


To generate a diff of this commit:
cvs rdiff -u -r1.89 -r1.90 src/sys/arch/evbarm/fdt/fdt_machdep.c
cvs rdiff -u -r1.86 -r1.87 src/sys/arch/x86/x86/x86_autoconf.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/zaurus/zaurus/autoconf.c
cvs rdiff -u -r1.537 -r1.538 src/sys/kern/init_main.c
cvs rdiff -u -r1.229 -r1.230 src/sys/kern/kern_subr.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/arch/evbarm/fdt/fdt_machdep.c
diff -u src/sys/arch/evbarm/fdt/fdt_machdep.c:1.89 src/sys/arch/evbarm/fdt/fdt_machdep.c:1.90
--- src/sys/arch/evbarm/fdt/fdt_machdep.c:1.89	Sat Mar 19 09:55:30 2022
+++ src/sys/arch/evbarm/fdt/fdt_machdep.c	Sat Mar 19 13:51:35 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: fdt_machdep.c,v 1.89 2022/03/19 09:55:30 skrll Exp $ */
+/* $NetBSD: fdt_machdep.c,v 1.90 2022/03/19 13:51:35 hannken Exp $ */
 
 /*-
  * Copyright (c) 2015-2017 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.89 2022/03/19 09:55:30 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdt_machdep.c,v 1.90 2022/03/19 13:51:35 hannken Exp $");
 
 #include "opt_arm_debug.h"
 #include "opt_bootconfig.h"
@@ -774,7 +774,7 @@ fdt_detect_root_device(device_t dev)
 		if (!vp)
 			return;
 		error = vn_rdwr(UIO_READ, vp, buf, sizeof(buf), 0, UIO_SYSSPACE,
-		    0, NOCRED, &resid, NULL);
+		    IO_NODELOCKED, NOCRED, &resid, NULL);
 		VOP_CLOSE(vp, FREAD, NOCRED);
 		vput(vp);
 

Index: src/sys/arch/x86/x86/x86_autoconf.c
diff -u src/sys/arch/x86/x86/x86_autoconf.c:1.86 src/sys/arch/x86/x86/x86_autoconf.c:1.87
--- src/sys/arch/x86/x86/x86_autoconf.c:1.86	Sat Feb 12 03:24:35 2022
+++ src/sys/arch/x86/x86/x86_autoconf.c	Sat Mar 19 13:51:35 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: x86_autoconf.c,v 1.86 2022/02/12 03:24:35 riastradh Exp $	*/
+/*	$NetBSD: x86_autoconf.c,v 1.87 2022/03/19 13:51:35 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1990 The Regents of the University of California.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: x86_autoconf.c,v 1.86 2022/02/12 03:24:35 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: x86_autoconf.c,v 1.87 2022/03/19 13:51:35 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -178,7 +178,7 @@ matchbiosdisks(void)
 		}
 
 		error = vn_rdwr(UIO_READ, tv, mbr, DEV_BSIZE, 0, UIO_SYSSPACE,
-		    0, NOCRED, NULL, NULL);
+		    IO_NODELOCKED, NOCRED, NULL, NULL);
 		VOP_CLOSE(tv, FREAD, NOCRED);
 		vput(tv);
 		if (error) {
@@ -243,7 +243,7 @@ match_bootwedge(device_t dv, struct btin
 	     nblks != 0; nblks--, blk++) {
 		error = vn_rdwr(UIO_READ, tmpvn, (void *) bf,
 		    sizeof(bf), blk * DEV_BSIZE, UIO_SYSSPACE,
-		    0, NOCRED, NULL, NULL);
+		    IO_NODELOCKED, NOCRED, NULL, NULL);
 		if (error) {
 			if (error != EINVAL) {
 				aprint_error("%s: unable to read block %"
@@ -298,7 +298,9 @@ match_bootdisk(device_t dv, struct btinf
 		return 0;
 	}
 
+	VOP_UNLOCK(tmpvn);
 	error = VOP_IOCTL(tmpvn, DIOCGDINFO, &label, FREAD, NOCRED);
+	vn_lock(tmpvn, LK_EXCLUSIVE | LK_RETRY);
 	if (error) {
 		/*
 		 * XXX Can't happen -- open() would have errored out

Index: src/sys/arch/zaurus/zaurus/autoconf.c
diff -u src/sys/arch/zaurus/zaurus/autoconf.c:1.15 src/sys/arch/zaurus/zaurus/autoconf.c:1.16
--- src/sys/arch/zaurus/zaurus/autoconf.c:1.15	Sat Feb 12 03:24:35 2022
+++ src/sys/arch/zaurus/zaurus/autoconf.c	Sat Mar 19 13:51:35 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: autoconf.c,v 1.15 2022/02/12 03:24:35 riastradh Exp $	*/
+/*	$NetBSD: autoconf.c,v 1.16 2022/03/19 13:51:35 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.15 2022/02/12 03:24:35 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.16 2022/03/19 13:51:35 hannken Exp $");
 
 #include "opt_md.h"
 
@@ -109,7 +109,9 @@ match_bootdisk(device_t dv, struct btinf
 	if ((tmpvn = opendisk(dv)) == NULL)
 		return 0;
 
+	VOP_UNLOCK(tmpvn);
 	error = VOP_IOCTL(tmpvn, DIOCGDINFO, &label, FREAD, NOCRED);
+	vn_lock(tmpvn, LK_EXCLUSIVE | LK_RETRY);
 	if (error) {
 		/*
 		 * XXX Can't happen -- open() would have errored out

Index: src/sys/kern/init_main.c
diff -u src/sys/kern/init_main.c:1.537 src/sys/kern/init_main.c:1.538
--- src/sys/kern/init_main.c:1.537	Fri Mar 18 23:37:06 2022
+++ src/sys/kern/init_main.c	Sat Mar 19 13:51:35 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: init_main.c,v 1.537 2022/03/18 23:37:06 riastradh Exp $	*/
+/*	$NetBSD: init_main.c,v 1.538 2022/03/19 13:51:35 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009, 2019 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.537 2022/03/18 23:37:06 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.538 2022/03/19 13:51:35 hannken Exp $");
 
 #include "opt_cnmagic.h"
 #include "opt_ddb.h"
@@ -890,7 +890,9 @@ rootconf_handle_wedges(void)
 		if (vp == NULL)
 			return;
 
+		VOP_UNLOCK(vp);
 		error = VOP_IOCTL(vp, DIOCGDINFO, &label, FREAD, NOCRED);
+		vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
 		VOP_CLOSE(vp, FREAD, NOCRED);
 		vput(vp);
 		if (error)

Index: src/sys/kern/kern_subr.c
diff -u src/sys/kern/kern_subr.c:1.229 src/sys/kern/kern_subr.c:1.230
--- src/sys/kern/kern_subr.c:1.229	Sat Nov 21 08:10:27 2020
+++ src/sys/kern/kern_subr.c	Sat Mar 19 13:51:35 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_subr.c,v 1.229 2020/11/21 08:10:27 mlelstv Exp $	*/
+/*	$NetBSD: kern_subr.c,v 1.230 2022/03/19 13:51:35 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998, 1999, 2002, 2007, 2008 The NetBSD Foundation, Inc.
@@ -79,7 +79,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_subr.c,v 1.229 2020/11/21 08:10:27 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_subr.c,v 1.230 2022/03/19 13:51:35 hannken Exp $");
 
 #include "opt_ddb.h"
 #include "opt_md.h"
@@ -137,7 +137,9 @@ isswap(device_t dv)
 	if ((vn = opendisk(dv)) == NULL)
 		return 0;
 
+	VOP_UNLOCK(vn);
 	error = VOP_IOCTL(vn, DIOCGWEDGEINFO, &wi, FREAD, NOCRED);
+	vn_lock(vn, LK_EXCLUSIVE | LK_RETRY);
 	VOP_CLOSE(vn, FREAD, NOCRED);
 	vput(vn);
 	if (error) {

Reply via email to