Whamcloud - gitweb
LU-6030 ldiskfs: further cleanup patches of ldiskfs
[fs/lustre-release.git] / ldiskfs / kernel_patches / patches / rhel7 / ext4-lookup-dotdot.patch
1 Index: linux-3.10.9-200.fc17.x86_64/fs/ext4/namei.c
2 ===================================================================
3 --- linux-3.10.9-200.fc17.x86_64.orig/fs/ext4/namei.c
4 +++ linux-3.10.9-200.fc17.x86_64/fs/ext4/namei.c
5 @@ -1438,6 +1438,33 @@ static struct dentry *ext4_lookup(struct
6                         return ERR_PTR(-EIO);
7                 }
8         }
9 +       /* ".." shouldn't go into dcache to preserve dcache hierarchy
10 +        * otherwise we'll get parent being a child of actual child.
11 +        * see bug 10458 for details -bzzz */
12 +       if (inode && (dentry->d_name.name[0] == '.' &&
13 +                     (dentry->d_name.len == 1 || (dentry->d_name.len == 2 &&
14 +                                            dentry->d_name.name[1] == '.')))) {
15 +               struct dentry *goal = NULL;
16 +
17 +               /* first, look for an existing dentry - any one is good */
18 +               goal = d_find_any_alias(inode);
19 +               if (goal == NULL) {
20 +                       spin_lock(&dentry->d_lock);
21 +                       /* there is no alias, we need to make current dentry:
22 +                        *  a) inaccessible for __d_lookup()
23 +                        *  b) inaccessible for iopen */
24 +                       J_ASSERT(hlist_unhashed(&dentry->d_alias));
25 +                       dentry->d_flags |= DCACHE_NFSFS_RENAMED;
26 +                       /* this is d_instantiate() ... */
27 +                       hlist_add_head(&dentry->d_alias, &inode->i_dentry);
28 +                       dentry->d_inode = inode;
29 +                       spin_unlock(&dentry->d_lock);
30 +               }
31 +               if (goal)
32 +                       iput(inode);
33 +               return goal;
34 +       }
35 +
36         return d_splice_alias(inode, dentry);
37  }
38