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) {