pull handling of . and .. into inlined helper
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 4 Mar 2011 19:22:06 +0000 (14:22 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 14 Mar 2011 13:15:25 +0000 (09:15 -0400)
getting LOOKUP_RCU checks out of link_path_walk()...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c

index fea3636..d29f91e 100644 (file)
@@ -1318,6 +1318,18 @@ static inline int may_lookup(struct nameidata *nd)
        return exec_permission(nd->inode, 0);
 }
 
+static inline int handle_dots(struct nameidata *nd, int type)
+{
+       if (type == LAST_DOTDOT) {
+               if (nd->flags & LOOKUP_RCU) {
+                       if (follow_dotdot_rcu(nd))
+                               return -ECHILD;
+               } else
+                       follow_dotdot(nd);
+       }
+       return 0;
+}
+
 /*
  * Name resolution.
  * This is the basic name resolution function, turning a pathname into
@@ -1393,13 +1405,8 @@ static int link_path_walk(const char *name, struct nameidata *nd)
                 * parent relationships.
                 */
                if (unlikely(type != LAST_NORM)) {
-                       if (type == LAST_DOTDOT) {
-                               if (nd->flags & LOOKUP_RCU) {
-                                       if (follow_dotdot_rcu(nd))
-                                               return -ECHILD;
-                               } else
-                                       follow_dotdot(nd);
-                       }
+                       if (handle_dots(nd, type))
+                               return -ECHILD;
                        continue;
                }
 
@@ -1434,13 +1441,8 @@ last_component:
                if (lookup_flags & LOOKUP_PARENT)
                        goto lookup_parent;
                if (unlikely(type != LAST_NORM)) {
-                       if (type == LAST_DOTDOT) {
-                               if (nd->flags & LOOKUP_RCU) {
-                                       if (follow_dotdot_rcu(nd))
-                                               return -ECHILD;
-                               } else
-                                       follow_dotdot(nd);
-                       }
+                       if (handle_dots(nd, type))
+                               return -ECHILD;
                        return 0;
                }
                err = do_lookup(nd, &this, &next, &inode);