]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: move select_delayed_ref() and export it
authorJosef Bacik <josef@toxicpanda.com>
Wed, 13 Nov 2024 18:20:37 +0000 (13:20 -0500)
committerDavid Sterba <dsterba@suse.com>
Mon, 13 Jan 2025 13:53:13 +0000 (14:53 +0100)
This helper is how we select the delayed ref to run once we've selected
the delayed ref head.  I need this exported to add a unit test for
delayed refs, and it's more natural home is in delayed-ref.c.  Rename it
to btrfs_select_delayed_ref and move it into delayed-ref.c.

Reviewed-by: Boris Burkov <boris@bur.io>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/delayed-ref.c
fs/btrfs/delayed-ref.h
fs/btrfs/extent-tree.c

index 0d878dbbabba448d000374f1516ea05a69d175fd..7e4cdae2a8209b0519cd7d0729e0e2cc00118596 100644 (file)
@@ -555,6 +555,32 @@ void btrfs_delete_ref_head(const struct btrfs_fs_info *fs_info,
                delayed_refs->num_heads_ready--;
 }
 
+struct btrfs_delayed_ref_node *btrfs_select_delayed_ref(struct btrfs_delayed_ref_head *head)
+{
+       struct btrfs_delayed_ref_node *ref;
+
+       lockdep_assert_held(&head->mutex);
+       lockdep_assert_held(&head->lock);
+
+       if (RB_EMPTY_ROOT(&head->ref_tree.rb_root))
+               return NULL;
+
+       /*
+        * Select a delayed ref of type BTRFS_ADD_DELAYED_REF first.
+        * This is to prevent a ref count from going down to zero, which deletes
+        * the extent item from the extent tree, when there still are references
+        * to add, which would fail because they would not find the extent item.
+        */
+       if (!list_empty(&head->ref_add_list))
+               return list_first_entry(&head->ref_add_list,
+                                       struct btrfs_delayed_ref_node, add_list);
+
+       ref = rb_entry(rb_first_cached(&head->ref_tree),
+                      struct btrfs_delayed_ref_node, ref_node);
+       ASSERT(list_empty(&ref->add_list));
+       return ref;
+}
+
 /*
  * Helper to insert the ref_node to the tail or merge with tail.
  *
index 611fb3388f82bdfe4775c9a2f21323c021ff3e58..a35067cebb974b79a447022cf2445e4a281c6a4a 100644 (file)
@@ -402,6 +402,7 @@ struct btrfs_delayed_ref_head *btrfs_select_ref_head(
                struct btrfs_delayed_ref_root *delayed_refs);
 void btrfs_unselect_ref_head(struct btrfs_delayed_ref_root *delayed_refs,
                             struct btrfs_delayed_ref_head *head);
+struct btrfs_delayed_ref_node *btrfs_select_delayed_ref(struct btrfs_delayed_ref_head *head);
 
 int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info, u64 seq);
 
index 3c6f7fecbb9aadca88591849153c5a07a846c3c9..2ce9e69ee8f8529fae22c5c11d9e750b7a00cbab 100644 (file)
@@ -1803,30 +1803,6 @@ static int run_one_delayed_ref(struct btrfs_trans_handle *trans,
        return ret;
 }
 
-static inline struct btrfs_delayed_ref_node *
-select_delayed_ref(struct btrfs_delayed_ref_head *head)
-{
-       struct btrfs_delayed_ref_node *ref;
-
-       if (RB_EMPTY_ROOT(&head->ref_tree.rb_root))
-               return NULL;
-
-       /*
-        * Select a delayed ref of type BTRFS_ADD_DELAYED_REF first.
-        * This is to prevent a ref count from going down to zero, which deletes
-        * the extent item from the extent tree, when there still are references
-        * to add, which would fail because they would not find the extent item.
-        */
-       if (!list_empty(&head->ref_add_list))
-               return list_first_entry(&head->ref_add_list,
-                               struct btrfs_delayed_ref_node, add_list);
-
-       ref = rb_entry(rb_first_cached(&head->ref_tree),
-                      struct btrfs_delayed_ref_node, ref_node);
-       ASSERT(list_empty(&ref->add_list));
-       return ref;
-}
-
 static struct btrfs_delayed_extent_op *cleanup_extent_op(
                                struct btrfs_delayed_ref_head *head)
 {
@@ -1959,7 +1935,7 @@ static int btrfs_run_delayed_refs_for_head(struct btrfs_trans_handle *trans,
        lockdep_assert_held(&locked_ref->mutex);
        lockdep_assert_held(&locked_ref->lock);
 
-       while ((ref = select_delayed_ref(locked_ref))) {
+       while ((ref = btrfs_select_delayed_ref(locked_ref))) {
                if (ref->seq &&
                    btrfs_check_delayed_seq(fs_info, ref->seq)) {
                        spin_unlock(&locked_ref->lock);