mirror of
https://github.com/torvalds/linux.git
synced 2025-11-03 01:59:51 +02:00
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: Leo Martins <loemra.dev@gmail.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
e8513c012d
commit
b767a28d61
2 changed files with 9 additions and 0 deletions
|
|
@ -2112,6 +2112,7 @@ void btrfs_kill_all_delayed_nodes(struct btrfs_root *root)
|
||||||
__btrfs_kill_delayed_node(delayed_nodes[i]);
|
__btrfs_kill_delayed_node(delayed_nodes[i]);
|
||||||
btrfs_release_delayed_node(delayed_nodes[i],
|
btrfs_release_delayed_node(delayed_nodes[i],
|
||||||
&delayed_node_trackers[i]);
|
&delayed_node_trackers[i]);
|
||||||
|
btrfs_delayed_node_ref_tracker_dir_print(delayed_nodes[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
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,
|
static inline int btrfs_delayed_node_ref_tracker_alloc(struct btrfs_delayed_node *node,
|
||||||
struct btrfs_ref_tracker *tracker,
|
struct btrfs_ref_tracker *tracker,
|
||||||
gfp_t gfp)
|
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_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,
|
static inline int btrfs_delayed_node_ref_tracker_alloc(struct btrfs_delayed_node *node,
|
||||||
struct btrfs_ref_tracker *tracker,
|
struct btrfs_ref_tracker *tracker,
|
||||||
gfp_t gfp)
|
gfp_t gfp)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue