Messages in this thread Patch in this message | | | From | ChenXiaoSong <> | Subject | [PATCH v6 1/2] btrfs: add might_sleep() to some places in update_qgroup_limit_item() | Date | Wed, 16 Nov 2022 22:23:53 +0800 |
| |
At least 3 places might sleep in update_qgroup_limit_item(), as shown below:
update_qgroup_limit_item btrfs_alloc_path /* allocate memory non-atomically, might sleep */ kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS) btrfs_search_slot setup_nodes_for_search reada_for_balance btrfs_readahead_node_child btrfs_readahead_tree_block btrfs_find_create_tree_block alloc_extent_buffer kmem_cache_zalloc /* allocate memory non-atomically, might sleep */ kmem_cache_alloc(GFP_NOFS|__GFP_NOFAIL|__GFP_ZERO) read_extent_buffer_pages submit_extent_page /* disk IO, might sleep */ submit_one_bio
As the potential sleeping under spin lock is hard to spot, we should add might_sleep() to btrfs_alloc_path() and btrfs_search_slot().
Signed-off-by: ChenXiaoSong <chenxiaosong2@huawei.com> --- fs/btrfs/ctree.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index a9543f01184c..1cd0d00ef328 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -78,6 +78,8 @@ size_t __attribute_const__ btrfs_get_num_csums(void) struct btrfs_path *btrfs_alloc_path(void) { + might_sleep(); + return kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS); } @@ -1934,6 +1936,8 @@ int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root *root, int min_write_lock_level; int prev_cmp; + might_sleep(); + lowest_level = p->lowest_level; WARN_ON(lowest_level && ins_len > 0); WARN_ON(p->nodes[0] != NULL); -- 2.31.1
| |