Author: kib
Date: Mon Jul 28 00:57:28 2014
New Revision: 269166
URL: http://svnweb.freebsd.org/changeset/base/269166

Log:
  MFC r268607:
  In kern_linkat(), avoid passing doomed vnode to the VOP.

Modified:
  stable/10/sys/kern/vfs_syscalls.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/kern/vfs_syscalls.c
==============================================================================
--- stable/10/sys/kern/vfs_syscalls.c   Mon Jul 28 00:53:26 2014        
(r269165)
+++ stable/10/sys/kern/vfs_syscalls.c   Mon Jul 28 00:57:28 2014        
(r269166)
@@ -1555,6 +1555,7 @@ kern_linkat(struct thread *td, int fd1, 
        bwillwrite();
        NDINIT_AT(&nd, LOOKUP, follow | AUDITVNODE1, segflg, path1, fd1, td);
 
+again:
        if ((error = namei(&nd)) != 0)
                return (error);
        NDFREE(&nd, NDF_ONLY_PNBUF);
@@ -1577,8 +1578,7 @@ kern_linkat(struct thread *td, int fd1, 
                                vput(nd.ni_dvp);
                        vrele(nd.ni_vp);
                        error = EEXIST;
-               } else if ((error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY))
-                   == 0) {
+               } else if ((error = vn_lock(vp, LK_EXCLUSIVE)) == 0) {
                        error = can_hardlink(vp, td->td_ucred);
                        if (error == 0)
 #ifdef MAC
@@ -1589,6 +1589,12 @@ kern_linkat(struct thread *td, int fd1, 
                                error = VOP_LINK(nd.ni_dvp, vp, &nd.ni_cnd);
                        VOP_UNLOCK(vp, 0);
                        vput(nd.ni_dvp);
+               } else {
+                       vput(nd.ni_dvp);
+                       NDFREE(&nd, NDF_ONLY_PNBUF);
+                       vrele(vp);
+                       vn_finished_write(mp);
+                       goto again;
                }
                NDFREE(&nd, NDF_ONLY_PNBUF);
        }
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to