btrfs: move ulist allocation out of transaction in quota enable
The allocation happens with GFP_KERNEL after a transaction has been started, this can potentially cause deadlock if reclaim tries to get the memory by flushing filesystem data. The fs_info::qgroup_ulist is not used during transaction start when quotas are not enabled. The status bit BTRFS_FS_QUOTA_ENABLED is set later in btrfs_quota_enable so it's safe to move it before the transaction start. Reviewed-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>hifive-unleashed-5.1
parent
aea6f028d0
commit
7503b83d80
|
@ -894,6 +894,12 @@ int btrfs_quota_enable(struct btrfs_fs_info *fs_info)
|
||||||
if (fs_info->quota_root)
|
if (fs_info->quota_root)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
fs_info->qgroup_ulist = ulist_alloc(GFP_KERNEL);
|
||||||
|
if (!fs_info->qgroup_ulist) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 1 for quota root item
|
* 1 for quota root item
|
||||||
* 1 for BTRFS_QGROUP_STATUS item
|
* 1 for BTRFS_QGROUP_STATUS item
|
||||||
|
@ -909,13 +915,6 @@ int btrfs_quota_enable(struct btrfs_fs_info *fs_info)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
fs_info->qgroup_ulist = ulist_alloc(GFP_KERNEL);
|
|
||||||
if (!fs_info->qgroup_ulist) {
|
|
||||||
ret = -ENOMEM;
|
|
||||||
btrfs_abort_transaction(trans, ret);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* initially create the quota tree
|
* initially create the quota tree
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue