Module Name: src Committed By: hannken Date: Mon Nov 14 18:35:15 UTC 2011
Modified Files: src/sys/fs/adosfs: advfsops.c src/sys/fs/cd9660: cd9660_vfsops.c src/sys/fs/filecorefs: filecore_vfsops.c src/sys/fs/hfs: hfs_subr.c src/sys/fs/msdosfs: msdosfs_vfsops.c src/sys/fs/nilfs: nilfs_vfsops.c src/sys/fs/ntfs: ntfs_vfsops.c src/sys/fs/udf: udf_vfsops.c src/sys/ufs/ext2fs: ext2fs_vfsops.c src/sys/ufs/ffs: ffs_vfsops.c src/sys/ufs/lfs: lfs_vfsops.c Log Message: VOP_OPEN() needs a locked vnode. All these copy-and-pasted xxxfs_mount() implementations need more review. To generate a diff of this commit: cvs rdiff -u -r1.62 -r1.63 src/sys/fs/adosfs/advfsops.c cvs rdiff -u -r1.73 -r1.74 src/sys/fs/cd9660/cd9660_vfsops.c cvs rdiff -u -r1.67 -r1.68 src/sys/fs/filecorefs/filecore_vfsops.c cvs rdiff -u -r1.16 -r1.17 src/sys/fs/hfs/hfs_subr.c cvs rdiff -u -r1.92 -r1.93 src/sys/fs/msdosfs/msdosfs_vfsops.c cvs rdiff -u -r1.7 -r1.8 src/sys/fs/nilfs/nilfs_vfsops.c cvs rdiff -u -r1.86 -r1.87 src/sys/fs/ntfs/ntfs_vfsops.c cvs rdiff -u -r1.61 -r1.62 src/sys/fs/udf/udf_vfsops.c cvs rdiff -u -r1.161 -r1.162 src/sys/ufs/ext2fs/ext2fs_vfsops.c cvs rdiff -u -r1.270 -r1.271 src/sys/ufs/ffs/ffs_vfsops.c cvs rdiff -u -r1.290 -r1.291 src/sys/ufs/lfs/lfs_vfsops.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/fs/adosfs/advfsops.c diff -u src/sys/fs/adosfs/advfsops.c:1.62 src/sys/fs/adosfs/advfsops.c:1.63 --- src/sys/fs/adosfs/advfsops.c:1.62 Sun Jun 12 03:35:52 2011 +++ src/sys/fs/adosfs/advfsops.c Mon Nov 14 18:35:12 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: advfsops.c,v 1.62 2011/06/12 03:35:52 rmind Exp $ */ +/* $NetBSD: advfsops.c,v 1.63 2011/11/14 18:35:12 hannken Exp $ */ /* * Copyright (c) 1994 Christian E. Hopps @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: advfsops.c,v 1.62 2011/06/12 03:35:52 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: advfsops.c,v 1.63 2011/11/14 18:35:12 hannken Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -176,9 +176,13 @@ adosfs_mountfs(struct vnode *devvp, stru /* * open blkdev and read root block */ - if ((error = VOP_OPEN(devvp, FREAD, NOCRED)) != 0) + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); + if ((error = VOP_OPEN(devvp, FREAD, NOCRED)) != 0) { + VOP_UNLOCK(devvp); return (error); + } error = VOP_IOCTL(devvp, DIOCGDINFO, &dl, FREAD, NOCRED); + VOP_UNLOCK(devvp); if (error) goto fail; Index: src/sys/fs/cd9660/cd9660_vfsops.c diff -u src/sys/fs/cd9660/cd9660_vfsops.c:1.73 src/sys/fs/cd9660/cd9660_vfsops.c:1.74 --- src/sys/fs/cd9660/cd9660_vfsops.c:1.73 Tue Sep 27 01:01:43 2011 +++ src/sys/fs/cd9660/cd9660_vfsops.c Mon Nov 14 18:35:12 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: cd9660_vfsops.c,v 1.73 2011/09/27 01:01:43 christos Exp $ */ +/* $NetBSD: cd9660_vfsops.c,v 1.74 2011/11/14 18:35:12 hannken Exp $ */ /*- * Copyright (c) 1994 @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cd9660_vfsops.c,v 1.73 2011/09/27 01:01:43 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cd9660_vfsops.c,v 1.74 2011/11/14 18:35:12 hannken Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -271,7 +271,9 @@ cd9660_mount(struct mount *mp, const cha return (error); } if ((mp->mnt_flag & MNT_UPDATE) == 0) { + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); error = VOP_OPEN(devvp, FREAD, FSCRED); + VOP_UNLOCK(devvp); if (error) goto fail; error = iso_mountfs(devvp, mp, l, args); Index: src/sys/fs/filecorefs/filecore_vfsops.c diff -u src/sys/fs/filecorefs/filecore_vfsops.c:1.67 src/sys/fs/filecorefs/filecore_vfsops.c:1.68 --- src/sys/fs/filecorefs/filecore_vfsops.c:1.67 Sun Jun 12 03:35:52 2011 +++ src/sys/fs/filecorefs/filecore_vfsops.c Mon Nov 14 18:35:13 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: filecore_vfsops.c,v 1.67 2011/06/12 03:35:52 rmind Exp $ */ +/* $NetBSD: filecore_vfsops.c,v 1.68 2011/11/14 18:35:13 hannken Exp $ */ /*- * Copyright (c) 1994 The Regents of the University of California. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: filecore_vfsops.c,v 1.67 2011/06/12 03:35:52 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: filecore_vfsops.c,v 1.68 2011/11/14 18:35:13 hannken Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -326,7 +326,9 @@ filecore_mountfs(struct vnode *devvp, st if ((error = vinvalbuf(devvp, V_SAVE, l->l_cred, l, 0, 0)) != 0) return (error); + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); error = VOP_OPEN(devvp, ronly ? FREAD : FREAD|FWRITE, FSCRED); + VOP_UNLOCK(devvp); if (error) return error; Index: src/sys/fs/hfs/hfs_subr.c diff -u src/sys/fs/hfs/hfs_subr.c:1.16 src/sys/fs/hfs/hfs_subr.c:1.17 --- src/sys/fs/hfs/hfs_subr.c:1.16 Sun Nov 13 23:03:55 2011 +++ src/sys/fs/hfs/hfs_subr.c Mon Nov 14 18:35:13 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: hfs_subr.c,v 1.16 2011/11/13 23:03:55 christos Exp $ */ +/* $NetBSD: hfs_subr.c,v 1.17 2011/11/14 18:35:13 hannken Exp $ */ /*- * Copyright (c) 2005, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hfs_subr.c,v 1.16 2011/11/13 23:03:55 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hfs_subr.c,v 1.17 2011/11/14 18:35:13 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -178,8 +178,10 @@ hfs_libcb_opendev( /* Open the device node. */ mode = vol->readonly ? FREAD : FREAD|FWRITE; - if ((result = VOP_OPEN(args->devvp, mode, - FSCRED)) != 0) + vn_lock(args->devvp, LK_EXCLUSIVE | LK_RETRY); + result = VOP_OPEN(args->devvp, mode, FSCRED); + VOP_UNLOCK(args->devvp); + if (result != 0) goto error; /* Flush out any old buffers remaining from a previous use. */ Index: src/sys/fs/msdosfs/msdosfs_vfsops.c diff -u src/sys/fs/msdosfs/msdosfs_vfsops.c:1.92 src/sys/fs/msdosfs/msdosfs_vfsops.c:1.93 --- src/sys/fs/msdosfs/msdosfs_vfsops.c:1.92 Fri Oct 7 09:35:04 2011 +++ src/sys/fs/msdosfs/msdosfs_vfsops.c Mon Nov 14 18:35:13 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: msdosfs_vfsops.c,v 1.92 2011/10/07 09:35:04 hannken Exp $ */ +/* $NetBSD: msdosfs_vfsops.c,v 1.93 2011/11/14 18:35:13 hannken Exp $ */ /*- * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank. @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.92 2011/10/07 09:35:04 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.93 2011/11/14 18:35:13 hannken Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -418,7 +418,9 @@ msdosfs_mount(struct mount *mp, const ch xflags = FREAD; else xflags = FREAD|FWRITE; + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); error = VOP_OPEN(devvp, xflags, FSCRED); + VOP_UNLOCK(devvp); if (error) { DPRINTF(("VOP_OPEN %d\n", error)); goto fail; Index: src/sys/fs/nilfs/nilfs_vfsops.c diff -u src/sys/fs/nilfs/nilfs_vfsops.c:1.7 src/sys/fs/nilfs/nilfs_vfsops.c:1.8 --- src/sys/fs/nilfs/nilfs_vfsops.c:1.7 Sun Nov 13 18:29:08 2011 +++ src/sys/fs/nilfs/nilfs_vfsops.c Mon Nov 14 18:35:13 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: nilfs_vfsops.c,v 1.7 2011/11/13 18:29:08 christos Exp $ */ +/* $NetBSD: nilfs_vfsops.c,v 1.8 2011/11/14 18:35:13 hannken Exp $ */ /* * Copyright (c) 2008, 2009 Reinoud Zandijk @@ -28,7 +28,7 @@ #include <sys/cdefs.h> #ifndef lint -__KERNEL_RCSID(0, "$NetBSD: nilfs_vfsops.c,v 1.7 2011/11/13 18:29:08 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nilfs_vfsops.c,v 1.8 2011/11/14 18:35:13 hannken Exp $"); #endif /* not lint */ @@ -618,7 +618,9 @@ nilfs_mount_device(struct vnode *devvp, * Open device read-write; TODO how about upgrading later when needed? */ openflags = FREAD | FWRITE; + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); error = VOP_OPEN(devvp, openflags, FSCRED); + VOP_UNLOCK(devvp); if (error) { vrele(devvp); return error; Index: src/sys/fs/ntfs/ntfs_vfsops.c diff -u src/sys/fs/ntfs/ntfs_vfsops.c:1.86 src/sys/fs/ntfs/ntfs_vfsops.c:1.87 --- src/sys/fs/ntfs/ntfs_vfsops.c:1.86 Sun Jun 12 03:35:53 2011 +++ src/sys/fs/ntfs/ntfs_vfsops.c Mon Nov 14 18:35:13 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ntfs_vfsops.c,v 1.86 2011/06/12 03:35:53 rmind Exp $ */ +/* $NetBSD: ntfs_vfsops.c,v 1.87 2011/11/14 18:35:13 hannken Exp $ */ /*- * Copyright (c) 1998, 1999 Semen Ustimenko @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ntfs_vfsops.c,v 1.86 2011/06/12 03:35:53 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ntfs_vfsops.c,v 1.87 2011/11/14 18:35:13 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -270,7 +270,9 @@ ntfs_mount ( flags = FREAD; else flags = FREAD|FWRITE; + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); err = VOP_OPEN(devvp, flags, FSCRED); + VOP_UNLOCK(devvp); if (err) goto fail; err = ntfs_mountfs(devvp, mp, args, l); Index: src/sys/fs/udf/udf_vfsops.c diff -u src/sys/fs/udf/udf_vfsops.c:1.61 src/sys/fs/udf/udf_vfsops.c:1.62 --- src/sys/fs/udf/udf_vfsops.c:1.61 Tue Sep 27 01:13:16 2011 +++ src/sys/fs/udf/udf_vfsops.c Mon Nov 14 18:35:14 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: udf_vfsops.c,v 1.61 2011/09/27 01:13:16 christos Exp $ */ +/* $NetBSD: udf_vfsops.c,v 1.62 2011/11/14 18:35:14 hannken Exp $ */ /* * Copyright (c) 2006, 2008 Reinoud Zandijk @@ -28,7 +28,7 @@ #include <sys/cdefs.h> #ifndef lint -__KERNEL_RCSID(0, "$NetBSD: udf_vfsops.c,v 1.61 2011/09/27 01:13:16 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udf_vfsops.c,v 1.62 2011/11/14 18:35:14 hannken Exp $"); #endif /* not lint */ @@ -395,7 +395,9 @@ udf_mount(struct mount *mp, const char * } else { openflags = FREAD | FWRITE; } + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); error = VOP_OPEN(devvp, openflags, FSCRED); + VOP_UNLOCK(devvp); if (error == 0) { /* opened ok, try mounting */ error = udf_mountfs(devvp, mp, l, args); Index: src/sys/ufs/ext2fs/ext2fs_vfsops.c diff -u src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.161 src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.162 --- src/sys/ufs/ext2fs/ext2fs_vfsops.c:1.161 Fri Oct 7 09:35:06 2011 +++ src/sys/ufs/ext2fs/ext2fs_vfsops.c Mon Nov 14 18:35:14 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ext2fs_vfsops.c,v 1.161 2011/10/07 09:35:06 hannken Exp $ */ +/* $NetBSD: ext2fs_vfsops.c,v 1.162 2011/11/14 18:35:14 hannken Exp $ */ /* * Copyright (c) 1989, 1991, 1993, 1994 @@ -60,7 +60,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.161 2011/10/07 09:35:06 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ext2fs_vfsops.c,v 1.162 2011/11/14 18:35:14 hannken Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -406,7 +406,9 @@ ext2fs_mount(struct mount *mp, const cha xflags = FREAD; else xflags = FREAD|FWRITE; + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); error = VOP_OPEN(devvp, xflags, FSCRED); + VOP_UNLOCK(devvp); if (error) goto fail; error = ext2fs_mountfs(devvp, mp); Index: src/sys/ufs/ffs/ffs_vfsops.c diff -u src/sys/ufs/ffs/ffs_vfsops.c:1.270 src/sys/ufs/ffs/ffs_vfsops.c:1.271 --- src/sys/ufs/ffs/ffs_vfsops.c:1.270 Sun Nov 13 23:10:34 2011 +++ src/sys/ufs/ffs/ffs_vfsops.c Mon Nov 14 18:35:14 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: ffs_vfsops.c,v 1.270 2011/11/13 23:10:34 christos Exp $ */ +/* $NetBSD: ffs_vfsops.c,v 1.271 2011/11/14 18:35:14 hannken Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.270 2011/11/13 23:10:34 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.271 2011/11/14 18:35:14 hannken Exp $"); #if defined(_KERNEL_OPT) #include "opt_ffs.h" @@ -429,7 +429,9 @@ ffs_mount(struct mount *mp, const char * xflags = FREAD; else xflags = FREAD | FWRITE; + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); error = VOP_OPEN(devvp, xflags, FSCRED); + VOP_UNLOCK(devvp); if (error) goto fail; error = ffs_mountfs(devvp, mp, l); Index: src/sys/ufs/lfs/lfs_vfsops.c diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.290 src/sys/ufs/lfs/lfs_vfsops.c:1.291 --- src/sys/ufs/lfs/lfs_vfsops.c:1.290 Mon Jul 11 08:27:40 2011 +++ src/sys/ufs/lfs/lfs_vfsops.c Mon Nov 14 18:35:14 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vfsops.c,v 1.290 2011/07/11 08:27:40 hannken Exp $ */ +/* $NetBSD: lfs_vfsops.c,v 1.291 2011/11/14 18:35:14 hannken Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007 @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.290 2011/07/11 08:27:40 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.291 2011/11/14 18:35:14 hannken Exp $"); #if defined(_KERNEL_OPT) #include "opt_lfs.h" @@ -670,7 +670,9 @@ lfs_mount(struct mount *mp, const char * flags = FREAD; else flags = FREAD|FWRITE; + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); error = VOP_OPEN(devvp, flags, FSCRED); + VOP_UNLOCK(devvp); if (error) goto fail; error = lfs_mountfs(devvp, mp, l); /* LFS */