]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: print leaked references in kill_all_delayed_nodes()
authorLeo Martins <loemra.dev@gmail.com>
Tue, 12 Aug 2025 23:04:40 +0000 (16:04 -0700)
committerDavid Sterba <dsterba@suse.com>
Mon, 22 Sep 2025 08:54:32 +0000 (10:54 +0200)
We are seeing soft lockups in kill_all_delayed_nodes due to a
delayed_node with a lingering reference count of 1. Printing at this
point will reveal the guilty stack trace. If the delayed_node has no
references there should be no output.

Signed-off-by: Leo Martins <loemra.dev@gmail.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/delayed-inode.c
fs/btrfs/delayed-inode.h

index 364814642a91d6b0f4efc68ccfbe5a84c3cb830b..6adfe62cd0c4dd777c7ec7e96ccf1288a9ee96c7 100644 (file)
@@ -2112,6 +2112,7 @@ void btrfs_kill_all_delayed_nodes(struct btrfs_root *root)
                        __btrfs_kill_delayed_node(delayed_nodes[i]);
                        btrfs_release_delayed_node(delayed_nodes[i],
                                                   &delayed_node_trackers[i]);
+                       btrfs_delayed_node_ref_tracker_dir_print(delayed_nodes[i]);
                }
        }
 }
index 93149c32d3fa41875d84bddba03d5db4038260b2..7f2db9905aeaee83a0c8b1a4f529a25e4b3f7b81 100644 (file)
@@ -208,6 +208,12 @@ static inline void btrfs_delayed_node_ref_tracker_dir_exit(struct btrfs_delayed_
        ref_tracker_dir_exit(&node->ref_dir.dir);
 }
 
+static inline void btrfs_delayed_node_ref_tracker_dir_print(struct btrfs_delayed_node *node)
+{
+       ref_tracker_dir_print(&node->ref_dir.dir,
+                             BTRFS_DELAYED_NODE_REF_TRACKER_DISPLAY_LIMIT);
+}
+
 static inline int btrfs_delayed_node_ref_tracker_alloc(struct btrfs_delayed_node *node,
                                                       struct btrfs_ref_tracker *tracker,
                                                       gfp_t gfp)
@@ -225,6 +231,8 @@ static inline void btrfs_delayed_node_ref_tracker_dir_init(struct btrfs_delayed_
 
 static inline void btrfs_delayed_node_ref_tracker_dir_exit(struct btrfs_delayed_node *node) { }
 
+static inline void btrfs_delayed_node_ref_tracker_dir_print(struct btrfs_delayed_node *node) { }
+
 static inline int btrfs_delayed_node_ref_tracker_alloc(struct btrfs_delayed_node *node,
                                                       struct btrfs_ref_tracker *tracker,
                                                       gfp_t gfp)