Messages in this thread | | | From | ChenXiaoSong <> | Subject | [PATCH v5 0/2] btrfs: fix sleep from invalid context bug in update_qgroup_limit_item() | Date | Wed, 16 Nov 2022 21:07:14 +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
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
| |