Messages in this thread | | | From | ChenXiaoSong <> | Subject | [PATCH v6 0/2] btrfs: fix sleep from invalid context bug in update_qgroup_limit_item() | Date | Wed, 16 Nov 2022 22:23:52 +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 some places.
ChenXiaoSong (2): btrfs: add might_sleep() to some places in update_qgroup_limit_item() btrfs: qgroup: fix sleep from invalid context bug in update_qgroup_limit_item()
fs/btrfs/ctree.c | 4 ++++ fs/btrfs/qgroup.c | 9 +-------- 2 files changed, 5 insertions(+), 8 deletions(-)
-- 2.31.1
| |