Commit b767a28d authored by Leo Martins's avatar Leo Martins Committed by David Sterba
Browse files

btrfs: print leaked references in kill_all_delayed_nodes()



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: default avatarLeo Martins <loemra.dev@gmail.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent e8513c01
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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]);
		}
	}
}
+8 −0
Original line number Diff line number Diff line
@@ -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)