From: Konstantin Khlebnikov <khlebni...@yandex-team.ru>

This lets skip remaining siblings at seeing d_is_tail_negative().

Signed-off-by: Konstantin Khlebnikov <khlebni...@yandex-team.ru>
Signed-off-by: Gautham Ananthakrishna <gautham.ananthakris...@oracle.com>
---
 fs/dcache.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/fs/dcache.c b/fs/dcache.c
index a506169..894e6da 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1320,12 +1320,14 @@ void shrink_dcache_sb(struct super_block *sb)
  * @D_WALK_QUIT:       quit walk
  * @D_WALK_NORETRY:    quit when retry is needed
  * @D_WALK_SKIP:       skip this dentry and its children
+ * @D_WALK_SKIP_SIBLINGS: skip siblings and their children
  */
 enum d_walk_ret {
        D_WALK_CONTINUE,
        D_WALK_QUIT,
        D_WALK_NORETRY,
        D_WALK_SKIP,
+       D_WALK_SKIP_SIBLINGS,
 };
 
 /**
@@ -1356,6 +1358,7 @@ static void d_walk(struct dentry *parent, void *data,
                break;
        case D_WALK_QUIT:
        case D_WALK_SKIP:
+       case D_WALK_SKIP_SIBLINGS:
                goto out_unlock;
        case D_WALK_NORETRY:
                retry = false;
@@ -1387,6 +1390,9 @@ static void d_walk(struct dentry *parent, void *data,
                case D_WALK_SKIP:
                        spin_unlock(&dentry->d_lock);
                        continue;
+               case D_WALK_SKIP_SIBLINGS:
+                       spin_unlock(&dentry->d_lock);
+                       goto skip_siblings;
                }
 
                if (!list_empty(&dentry->d_subdirs)) {
@@ -1398,6 +1404,7 @@ static void d_walk(struct dentry *parent, void *data,
                }
                spin_unlock(&dentry->d_lock);
        }
+skip_siblings:
        /*
         * All done at this level ... ascend and resume the search.
         */
-- 
1.8.3.1

Reply via email to