This lets skip remaining siblings at seeing d_is_tail_negative().

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

diff --git a/fs/dcache.c b/fs/dcache.c
index 743255773cc7..44c6832d21d6 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1303,12 +1303,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,
 };
 
 /**
@@ -1339,6 +1341,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;
@@ -1370,6 +1373,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)) {
@@ -1381,6 +1387,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.
         */

Reply via email to