diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
| -rw-r--r-- | fs/btrfs/extent-tree.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 49fd7b66d57b..4b5a1e1bdefb 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -3578,7 +3578,7 @@ again: | |||
| 3578 | space_info->chunk_alloc = 0; | 3578 | space_info->chunk_alloc = 0; |
| 3579 | spin_unlock(&space_info->lock); | 3579 | spin_unlock(&space_info->lock); |
| 3580 | out: | 3580 | out: |
| 3581 | mutex_unlock(&extent_root->fs_info->chunk_mutex); | 3581 | mutex_unlock(&fs_info->chunk_mutex); |
| 3582 | return ret; | 3582 | return ret; |
| 3583 | } | 3583 | } |
| 3584 | 3584 | ||
| @@ -4355,10 +4355,9 @@ static unsigned drop_outstanding_extent(struct inode *inode) | |||
| 4355 | BTRFS_I(inode)->outstanding_extents--; | 4355 | BTRFS_I(inode)->outstanding_extents--; |
| 4356 | 4356 | ||
| 4357 | if (BTRFS_I(inode)->outstanding_extents == 0 && | 4357 | if (BTRFS_I(inode)->outstanding_extents == 0 && |
| 4358 | BTRFS_I(inode)->delalloc_meta_reserved) { | 4358 | test_and_clear_bit(BTRFS_INODE_DELALLOC_META_RESERVED, |
| 4359 | &BTRFS_I(inode)->runtime_flags)) | ||
| 4359 | drop_inode_space = 1; | 4360 | drop_inode_space = 1; |
| 4360 | BTRFS_I(inode)->delalloc_meta_reserved = 0; | ||
| 4361 | } | ||
| 4362 | 4361 | ||
| 4363 | /* | 4362 | /* |
| 4364 | * If we have more or the same amount of outsanding extents than we have | 4363 | * If we have more or the same amount of outsanding extents than we have |
| @@ -4465,7 +4464,8 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
| 4465 | * Add an item to reserve for updating the inode when we complete the | 4464 | * Add an item to reserve for updating the inode when we complete the |
| 4466 | * delalloc io. | 4465 | * delalloc io. |
| 4467 | */ | 4466 | */ |
| 4468 | if (!BTRFS_I(inode)->delalloc_meta_reserved) { | 4467 | if (!test_bit(BTRFS_INODE_DELALLOC_META_RESERVED, |
| 4468 | &BTRFS_I(inode)->runtime_flags)) { | ||
| 4469 | nr_extents++; | 4469 | nr_extents++; |
| 4470 | extra_reserve = 1; | 4470 | extra_reserve = 1; |
| 4471 | } | 4471 | } |
| @@ -4511,7 +4511,8 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
| 4511 | 4511 | ||
| 4512 | spin_lock(&BTRFS_I(inode)->lock); | 4512 | spin_lock(&BTRFS_I(inode)->lock); |
| 4513 | if (extra_reserve) { | 4513 | if (extra_reserve) { |
| 4514 | BTRFS_I(inode)->delalloc_meta_reserved = 1; | 4514 | set_bit(BTRFS_INODE_DELALLOC_META_RESERVED, |
| 4515 | &BTRFS_I(inode)->runtime_flags); | ||
| 4515 | nr_extents--; | 4516 | nr_extents--; |
| 4516 | } | 4517 | } |
| 4517 | BTRFS_I(inode)->reserved_extents += nr_extents; | 4518 | BTRFS_I(inode)->reserved_extents += nr_extents; |
| @@ -5217,7 +5218,7 @@ out: | |||
| 5217 | void btrfs_free_tree_block(struct btrfs_trans_handle *trans, | 5218 | void btrfs_free_tree_block(struct btrfs_trans_handle *trans, |
| 5218 | struct btrfs_root *root, | 5219 | struct btrfs_root *root, |
| 5219 | struct extent_buffer *buf, | 5220 | struct extent_buffer *buf, |
| 5220 | u64 parent, int last_ref, int for_cow) | 5221 | u64 parent, int last_ref) |
| 5221 | { | 5222 | { |
| 5222 | struct btrfs_block_group_cache *cache = NULL; | 5223 | struct btrfs_block_group_cache *cache = NULL; |
| 5223 | int ret; | 5224 | int ret; |
| @@ -5227,7 +5228,7 @@ void btrfs_free_tree_block(struct btrfs_trans_handle *trans, | |||
| 5227 | buf->start, buf->len, | 5228 | buf->start, buf->len, |
| 5228 | parent, root->root_key.objectid, | 5229 | parent, root->root_key.objectid, |
| 5229 | btrfs_header_level(buf), | 5230 | btrfs_header_level(buf), |
| 5230 | BTRFS_DROP_DELAYED_REF, NULL, for_cow); | 5231 | BTRFS_DROP_DELAYED_REF, NULL, 0); |
| 5231 | BUG_ON(ret); /* -ENOMEM */ | 5232 | BUG_ON(ret); /* -ENOMEM */ |
| 5232 | } | 5233 | } |
| 5233 | 5234 | ||
| @@ -6249,7 +6250,7 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans, | |||
| 6249 | struct btrfs_root *root, u32 blocksize, | 6250 | struct btrfs_root *root, u32 blocksize, |
| 6250 | u64 parent, u64 root_objectid, | 6251 | u64 parent, u64 root_objectid, |
| 6251 | struct btrfs_disk_key *key, int level, | 6252 | struct btrfs_disk_key *key, int level, |
| 6252 | u64 hint, u64 empty_size, int for_cow) | 6253 | u64 hint, u64 empty_size) |
| 6253 | { | 6254 | { |
| 6254 | struct btrfs_key ins; | 6255 | struct btrfs_key ins; |
| 6255 | struct btrfs_block_rsv *block_rsv; | 6256 | struct btrfs_block_rsv *block_rsv; |
| @@ -6297,7 +6298,7 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans, | |||
| 6297 | ins.objectid, | 6298 | ins.objectid, |
| 6298 | ins.offset, parent, root_objectid, | 6299 | ins.offset, parent, root_objectid, |
| 6299 | level, BTRFS_ADD_DELAYED_EXTENT, | 6300 | level, BTRFS_ADD_DELAYED_EXTENT, |
| 6300 | extent_op, for_cow); | 6301 | extent_op, 0); |
| 6301 | BUG_ON(ret); /* -ENOMEM */ | 6302 | BUG_ON(ret); /* -ENOMEM */ |
| 6302 | } | 6303 | } |
| 6303 | return buf; | 6304 | return buf; |
| @@ -6715,7 +6716,7 @@ static noinline int walk_up_proc(struct btrfs_trans_handle *trans, | |||
| 6715 | btrfs_header_owner(path->nodes[level + 1])); | 6716 | btrfs_header_owner(path->nodes[level + 1])); |
| 6716 | } | 6717 | } |
| 6717 | 6718 | ||
| 6718 | btrfs_free_tree_block(trans, root, eb, parent, wc->refs[level] == 1, 0); | 6719 | btrfs_free_tree_block(trans, root, eb, parent, wc->refs[level] == 1); |
| 6719 | out: | 6720 | out: |
| 6720 | wc->refs[level] = 0; | 6721 | wc->refs[level] = 0; |
| 6721 | wc->flags[level] = 0; | 6722 | wc->flags[level] = 0; |
