--- /dev/null
+From ac278a9c505092dd82077a2446af8f9fc0d9c095 Mon Sep 17 00:00:00 2001
+From: Al Viro <viro@ZenIV.linux.org.uk>
+Date: Tue, 16 Feb 2010 18:09:36 +0000
+Subject: fix LOOKUP_FOLLOW on automount "symlinks"
+
+From: Al Viro <viro@ZenIV.linux.org.uk>
+
+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@zeniv.linux.org.uk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/namei.c | 14 ++++++++++++--
+ 1 file changed, 12 insertions(+), 2 deletions(-)
+
+--- 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;