[PATCH v5 0/2] btrfs: fix sleep from invalid context bug in update_qgroup_limit_item()

From: ChenXiaoSong
Date: Wed Nov 16 2022 - 07:10:06 EST


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

Fix this by calling qgroup_dirty() on @dstqgroup, and update limit item in
btrfs_run_qgroups() later.

By the way, add might_sleep() to btrfs_search_slot().

ChenXiaoSong (2):
btrfs: add might_sleep() to btrfs_search_slot()
btrfs: qgroup: fix sleep from invalid context bug in
update_qgroup_limit_item()

fs/btrfs/ctree.c | 2 ++
fs/btrfs/qgroup.c | 29 ++++++++++++-----------------
2 files changed, 14 insertions(+), 17 deletions(-)

--
2.31.1