Module Name: src
Committed By: hannken
Date: Fri Oct 14 09:23:31 UTC 2011
Modified Files:
src/sys/compat/linux/common: linux_file.c linux_file64.c linux_ioctl.c
linux_misc.c
src/sys/compat/linux32/common: linux32_dirent.c
src/sys/compat/ossaudio: ossaudio.c
src/sys/compat/svr4: svr4_fcntl.c
src/sys/compat/svr4_32: svr4_32_fcntl.c
src/sys/dev: ccd.c cgd.c vnd.c
src/sys/dev/dm: dm_target_linear.c dm_target_snapshot.c
dm_target_stripe.c
src/sys/dev/raidframe: rf_copyback.c rf_disks.c rf_reconstruct.c
src/sys/kern: kern_verifiedexec.c vfs_mount.c vfs_syscalls.c
vfs_vnops.c vnode_if.src
src/sys/uvm: uvm_mmap.c
Log Message:
Change the vnode locking protocol of VOP_GETATTR() to request at least
a shared lock. Make all calls outside of file systems respect it.
The calls from file systems need review.
No objections from tech-kern.
To generate a diff of this commit:
cvs rdiff -u -r1.103 -r1.104 src/sys/compat/linux/common/linux_file.c
cvs rdiff -u -r1.52 -r1.53 src/sys/compat/linux/common/linux_file64.c
cvs rdiff -u -r1.55 -r1.56 src/sys/compat/linux/common/linux_ioctl.c
cvs rdiff -u -r1.218 -r1.219 src/sys/compat/linux/common/linux_misc.c
cvs rdiff -u -r1.12 -r1.13 src/sys/compat/linux32/common/linux32_dirent.c
cvs rdiff -u -r1.66 -r1.67 src/sys/compat/ossaudio/ossaudio.c
cvs rdiff -u -r1.70 -r1.71 src/sys/compat/svr4/svr4_fcntl.c
cvs rdiff -u -r1.34 -r1.35 src/sys/compat/svr4_32/svr4_32_fcntl.c
cvs rdiff -u -r1.141 -r1.142 src/sys/dev/ccd.c
cvs rdiff -u -r1.74 -r1.75 src/sys/dev/cgd.c
cvs rdiff -u -r1.218 -r1.219 src/sys/dev/vnd.c
cvs rdiff -u -r1.12 -r1.13 src/sys/dev/dm/dm_target_linear.c
cvs rdiff -u -r1.14 -r1.15 src/sys/dev/dm/dm_target_snapshot.c
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/dm/dm_target_stripe.c
cvs rdiff -u -r1.48 -r1.49 src/sys/dev/raidframe/rf_copyback.c
cvs rdiff -u -r1.81 -r1.82 src/sys/dev/raidframe/rf_disks.c
cvs rdiff -u -r1.116 -r1.117 src/sys/dev/raidframe/rf_reconstruct.c
cvs rdiff -u -r1.126 -r1.127 src/sys/kern/kern_verifiedexec.c
cvs rdiff -u -r1.10 -r1.11 src/sys/kern/vfs_mount.c
cvs rdiff -u -r1.439 -r1.440 src/sys/kern/vfs_syscalls.c
cvs rdiff -u -r1.182 -r1.183 src/sys/kern/vfs_vnops.c
cvs rdiff -u -r1.62 -r1.63 src/sys/kern/vnode_if.src
cvs rdiff -u -r1.138 -r1.139 src/sys/uvm/uvm_mmap.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/compat/linux/common/linux_file.c
diff -u src/sys/compat/linux/common/linux_file.c:1.103 src/sys/compat/linux/common/linux_file.c:1.104
--- src/sys/compat/linux/common/linux_file.c:1.103 Thu Apr 14 00:59:06 2011
+++ src/sys/compat/linux/common/linux_file.c Fri Oct 14 09:23:28 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_file.c,v 1.103 2011/04/14 00:59:06 christos Exp $ */
+/* $NetBSD: linux_file.c,v 1.104 2011/10/14 09:23:28 hannken Exp $ */
/*-
* Copyright (c) 1995, 1998, 2008 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_file.c,v 1.103 2011/04/14 00:59:06 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_file.c,v 1.104 2011/10/14 09:23:28 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -340,7 +340,9 @@ linux_sys_fcntl(struct lwp *l, const str
break;
}
+ vn_lock(vp, LK_SHARED | LK_RETRY);
error = VOP_GETATTR(vp, &va, l->l_cred);
+ VOP_UNLOCK(vp);
fd_putfile(fd);
Index: src/sys/compat/linux/common/linux_file64.c
diff -u src/sys/compat/linux/common/linux_file64.c:1.52 src/sys/compat/linux/common/linux_file64.c:1.53
--- src/sys/compat/linux/common/linux_file64.c:1.52 Thu Sep 1 12:44:10 2011
+++ src/sys/compat/linux/common/linux_file64.c Fri Oct 14 09:23:28 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_file64.c,v 1.52 2011/09/01 12:44:10 njoly Exp $ */
+/* $NetBSD: linux_file64.c,v 1.53 2011/10/14 09:23:28 hannken Exp $ */
/*-
* Copyright (c) 1995, 1998, 2000, 2008 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_file64.c,v 1.52 2011/09/01 12:44:10 njoly Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_file64.c,v 1.53 2011/10/14 09:23:28 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -258,7 +258,10 @@ linux_sys_getdents64(struct lwp *l, cons
goto out1;
}
- if ((error = VOP_GETATTR(vp, &va, l->l_cred)))
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vp, &va, l->l_cred);
+ VOP_UNLOCK(vp);
+ if (error)
goto out1;
nbytes = SCARG(uap, count);
Index: src/sys/compat/linux/common/linux_ioctl.c
diff -u src/sys/compat/linux/common/linux_ioctl.c:1.55 src/sys/compat/linux/common/linux_ioctl.c:1.56
--- src/sys/compat/linux/common/linux_ioctl.c:1.55 Sat Jul 19 23:01:52 2008
+++ src/sys/compat/linux/common/linux_ioctl.c Fri Oct 14 09:23:28 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_ioctl.c,v 1.55 2008/07/19 23:01:52 jmcneill Exp $ */
+/* $NetBSD: linux_ioctl.c,v 1.56 2011/10/14 09:23:28 hannken Exp $ */
/*-
* Copyright (c) 1995, 1998, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_ioctl.c,v 1.55 2008/07/19 23:01:52 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_ioctl.c,v 1.56 2011/10/14 09:23:28 hannken Exp $");
#if defined(_KERNEL_OPT)
#include "sequencer.h"
@@ -128,6 +128,7 @@ linux_sys_ioctl(struct lwp *l, const str
* way. We do it by indexing in the cdevsw with the major
* device number and check if that is the sequencer entry.
*/
+ bool is_sequencer = false;
struct file *fp;
struct vnode *vp;
struct vattr va;
@@ -137,9 +138,15 @@ linux_sys_ioctl(struct lwp *l, const str
return EBADF;
if (fp->f_type == DTYPE_VNODE &&
(vp = (struct vnode *)fp->f_data) != NULL &&
- vp->v_type == VCHR &&
- VOP_GETATTR(vp, &va, l->l_cred) == 0 &&
- cdevsw_lookup(va.va_rdev) == &sequencer_cdevsw) {
+ vp->v_type == VCHR) {
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vp, &va, l->l_cred);
+ VOP_UNLOCK(vp);
+ if (error == 0 &&
+ cdevsw_lookup(va.va_rdev) == &sequencer_cdevsw)
+ is_sequencer = true;
+ }
+ if (is_sequencer) {
error = oss_ioctl_sequencer(l, (const void *)LINUX_TO_OSS(uap),
retval);
}
Index: src/sys/compat/linux/common/linux_misc.c
diff -u src/sys/compat/linux/common/linux_misc.c:1.218 src/sys/compat/linux/common/linux_misc.c:1.219
--- src/sys/compat/linux/common/linux_misc.c:1.218 Tue Nov 2 18:18:07 2010
+++ src/sys/compat/linux/common/linux_misc.c Fri Oct 14 09:23:28 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_misc.c,v 1.218 2010/11/02 18:18:07 chs Exp $ */
+/* $NetBSD: linux_misc.c,v 1.219 2011/10/14 09:23:28 hannken Exp $ */
/*-
* Copyright (c) 1995, 1998, 1999, 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.218 2010/11/02 18:18:07 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.219 2011/10/14 09:23:28 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -696,7 +696,10 @@ linux_sys_getdents(struct lwp *l, const
goto out1;
}
- if ((error = VOP_GETATTR(vp, &va, l->l_cred)))
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vp, &va, l->l_cred);
+ VOP_UNLOCK(vp);
+ if (error)
goto out1;
nbytes = SCARG(uap, count);
Index: src/sys/compat/linux32/common/linux32_dirent.c
diff -u src/sys/compat/linux32/common/linux32_dirent.c:1.12 src/sys/compat/linux32/common/linux32_dirent.c:1.13
--- src/sys/compat/linux32/common/linux32_dirent.c:1.12 Sat Sep 11 20:53:04 2010
+++ src/sys/compat/linux32/common/linux32_dirent.c Fri Oct 14 09:23:29 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_dirent.c,v 1.12 2010/09/11 20:53:04 chs Exp $ */
+/* $NetBSD: linux32_dirent.c,v 1.13 2011/10/14 09:23:29 hannken Exp $ */
/*-
* Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -33,7 +33,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_dirent.c,v 1.12 2010/09/11 20:53:04 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_dirent.c,v 1.13 2011/10/14 09:23:29 hannken Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -130,7 +130,10 @@ linux32_sys_getdents(struct lwp *l, cons
goto out1;
}
- if ((error = VOP_GETATTR(vp, &va, l->l_cred)))
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vp, &va, l->l_cred);
+ VOP_UNLOCK(vp);
+ if (error)
goto out1;
nbytes = SCARG(uap, count);
Index: src/sys/compat/ossaudio/ossaudio.c
diff -u src/sys/compat/ossaudio/ossaudio.c:1.66 src/sys/compat/ossaudio/ossaudio.c:1.67
--- src/sys/compat/ossaudio/ossaudio.c:1.66 Tue Sep 6 01:19:34 2011
+++ src/sys/compat/ossaudio/ossaudio.c Fri Oct 14 09:23:29 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: ossaudio.c,v 1.66 2011/09/06 01:19:34 jmcneill Exp $ */
+/* $NetBSD: ossaudio.c,v 1.67 2011/10/14 09:23:29 hannken Exp $ */
/*-
* Copyright (c) 1997, 2008 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ossaudio.c,v 1.66 2011/09/06 01:19:34 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ossaudio.c,v 1.67 2011/10/14 09:23:29 hannken Exp $");
#include <sys/param.h>
#include <sys/proc.h>
@@ -935,7 +935,7 @@ getdevinfo(file_t *fp)
struct vattr va;
static struct audiodevinfo devcache;
struct audiodevinfo *di = &devcache;
- int mlen, dlen;
+ int error, mlen, dlen;
/*
* Figure out what device it is so we can check if the
@@ -944,7 +944,10 @@ getdevinfo(file_t *fp)
vp = fp->f_data;
if (vp->v_type != VCHR)
return 0;
- if (VOP_GETATTR(vp, &va, kauth_cred_get()))
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vp, &va, kauth_cred_get());
+ VOP_UNLOCK(vp);
+ if (error)
return 0;
if (di->done && di->dev == va.va_rdev)
return di;
Index: src/sys/compat/svr4/svr4_fcntl.c
diff -u src/sys/compat/svr4/svr4_fcntl.c:1.70 src/sys/compat/svr4/svr4_fcntl.c:1.71
--- src/sys/compat/svr4/svr4_fcntl.c:1.70 Mon Apr 28 20:23:45 2008
+++ src/sys/compat/svr4/svr4_fcntl.c Fri Oct 14 09:23:29 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: svr4_fcntl.c,v 1.70 2008/04/28 20:23:45 martin Exp $ */
+/* $NetBSD: svr4_fcntl.c,v 1.71 2011/10/14 09:23:29 hannken Exp $ */
/*-
* Copyright (c) 1994, 1997, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_fcntl.c,v 1.70 2008/04/28 20:23:45 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_fcntl.c,v 1.71 2011/10/14 09:23:29 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -263,7 +263,10 @@ fd_truncate(struct lwp *l, int fd, struc
fd_putfile(fd);
return ESPIPE;
}
- if ((error = VOP_GETATTR(vp, &vattr, l->l_cred)) != 0) {
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vp, &vattr, l->l_cred);
+ VOP_UNLOCK(vp);
+ if (error) {
fd_putfile(fd);
return error;
}
Index: src/sys/compat/svr4_32/svr4_32_fcntl.c
diff -u src/sys/compat/svr4_32/svr4_32_fcntl.c:1.34 src/sys/compat/svr4_32/svr4_32_fcntl.c:1.35
--- src/sys/compat/svr4_32/svr4_32_fcntl.c:1.34 Mon Apr 28 20:23:46 2008
+++ src/sys/compat/svr4_32/svr4_32_fcntl.c Fri Oct 14 09:23:29 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: svr4_32_fcntl.c,v 1.34 2008/04/28 20:23:46 martin Exp $ */
+/* $NetBSD: svr4_32_fcntl.c,v 1.35 2011/10/14 09:23:29 hannken Exp $ */
/*-
* Copyright (c) 1994, 1997, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_32_fcntl.c,v 1.34 2008/04/28 20:23:46 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_32_fcntl.c,v 1.35 2011/10/14 09:23:29 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -261,7 +261,10 @@ fd_truncate(struct lwp *l, int fd, struc
fd_putfile(fd);
return ESPIPE;
}
- if ((error = VOP_GETATTR(vp, &vattr, l->l_cred)) != 0) {
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vp, &vattr, l->l_cred);
+ VOP_UNLOCK(vp);
+ if (error) {
fd_putfile(fd);
return error;
}
Index: src/sys/dev/ccd.c
diff -u src/sys/dev/ccd.c:1.141 src/sys/dev/ccd.c:1.142
--- src/sys/dev/ccd.c:1.141 Mon Jul 4 16:06:45 2011
+++ src/sys/dev/ccd.c Fri Oct 14 09:23:29 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: ccd.c,v 1.141 2011/07/04 16:06:45 joerg Exp $ */
+/* $NetBSD: ccd.c,v 1.142 2011/10/14 09:23:29 hannken Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 1999, 2007, 2009 The NetBSD Foundation, Inc.
@@ -88,7 +88,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.141 2011/07/04 16:06:45 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.142 2011/10/14 09:23:29 hannken Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -310,7 +310,10 @@ ccdinit(struct ccd_softc *cs, char **cpa
/*
* XXX: Cache the component's dev_t.
*/
- if ((error = VOP_GETATTR(vpp[ix], &va, l->l_cred)) != 0) {
+ vn_lock(vpp[ix], LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vpp[ix], &va, l->l_cred);
+ VOP_UNLOCK(vpp[ix]);
+ if (error != 0) {
#ifdef DEBUG
if (ccddebug & (CCDB_FOLLOW|CCDB_INIT))
printf("%s: %s: getattr failed %s = %d\n",
Index: src/sys/dev/cgd.c
diff -u src/sys/dev/cgd.c:1.74 src/sys/dev/cgd.c:1.75
--- src/sys/dev/cgd.c:1.74 Tue Jun 21 06:23:38 2011
+++ src/sys/dev/cgd.c Fri Oct 14 09:23:30 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: cgd.c,v 1.74 2011/06/21 06:23:38 jruoho Exp $ */
+/* $NetBSD: cgd.c,v 1.75 2011/10/14 09:23:30 hannken Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.74 2011/06/21 06:23:38 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.75 2011/10/14 09:23:30 hannken Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -773,7 +773,10 @@ cgdinit(struct cgd_softc *cs, const char
cs->sc_tpath = malloc(cs->sc_tpathlen, M_DEVBUF, M_WAITOK);
memcpy(cs->sc_tpath, tmppath, cs->sc_tpathlen);
- if ((ret = VOP_GETATTR(vp, &va, l->l_cred)) != 0)
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ ret = VOP_GETATTR(vp, &va, l->l_cred);
+ VOP_UNLOCK(vp);
+ if (ret != 0)
goto bail;
cs->sc_tdev = va.va_rdev;
Index: src/sys/dev/vnd.c
diff -u src/sys/dev/vnd.c:1.218 src/sys/dev/vnd.c:1.219
--- src/sys/dev/vnd.c:1.218 Wed Jun 29 09:12:42 2011
+++ src/sys/dev/vnd.c Fri Oct 14 09:23:30 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: vnd.c,v 1.218 2011/06/29 09:12:42 hannken Exp $ */
+/* $NetBSD: vnd.c,v 1.219 2011/10/14 09:23:30 hannken Exp $ */
/*-
* Copyright (c) 1996, 1997, 1998, 2008 The NetBSD Foundation, Inc.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.218 2011/06/29 09:12:42 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.219 2011/10/14 09:23:30 hannken Exp $");
#if defined(_KERNEL_OPT)
#include "opt_vnd.h"
@@ -918,6 +918,7 @@ vndwrite(dev_t dev, struct uio *uio, int
static int
vnd_cget(struct lwp *l, int unit, int *un, struct vattr *va)
{
+ int error;
struct vnd_softc *vnd;
if (*un == -1)
@@ -932,7 +933,10 @@ vnd_cget(struct lwp *l, int unit, int *u
if ((vnd->sc_flags & VNF_INITED) == 0)
return -1;
- return VOP_GETATTR(vnd->sc_vp, va, l->l_cred);
+ vn_lock(vnd->sc_vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vnd->sc_vp, va, l->l_cred);
+ VOP_UNLOCK(vnd->sc_vp);
+ return error;
}
static int
Index: src/sys/dev/dm/dm_target_linear.c
diff -u src/sys/dev/dm/dm_target_linear.c:1.12 src/sys/dev/dm/dm_target_linear.c:1.13
--- src/sys/dev/dm/dm_target_linear.c:1.12 Thu Dec 23 14:58:13 2010
+++ src/sys/dev/dm/dm_target_linear.c Fri Oct 14 09:23:30 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: dm_target_linear.c,v 1.12 2010/12/23 14:58:13 mlelstv Exp $ */
+/* $NetBSD: dm_target_linear.c,v 1.13 2011/10/14 09:23:30 hannken Exp $ */
/*
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -201,7 +201,10 @@ dm_target_linear_deps(dm_table_entry_t *
tlc = table_en->target_config;
- if ((error = VOP_GETATTR(tlc->pdev->pdev_vnode, &va, curlwp->l_cred)) != 0)
+ vn_lock(tlc->pdev->pdev_vnode, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(tlc->pdev->pdev_vnode, &va, curlwp->l_cred);
+ VOP_UNLOCK(tlc->pdev->pdev_vnode);
+ if (error != 0)
return error;
prop_array_add_uint64(prop_array, (uint64_t) va.va_rdev);
Index: src/sys/dev/dm/dm_target_snapshot.c
diff -u src/sys/dev/dm/dm_target_snapshot.c:1.14 src/sys/dev/dm/dm_target_snapshot.c:1.15
--- src/sys/dev/dm/dm_target_snapshot.c:1.14 Thu Dec 23 14:58:13 2010
+++ src/sys/dev/dm/dm_target_snapshot.c Fri Oct 14 09:23:30 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: dm_target_snapshot.c,v 1.14 2010/12/23 14:58:13 mlelstv Exp $ */
+/* $NetBSD: dm_target_snapshot.c,v 1.15 2011/10/14 09:23:30 hannken Exp $ */
/*
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -357,15 +357,21 @@ dm_target_snapshot_deps(dm_table_entry_t
tsc = table_en->target_config;
- if ((error = VOP_GETATTR(tsc->tsc_snap_dev->pdev_vnode, &va, curlwp->l_cred)) != 0)
+ vn_lock(tsc->tsc_snap_dev->pdev_vnode, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(tsc->tsc_snap_dev->pdev_vnode, &va, curlwp->l_cred);
+ VOP_UNLOCK(tsc->tsc_snap_dev->pdev_vnode);
+ if (error != 0)
return error;
prop_array_add_uint64(prop_array, (uint64_t) va.va_rdev);
if (tsc->tsc_persistent_dev) {
- if ((error = VOP_GETATTR(tsc->tsc_cow_dev->pdev_vnode, &va,
- curlwp->l_cred)) != 0)
+ vn_lock(tsc->tsc_cow_dev->pdev_vnode, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(tsc->tsc_cow_dev->pdev_vnode, &va,
+ curlwp->l_cred);
+ VOP_UNLOCK(tsc->tsc_cow_dev->pdev_vnode);
+ if (error != 0)
return error;
prop_array_add_uint64(prop_array, (uint64_t) va.va_rdev);
@@ -534,8 +540,11 @@ dm_target_snapshot_orig_deps(dm_table_en
tsoc = table_en->target_config;
- if ((error = VOP_GETATTR(tsoc->tsoc_real_dev->pdev_vnode, &va,
- curlwp->l_cred)) != 0)
+ vn_lock(tsoc->tsoc_real_dev->pdev_vnode, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(tsoc->tsoc_real_dev->pdev_vnode, &va,
+ curlwp->l_cred);
+ VOP_UNLOCK(tsoc->tsoc_real_dev->pdev_vnode);
+ if (error != 0)
return error;
prop_array_add_uint64(prop_array, (uint64_t) va.va_rdev);
Index: src/sys/dev/dm/dm_target_stripe.c
diff -u src/sys/dev/dm/dm_target_stripe.c:1.15 src/sys/dev/dm/dm_target_stripe.c:1.16
--- src/sys/dev/dm/dm_target_stripe.c:1.15 Sat Aug 27 17:09:09 2011
+++ src/sys/dev/dm/dm_target_stripe.c Fri Oct 14 09:23:30 2011
@@ -1,4 +1,4 @@
-/*$NetBSD: dm_target_stripe.c,v 1.15 2011/08/27 17:09:09 ahoka Exp $*/
+/*$NetBSD: dm_target_stripe.c,v 1.16 2011/10/14 09:23:30 hannken Exp $*/
/*
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -329,7 +329,10 @@ dm_target_stripe_deps(dm_table_entry_t *
tsc = table_en->target_config;
TAILQ_FOREACH(tlc, &tsc->stripe_devs, entries) {
- if ((error = VOP_GETATTR(tlc->pdev->pdev_vnode, &va, curlwp->l_cred)) != 0)
+ vn_lock(tlc->pdev->pdev_vnode, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(tlc->pdev->pdev_vnode, &va, curlwp->l_cred);
+ VOP_UNLOCK(tlc->pdev->pdev_vnode);
+ if (error != 0)
return error;
prop_array_add_uint64(prop_array, (uint64_t) va.va_rdev);
Index: src/sys/dev/raidframe/rf_copyback.c
diff -u src/sys/dev/raidframe/rf_copyback.c:1.48 src/sys/dev/raidframe/rf_copyback.c:1.49
--- src/sys/dev/raidframe/rf_copyback.c:1.48 Wed Aug 3 14:44:38 2011
+++ src/sys/dev/raidframe/rf_copyback.c Fri Oct 14 09:23:30 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_copyback.c,v 1.48 2011/08/03 14:44:38 oster Exp $ */
+/* $NetBSD: rf_copyback.c,v 1.49 2011/10/14 09:23:30 hannken Exp $ */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
* All rights reserved.
@@ -38,7 +38,7 @@
****************************************************************************/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_copyback.c,v 1.48 2011/08/03 14:44:38 oster Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_copyback.c,v 1.49 2011/10/14 09:23:30 hannken Exp $");
#include <dev/raidframe/raidframevar.h>
@@ -160,7 +160,10 @@ rf_CopybackReconstructedData(RF_Raid_t *
/* Ok, so we can at least do a lookup... How about actually
* getting a vp for it? */
- if ((retcode = VOP_GETATTR(vp, &va, curlwp->l_cred)) != 0)
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ retcode = VOP_GETATTR(vp, &va, curlwp->l_cred);
+ VOP_UNLOCK(vp);
+ if (retcode != 0)
return;
retcode = rf_getdisksize(vp, &raidPtr->Disks[fcol]);
if (retcode) {
Index: src/sys/dev/raidframe/rf_disks.c
diff -u src/sys/dev/raidframe/rf_disks.c:1.81 src/sys/dev/raidframe/rf_disks.c:1.82
--- src/sys/dev/raidframe/rf_disks.c:1.81 Wed Aug 3 14:44:38 2011
+++ src/sys/dev/raidframe/rf_disks.c Fri Oct 14 09:23:30 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_disks.c,v 1.81 2011/08/03 14:44:38 oster Exp $ */
+/* $NetBSD: rf_disks.c,v 1.82 2011/10/14 09:23:30 hannken Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -60,7 +60,7 @@
***************************************************************/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_disks.c,v 1.81 2011/08/03 14:44:38 oster Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_disks.c,v 1.82 2011/10/14 09:23:30 hannken Exp $");
#include <dev/raidframe/raidframevar.h>
@@ -630,7 +630,10 @@ rf_ConfigureDisk(RF_Raid_t *raidPtr, cha
raidPtr->bytesPerSector = diskPtr->blockSize;
if (diskPtr->status == rf_ds_optimal) {
- if ((error = VOP_GETATTR(vp, &va, curlwp->l_cred)) != 0)
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vp, &va, curlwp->l_cred);
+ VOP_UNLOCK(vp);
+ if (error != 0)
return (error);
raidPtr->raid_cinfo[col].ci_vp = vp;
Index: src/sys/dev/raidframe/rf_reconstruct.c
diff -u src/sys/dev/raidframe/rf_reconstruct.c:1.116 src/sys/dev/raidframe/rf_reconstruct.c:1.117
--- src/sys/dev/raidframe/rf_reconstruct.c:1.116 Wed Aug 3 15:00:29 2011
+++ src/sys/dev/raidframe/rf_reconstruct.c Fri Oct 14 09:23:30 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: rf_reconstruct.c,v 1.116 2011/08/03 15:00:29 oster Exp $ */
+/* $NetBSD: rf_reconstruct.c,v 1.117 2011/10/14 09:23:30 hannken Exp $ */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
* All rights reserved.
@@ -33,7 +33,7 @@
************************************************************/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_reconstruct.c,v 1.116 2011/08/03 15:00:29 oster Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_reconstruct.c,v 1.117 2011/10/14 09:23:30 hannken Exp $");
#include <sys/param.h>
#include <sys/time.h>
@@ -456,7 +456,10 @@ rf_ReconstructInPlace(RF_Raid_t *raidPtr
/* Ok, so we can at least do a lookup...
How about actually getting a vp for it? */
- if ((retcode = VOP_GETATTR(vp, &va, curlwp->l_cred)) != 0) {
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ retcode = VOP_GETATTR(vp, &va, curlwp->l_cred);
+ VOP_UNLOCK(vp);
+ if (retcode != 0) {
vn_close(vp, FREAD | FWRITE, kauth_cred_get());
rf_lock_mutex2(raidPtr->mutex);
raidPtr->reconInProgress--;
Index: src/sys/kern/kern_verifiedexec.c
diff -u src/sys/kern/kern_verifiedexec.c:1.126 src/sys/kern/kern_verifiedexec.c:1.127
--- src/sys/kern/kern_verifiedexec.c:1.126 Thu Sep 1 18:33:11 2011
+++ src/sys/kern/kern_verifiedexec.c Fri Oct 14 09:23:31 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_verifiedexec.c,v 1.126 2011/09/01 18:33:11 matt Exp $ */
+/* $NetBSD: kern_verifiedexec.c,v 1.127 2011/10/14 09:23:31 hannken Exp $ */
/*-
* Copyright (c) 2005, 2006 Elad Efrat <[email protected]>
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_verifiedexec.c,v 1.126 2011/09/01 18:33:11 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_verifiedexec.c,v 1.127 2011/10/14 09:23:31 hannken Exp $");
#include "opt_veriexec.h"
@@ -411,7 +411,9 @@ veriexec_fp_calc(struct lwp *l, struct v
size_t resid, npages;
int error, do_perpage, pagen;
+ vn_lock(vp, LK_SHARED | LK_RETRY);
error = VOP_GETATTR(vp, &va, l->l_cred);
+ VOP_UNLOCK(vp);
if (error)
return (error);
Index: src/sys/kern/vfs_mount.c
diff -u src/sys/kern/vfs_mount.c:1.10 src/sys/kern/vfs_mount.c:1.11
--- src/sys/kern/vfs_mount.c:1.10 Fri Oct 7 09:35:05 2011
+++ src/sys/kern/vfs_mount.c Fri Oct 14 09:23:31 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_mount.c,v 1.10 2011/10/07 09:35:05 hannken Exp $ */
+/* $NetBSD: vfs_mount.c,v 1.11 2011/10/14 09:23:31 hannken Exp $ */
/*-
* Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.10 2011/10/07 09:35:05 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.11 2011/10/14 09:23:31 hannken Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -664,8 +664,14 @@ mount_domount(struct lwp *l, vnode_t **v
* If the user is not root, ensure that they own the directory
* onto which we are attempting to mount.
*/
- if ((error = VOP_GETATTR(vp, &va, l->l_cred)) != 0 ||
- (va.va_uid != kauth_cred_geteuid(l->l_cred) &&
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vp, &va, l->l_cred);
+ VOP_UNLOCK(vp);
+ if (error != 0) {
+ vfs_delref(vfsops);
+ return error;
+ }
+ if ((va.va_uid != kauth_cred_geteuid(l->l_cred) &&
(error = kauth_authorize_generic(l->l_cred,
KAUTH_GENERIC_ISSUSER, NULL)) != 0)) {
vfs_delref(vfsops);
Index: src/sys/kern/vfs_syscalls.c
diff -u src/sys/kern/vfs_syscalls.c:1.439 src/sys/kern/vfs_syscalls.c:1.440
--- src/sys/kern/vfs_syscalls.c:1.439 Mon Aug 22 22:12:34 2011
+++ src/sys/kern/vfs_syscalls.c Fri Oct 14 09:23:31 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_syscalls.c,v 1.439 2011/08/22 22:12:34 enami Exp $ */
+/* $NetBSD: vfs_syscalls.c,v 1.440 2011/10/14 09:23:31 hannken Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.439 2011/08/22 22:12:34 enami Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.440 2011/10/14 09:23:31 hannken Exp $");
#ifdef _KERNEL_OPT
#include "opt_fileassoc.h"
@@ -2160,7 +2160,9 @@ sys_lseek(struct lwp *l, const struct sy
newoff = fp->f_offset + SCARG(uap, offset);
break;
case SEEK_END:
+ vn_lock(vp, LK_SHARED | LK_RETRY);
error = VOP_GETATTR(vp, &vattr, cred);
+ VOP_UNLOCK(vp);
if (error) {
goto out;
}
@@ -3828,7 +3830,10 @@ dorevoke(struct vnode *vp, kauth_cred_t
struct vattr vattr;
int error;
- if ((error = VOP_GETATTR(vp, &vattr, cred)) != 0)
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vp, &vattr, cred);
+ VOP_UNLOCK(vp);
+ if (error != 0)
return error;
if (kauth_cred_geteuid(cred) == vattr.va_uid ||
(error = kauth_authorize_generic(cred,
Index: src/sys/kern/vfs_vnops.c
diff -u src/sys/kern/vfs_vnops.c:1.182 src/sys/kern/vfs_vnops.c:1.183
--- src/sys/kern/vfs_vnops.c:1.182 Tue Aug 16 22:33:38 2011
+++ src/sys/kern/vfs_vnops.c Fri Oct 14 09:23:31 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_vnops.c,v 1.182 2011/08/16 22:33:38 yamt Exp $ */
+/* $NetBSD: vfs_vnops.c,v 1.183 2011/10/14 09:23:31 hannken Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnops.c,v 1.182 2011/08/16 22:33:38 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnops.c,v 1.183 2011/10/14 09:23:31 hannken Exp $");
#include "veriexec.h"
@@ -689,8 +689,9 @@ vn_ioctl(file_t *fp, u_long com, void *d
case VREG:
case VDIR:
if (com == FIONREAD) {
- error = VOP_GETATTR(vp, &vattr,
- kauth_cred_get());
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vp, &vattr, kauth_cred_get());
+ VOP_UNLOCK(vp);
if (error)
return (error);
*(int *)data = vattr.va_size - fp->f_offset;
Index: src/sys/kern/vnode_if.src
diff -u src/sys/kern/vnode_if.src:1.62 src/sys/kern/vnode_if.src:1.63
--- src/sys/kern/vnode_if.src:1.62 Mon Jul 11 08:23:00 2011
+++ src/sys/kern/vnode_if.src Fri Oct 14 09:23:31 2011
@@ -1,4 +1,4 @@
-# $NetBSD: vnode_if.src,v 1.62 2011/07/11 08:23:00 hannken Exp $
+# $NetBSD: vnode_if.src,v 1.63 2011/10/14 09:23:31 hannken Exp $
#
# Copyright (c) 1992, 1993
# The Regents of the University of California. All rights reserved.
@@ -141,7 +141,7 @@ vop_access {
};
#
-#% getattr vp = = =
+#% getattr vp L L L
#
vop_getattr {
IN struct vnode *vp;
Index: src/sys/uvm/uvm_mmap.c
diff -u src/sys/uvm/uvm_mmap.c:1.138 src/sys/uvm/uvm_mmap.c:1.139
--- src/sys/uvm/uvm_mmap.c:1.138 Wed Oct 12 00:03:47 2011
+++ src/sys/uvm/uvm_mmap.c Fri Oct 14 09:23:31 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_mmap.c,v 1.138 2011/10/12 00:03:47 yamt Exp $ */
+/* $NetBSD: uvm_mmap.c,v 1.139 2011/10/14 09:23:31 hannken Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -46,7 +46,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_mmap.c,v 1.138 2011/10/12 00:03:47 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_mmap.c,v 1.139 2011/10/14 09:23:31 hannken Exp $");
#include "opt_compat_netbsd.h"
#include "opt_pax.h"
@@ -460,8 +460,10 @@ sys_mmap(struct lwp *l, const struct sys
* EPERM.
*/
if (fp->f_flag & FWRITE) {
- if ((error =
- VOP_GETATTR(vp, &va, l->l_cred))) {
+ vn_lock(vp, LK_SHARED | LK_RETRY);
+ error = VOP_GETATTR(vp, &va, l->l_cred);
+ VOP_UNLOCK(vp);
+ if (error) {
fd_putfile(fd);
return (error);
}