]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
btrfs: use btrfs_find_first_inode() at btrfs_prune_dentries()
authorFilipe Manana <fdmanana@suse.com>
Thu, 11 Apr 2024 11:45:34 +0000 (12:45 +0100)
committerDavid Sterba <dsterba@suse.com>
Tue, 7 May 2024 19:31:04 +0000 (21:31 +0200)
Currently btrfs_prune_dentries() has open code to find the first inode in
a root with a minimum inode number. Remove that code and make it use the
helper btrfs_find_first_inode() for that task.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c

index adf7522a1f5638ec2132ee41d0805b42206c30f8..629706b98e31987b22e8185d88f310e8a4430a7a 100644 (file)
@@ -4416,64 +4416,26 @@ out:
 static void btrfs_prune_dentries(struct btrfs_root *root)
 {
        struct btrfs_fs_info *fs_info = root->fs_info;
-       struct rb_node *node;
-       struct rb_node *prev;
-       struct btrfs_inode *entry;
-       struct inode *inode;
-       u64 objectid = 0;
+       struct btrfs_inode *inode;
+       u64 min_ino = 0;
 
        if (!BTRFS_FS_ERROR(fs_info))
                WARN_ON(btrfs_root_refs(&root->root_item) != 0);
 
-       spin_lock(&root->inode_lock);
-again:
-       node = root->inode_tree.rb_node;
-       prev = NULL;
-       while (node) {
-               prev = node;
-               entry = rb_entry(node, struct btrfs_inode, rb_node);
-
-               if (objectid < btrfs_ino(entry))
-                       node = node->rb_left;
-               else if (objectid > btrfs_ino(entry))
-                       node = node->rb_right;
-               else
-                       break;
-       }
-       if (!node) {
-               while (prev) {
-                       entry = rb_entry(prev, struct btrfs_inode, rb_node);
-                       if (objectid <= btrfs_ino(entry)) {
-                               node = prev;
-                               break;
-                       }
-                       prev = rb_next(prev);
-               }
-       }
-       while (node) {
-               entry = rb_entry(node, struct btrfs_inode, rb_node);
-               objectid = btrfs_ino(entry) + 1;
-               inode = igrab(&entry->vfs_inode);
-               if (inode) {
-                       spin_unlock(&root->inode_lock);
-                       if (atomic_read(&inode->i_count) > 1)
-                               d_prune_aliases(inode);
-                       /*
-                        * btrfs_drop_inode will have it removed from the inode
-                        * cache when its usage count hits zero.
-                        */
-                       iput(inode);
-                       cond_resched();
-                       spin_lock(&root->inode_lock);
-                       goto again;
-               }
-
-               if (cond_resched_lock(&root->inode_lock))
-                       goto again;
+       inode = btrfs_find_first_inode(root, min_ino);
+       while (inode) {
+               if (atomic_read(&inode->vfs_inode.i_count) > 1)
+                       d_prune_aliases(&inode->vfs_inode);
 
-               node = rb_next(node);
+               min_ino = btrfs_ino(inode) + 1;
+               /*
+                * btrfs_drop_inode() will have it removed from the inode
+                * cache when its usage count hits zero.
+                */
+               iput(&inode->vfs_inode);
+               cond_resched();
+               inode = btrfs_find_first_inode(root, min_ino);
        }
-       spin_unlock(&root->inode_lock);
 }
 
 int btrfs_delete_subvolume(struct btrfs_inode *dir, struct dentry *dentry)