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 <[email protected]>
@@ -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) {