GIT: unionfs2-2.6.27.y: fix LOOKUP_FOLLOW on automount "symlinks"

Erez Zadok ezk at fsl.cs.sunysb.edu
Thu Aug 12 23:15:13 EDT 2010


commit 9e7ad5ae520b5cc242f7840bb8750a02c7c590c1
Author: Al Viro <viro at ZenIV.linux.org.uk>
Date:   Tue Feb 16 18:09:36 2010 +0000

    fix LOOKUP_FOLLOW on automount "symlinks"
    
    commit ac278a9c505092dd82077a2446af8f9fc0d9c095 upstream.
    
    Make sure that automount "symlinks" are followed regardless of LOOKUP_FOLLOW;
    it should have no effect on them.
    
    Signed-off-by: Al Viro <viro at zeniv.linux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh at suse.de>

diff --git a/fs/namei.c b/fs/namei.c
index e6c73de..832cd4b 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -841,6 +841,17 @@ fail:
 }
 
 /*
+ * This is a temporary kludge to deal with "automount" symlinks; proper
+ * solution is to trigger them on follow_mount(), so that do_lookup()
+ * would DTRT.  To be killed before 2.6.34-final.
+ */
+static inline int follow_on_final(struct inode *inode, unsigned lookup_flags)
+{
+	return inode && unlikely(inode->i_op->follow_link) &&
+		((lookup_flags & LOOKUP_FOLLOW) || S_ISDIR(inode->i_mode));
+}
+
+/*
  * Name resolution.
  * This is the basic name resolution function, turning a pathname into
  * the final dentry. We expect 'base' to be positive and a directory.
@@ -984,8 +995,7 @@ last_component:
 		if (err)
 			break;
 		inode = next.dentry->d_inode;
-		if ((lookup_flags & LOOKUP_FOLLOW)
-		    && inode && inode->i_op && inode->i_op->follow_link) {
+		if (follow_on_final(inode, lookup_flags)) {
 			err = do_follow_link(&next, nd);
 			if (err)
 				goto return_err;


More information about the unionfs-cvs mailing list