aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQu Wenruo <quwenruo@cn.fujitsu.com>2015-10-08 06:19:37 -0400
committerChris Mason <clm@fb.com>2015-10-21 21:41:09 -0400
commit51773bec7ea352f3b9afa11ecfc72324c7977335 (patch)
tree3d2c52d2424e01df54e3ac6bd060028d293235b1
parent14524a846eb52c18438e9bd5eb8cf1431fd57b44 (diff)
btrfs: qgroup: Avoid calling btrfs_free_reserved_data_space in clear_bit_hook
In clear_bit_hook, qgroup reserved data is already handled quite well, either released by finish_ordered_io or invalidatepage. So calling btrfs_qgroup_free_data() here is completely meaningless, and since btrfs_qgroup_free_data() will lock io_tree, so it can't be called with io_tree lock hold. This patch will add a new function btrfs_free_reserved_data_space_noquota() for clear_bit_hook() to cease the lockdep warning. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: Chris Mason <clm@fb.com>
-rw-r--r--fs/btrfs/ctree.h2
-rw-r--r--fs/btrfs/extent-tree.c28
-rw-r--r--fs/btrfs/inode.c4
3 files changed, 22 insertions, 12 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index 0d0f5d2a534a..2135b82a6b61 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -3455,6 +3455,8 @@ enum btrfs_reserve_flush_enum {
3455int btrfs_check_data_free_space(struct inode *inode, u64 start, u64 len); 3455int btrfs_check_data_free_space(struct inode *inode, u64 start, u64 len);
3456int btrfs_alloc_data_chunk_ondemand(struct inode *inode, u64 bytes); 3456int btrfs_alloc_data_chunk_ondemand(struct inode *inode, u64 bytes);
3457void btrfs_free_reserved_data_space(struct inode *inode, u64 start, u64 len); 3457void btrfs_free_reserved_data_space(struct inode *inode, u64 start, u64 len);
3458void btrfs_free_reserved_data_space_noquota(struct inode *inode, u64 start,
3459 u64 len);
3458void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans, 3460void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans,
3459 struct btrfs_root *root); 3461 struct btrfs_root *root);
3460void btrfs_trans_release_chunk_metadata(struct btrfs_trans_handle *trans); 3462void btrfs_trans_release_chunk_metadata(struct btrfs_trans_handle *trans);
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index aaaa7746685a..46609607789b 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -4066,10 +4066,12 @@ int btrfs_check_data_free_space(struct inode *inode, u64 start, u64 len)
4066 * Called if we need to clear a data reservation for this inode 4066 * Called if we need to clear a data reservation for this inode
4067 * Normally in a error case. 4067 * Normally in a error case.
4068 * 4068 *
4069 * This one will handle the per-indoe data rsv map for accurate reserved 4069 * This one will *NOT* use accurate qgroup reserved space API, just for case
4070 * space framework. 4070 * which we can't sleep and is sure it won't affect qgroup reserved space.
4071 * Like clear_bit_hook().
4071 */ 4072 */
4072void btrfs_free_reserved_data_space(struct inode *inode, u64 start, u64 len) 4073void btrfs_free_reserved_data_space_noquota(struct inode *inode, u64 start,
4074 u64 len)
4073{ 4075{
4074 struct btrfs_root *root = BTRFS_I(inode)->root; 4076 struct btrfs_root *root = BTRFS_I(inode)->root;
4075 struct btrfs_space_info *data_sinfo; 4077 struct btrfs_space_info *data_sinfo;
@@ -4079,13 +4081,6 @@ void btrfs_free_reserved_data_space(struct inode *inode, u64 start, u64 len)
4079 round_down(start, root->sectorsize); 4081 round_down(start, root->sectorsize);
4080 start = round_down(start, root->sectorsize); 4082 start = round_down(start, root->sectorsize);
4081 4083
4082 /*
4083 * Free any reserved qgroup data space first
4084 * As it will alloc memory, we can't do it with data sinfo
4085 * spinlock hold.
4086 */
4087 btrfs_qgroup_free_data(inode, start, len);
4088
4089 data_sinfo = root->fs_info->data_sinfo; 4084 data_sinfo = root->fs_info->data_sinfo;
4090 spin_lock(&data_sinfo->lock); 4085 spin_lock(&data_sinfo->lock);
4091 if (WARN_ON(data_sinfo->bytes_may_use < len)) 4086 if (WARN_ON(data_sinfo->bytes_may_use < len))
@@ -4097,6 +4092,19 @@ void btrfs_free_reserved_data_space(struct inode *inode, u64 start, u64 len)
4097 spin_unlock(&data_sinfo->lock); 4092 spin_unlock(&data_sinfo->lock);
4098} 4093}
4099 4094
4095/*
4096 * Called if we need to clear a data reservation for this inode
4097 * Normally in a error case.
4098 *
4099 * This one will handle the per-indoe data rsv map for accurate reserved
4100 * space framework.
4101 */
4102void btrfs_free_reserved_data_space(struct inode *inode, u64 start, u64 len)
4103{
4104 btrfs_free_reserved_data_space_noquota(inode, start, len);
4105 btrfs_qgroup_free_data(inode, start, len);
4106}
4107
4100static void force_metadata_allocation(struct btrfs_fs_info *info) 4108static void force_metadata_allocation(struct btrfs_fs_info *info)
4101{ 4109{
4102 struct list_head *head = &info->space_info; 4110 struct list_head *head = &info->space_info;
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 6670792704e8..3229c1346ea2 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -1776,8 +1776,8 @@ static void btrfs_clear_bit_hook(struct inode *inode,
1776 1776
1777 if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID 1777 if (root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID
1778 && do_list && !(state->state & EXTENT_NORESERVE)) 1778 && do_list && !(state->state & EXTENT_NORESERVE))
1779 btrfs_free_reserved_data_space(inode, state->start, 1779 btrfs_free_reserved_data_space_noquota(inode,
1780 len); 1780 state->start, len);
1781 1781
1782 __percpu_counter_add(&root->fs_info->delalloc_bytes, -len, 1782 __percpu_counter_add(&root->fs_info->delalloc_bytes, -len,
1783 root->fs_info->delalloc_batch); 1783 root->fs_info->delalloc_batch);