diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index 15ab9a0..ff044ad 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -1421,8 +1421,7 @@ kern_link(struct thread *td, char *path, char *link, enum uio_seg segflg) vput(nd.ni_dvp); vrele(nd.ni_vp); error = EEXIST; - } else if ((error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td)) - == 0) { + } else if ((error = vn_lock(vp, LK_EXCLUSIVE, td)) == 0) { VOP_LEASE(nd.ni_dvp, td, td->td_ucred, LEASE_WRITE); VOP_LEASE(vp, td, td->td_ucred, LEASE_WRITE); error = can_hardlink(vp, td, td->td_ucred); @@ -3567,7 +3566,12 @@ unionread: auio.uio_segflg = UIO_USERSPACE; auio.uio_td = td; auio.uio_resid = uap->count; - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); + vn_lock(vp, LK_EXCLUSIVE, td); + if (error) { + VFS_UNLOCK_GIANT(vfslocked); + fdrop(fp, td); + return (error); + } loff = auio.uio_offset = fp->f_offset; #ifdef MAC error = mac_check_vnode_readdir(td->td_ucred, vp); @@ -3710,7 +3714,11 @@ unionread: auio.uio_td = td; auio.uio_resid = uap->count; /* vn_lock(vp, LK_SHARED | LK_RETRY, td); */ - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); + error = vn_lock(vp, LK_EXCLUSIVE, td); + if (error) { + VFS_UNLOCK_GIANT(vfslocked); + goto fail; + } AUDIT_ARG(vnode, vp, ARG_VNODE1); loff = auio.uio_offset = fp->f_offset; #ifdef MAC