aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorDon Lewis <truckman@FreeBSD.org>2003-06-19 03:55:01 +0000
committerDon Lewis <truckman@FreeBSD.org>2003-06-19 03:55:01 +0000
commit8d5f9131fccc3bb06e4c59f2f28cf8b5d218cd17 (patch)
treeb118943b530f98aca5a18d8c2a4b59abf9b9e5a0 /sys
parent82b8b189596f04f8b2560efaef2328d8dcfbc42d (diff)
downloadsrc-8d5f9131fccc3bb06e4c59f2f28cf8b5d218cd17.tar.gz
src-8d5f9131fccc3bb06e4c59f2f28cf8b5d218cd17.zip
VOP_GETVOBJECT() wants to be called with the vnode lock held.
Notes
Notes: svn path=/head/; revision=116562
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/uipc_syscalls.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 98be6d3006fd..d6b694743f15 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -1775,10 +1775,13 @@ do_sendfile(struct thread *td, struct sendfile_args *uap, int compat)
*/
if ((error = fgetvp_read(td, uap->fd, &vp)) != 0)
goto done;
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
if (vp->v_type != VREG || VOP_GETVOBJECT(vp, &obj) != 0) {
error = EINVAL;
+ VOP_UNLOCK(vp, 0, td);
goto done;
}
+ VOP_UNLOCK(vp, 0, td);
if ((error = fgetsock(td, uap->s, &so, NULL)) != 0)
goto done;
if (so->so_type != SOCK_STREAM) {