From: Konstantin Khlebnikov <khlebnikov@xxxxxxxxxxxxxx> This lets skip remaining siblings at seeing d_is_tail_negative(). Co-authored-by: Konstantin Khlebnikov <khlebnikov@xxxxxxxxxxxxxx> Co-authored-by: Gautham Ananthakrishna <gautham.ananthakrishna@xxxxxxxxxx> Signed-off-by: Stephen Brennan <stephen.s.brennan@xxxxxxxxxx> --- fs/dcache.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/dcache.c b/fs/dcache.c index 685b91866e59..9083436f5dcb 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -1366,12 +1366,14 @@ EXPORT_SYMBOL(shrink_dcache_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, }; /** @@ -1402,6 +1404,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; @@ -1433,6 +1436,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)) { @@ -1444,6 +1450,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. */ -- 2.30.2