Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 30 Jul 2014 03:56:18 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r269283 - in stable/10/sys: fs/ext2fs fs/nandfs fs/nfsclient fs/nullfs fs/tmpfs kern ufs/ufs
Message-ID:  <201407300356.s6U3uISV059484@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Wed Jul 30 03:56:17 2014
New Revision: 269283
URL: http://svnweb.freebsd.org/changeset/base/269283

Log:
  MFC r268764:
  Check for the cross-device cross-link attempt in the VFS, instead of
  VOP_LINK() implemenations.

Modified:
  stable/10/sys/fs/ext2fs/ext2_vnops.c
  stable/10/sys/fs/nandfs/nandfs_vnops.c
  stable/10/sys/fs/nfsclient/nfs_clvnops.c
  stable/10/sys/fs/nullfs/null_vnops.c
  stable/10/sys/fs/tmpfs/tmpfs_vnops.c
  stable/10/sys/kern/vfs_syscalls.c
  stable/10/sys/ufs/ufs/ufs_vnops.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/fs/ext2fs/ext2_vnops.c
==============================================================================
--- stable/10/sys/fs/ext2fs/ext2_vnops.c	Wed Jul 30 00:28:29 2014	(r269282)
+++ stable/10/sys/fs/ext2fs/ext2_vnops.c	Wed Jul 30 03:56:17 2014	(r269283)
@@ -666,10 +666,6 @@ ext2_link(struct vop_link_args *ap)
 	if ((cnp->cn_flags & HASBUF) == 0)
 		panic("ext2_link: no name");
 #endif
-	if (tdvp->v_mount != vp->v_mount) {
-		error = EXDEV;
-		goto out;
-	}
 	ip = VTOI(vp);
 	if ((nlink_t)ip->i_nlink >= EXT2_LINK_MAX) {
 		error = EMLINK;

Modified: stable/10/sys/fs/nandfs/nandfs_vnops.c
==============================================================================
--- stable/10/sys/fs/nandfs/nandfs_vnops.c	Wed Jul 30 00:28:29 2014	(r269282)
+++ stable/10/sys/fs/nandfs/nandfs_vnops.c	Wed Jul 30 03:56:17 2014	(r269283)
@@ -1355,9 +1355,6 @@ nandfs_link(struct vop_link_args *ap)
 	struct nandfs_inode *inode = &node->nn_inode;
 	int error;
 
-	if (tdvp->v_mount != vp->v_mount)
-		return (EXDEV);
-
 	if (inode->i_links_count >= LINK_MAX)
 		return (EMLINK);
 

Modified: stable/10/sys/fs/nfsclient/nfs_clvnops.c
==============================================================================
--- stable/10/sys/fs/nfsclient/nfs_clvnops.c	Wed Jul 30 00:28:29 2014	(r269282)
+++ stable/10/sys/fs/nfsclient/nfs_clvnops.c	Wed Jul 30 03:56:17 2014	(r269283)
@@ -1977,10 +1977,6 @@ nfs_link(struct vop_link_args *ap)
 	struct nfsvattr nfsva, dnfsva;
 	int error = 0, attrflag, dattrflag;
 
-	if (vp->v_mount != tdvp->v_mount) {
-		return (EXDEV);
-	}
-
 	/*
 	 * Push all writes to the server, so that the attribute cache
 	 * doesn't get "out of sync" with the server.

Modified: stable/10/sys/fs/nullfs/null_vnops.c
==============================================================================
--- stable/10/sys/fs/nullfs/null_vnops.c	Wed Jul 30 00:28:29 2014	(r269282)
+++ stable/10/sys/fs/nullfs/null_vnops.c	Wed Jul 30 03:56:17 2014	(r269283)
@@ -858,15 +858,6 @@ null_vptocnp(struct vop_vptocnp_args *ap
 	return (error);
 }
 
-static int
-null_link(struct vop_link_args *ap)
-{
-
-	if (ap->a_tdvp->v_mount != ap->a_vp->v_mount)
-		return (EXDEV);
-	return (null_bypass((struct vop_generic_args *)ap));
-}
-
 /*
  * Global vfs data structures
  */
@@ -880,7 +871,6 @@ struct vop_vector null_vnodeops = {
 	.vop_getwritemount =	null_getwritemount,
 	.vop_inactive =		null_inactive,
 	.vop_islocked =		vop_stdislocked,
-	.vop_link =		null_link,
 	.vop_lock1 =		null_lock,
 	.vop_lookup =		null_lookup,
 	.vop_open =		null_open,

Modified: stable/10/sys/fs/tmpfs/tmpfs_vnops.c
==============================================================================
--- stable/10/sys/fs/tmpfs/tmpfs_vnops.c	Wed Jul 30 00:28:29 2014	(r269282)
+++ stable/10/sys/fs/tmpfs/tmpfs_vnops.c	Wed Jul 30 03:56:17 2014	(r269283)
@@ -573,21 +573,6 @@ tmpfs_link(struct vop_link_args *v)
 	MPASS(VOP_ISLOCKED(dvp));
 	MPASS(cnp->cn_flags & HASBUF);
 	MPASS(dvp != vp); /* XXX When can this be false? */
-
-	/* XXX: Why aren't the following two tests done by the caller? */
-
-	/* Hard links of directories are forbidden. */
-	if (vp->v_type == VDIR) {
-		error = EPERM;
-		goto out;
-	}
-
-	/* Cannot create cross-device links. */
-	if (dvp->v_mount != vp->v_mount) {
-		error = EXDEV;
-		goto out;
-	}
-
 	node = VP_TO_TMPFS_NODE(vp);
 
 	/* Ensure that we do not overflow the maximum number of links imposed

Modified: stable/10/sys/kern/vfs_syscalls.c
==============================================================================
--- stable/10/sys/kern/vfs_syscalls.c	Wed Jul 30 00:28:29 2014	(r269282)
+++ stable/10/sys/kern/vfs_syscalls.c	Wed Jul 30 03:56:17 2014	(r269283)
@@ -1579,7 +1579,15 @@ again:
 			vrele(nd.ni_vp);
 			error = EEXIST;
 		} else if ((error = vn_lock(vp, LK_EXCLUSIVE)) == 0) {
-			error = can_hardlink(vp, td->td_ucred);
+			/*
+			 * Check for cross-device links.  No need to
+			 * recheck vp->v_type, since it cannot change
+			 * for non-doomed vnode.
+			 */
+			if (nd.ni_dvp->v_mount != vp->v_mount)
+				error = EXDEV;
+			else
+				error = can_hardlink(vp, td->td_ucred);
 			if (error == 0)
 #ifdef MAC
 				error = mac_vnode_check_link(td->td_ucred,

Modified: stable/10/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- stable/10/sys/ufs/ufs/ufs_vnops.c	Wed Jul 30 00:28:29 2014	(r269282)
+++ stable/10/sys/ufs/ufs/ufs_vnops.c	Wed Jul 30 03:56:17 2014	(r269283)
@@ -968,10 +968,6 @@ ufs_link(ap)
 	if ((cnp->cn_flags & HASBUF) == 0)
 		panic("ufs_link: no name");
 #endif
-	if (tdvp->v_mount != vp->v_mount) {
-		error = EXDEV;
-		goto out;
-	}
 	if (VTOI(tdvp)->i_effnlink < 2)
 		panic("ufs_link: Bad link count %d on parent",
 		    VTOI(tdvp)->i_effnlink);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201407300356.s6U3uISV059484>