diff options
-rw-r--r-- | fs/btrfs/free-space-cache.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index f49475dfa954..7a15fcfb3e1f 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
@@ -198,14 +198,24 @@ int btrfs_truncate_free_space_cache(struct btrfs_root *root, | |||
198 | struct inode *inode) | 198 | struct inode *inode) |
199 | { | 199 | { |
200 | struct btrfs_block_rsv *rsv; | 200 | struct btrfs_block_rsv *rsv; |
201 | u64 needed_bytes; | ||
201 | loff_t oldsize; | 202 | loff_t oldsize; |
202 | int ret = 0; | 203 | int ret = 0; |
203 | 204 | ||
204 | rsv = trans->block_rsv; | 205 | rsv = trans->block_rsv; |
205 | trans->block_rsv = root->orphan_block_rsv; | 206 | trans->block_rsv = &root->fs_info->global_block_rsv; |
206 | ret = btrfs_block_rsv_check(root, root->orphan_block_rsv, 5); | 207 | |
207 | if (ret) | 208 | /* 1 for slack space, 1 for updating the inode */ |
208 | return ret; | 209 | needed_bytes = btrfs_calc_trunc_metadata_size(root, 1) + |
210 | btrfs_calc_trans_metadata_size(root, 1); | ||
211 | |||
212 | spin_lock(&trans->block_rsv->lock); | ||
213 | if (trans->block_rsv->reserved < needed_bytes) { | ||
214 | spin_unlock(&trans->block_rsv->lock); | ||
215 | trans->block_rsv = rsv; | ||
216 | return -ENOSPC; | ||
217 | } | ||
218 | spin_unlock(&trans->block_rsv->lock); | ||
209 | 219 | ||
210 | oldsize = i_size_read(inode); | 220 | oldsize = i_size_read(inode); |
211 | btrfs_i_size_write(inode, 0); | 221 | btrfs_i_size_write(inode, 0); |
@@ -218,13 +228,15 @@ int btrfs_truncate_free_space_cache(struct btrfs_root *root, | |||
218 | ret = btrfs_truncate_inode_items(trans, root, inode, | 228 | ret = btrfs_truncate_inode_items(trans, root, inode, |
219 | 0, BTRFS_EXTENT_DATA_KEY); | 229 | 0, BTRFS_EXTENT_DATA_KEY); |
220 | 230 | ||
221 | trans->block_rsv = rsv; | ||
222 | if (ret) { | 231 | if (ret) { |
232 | trans->block_rsv = rsv; | ||
223 | WARN_ON(1); | 233 | WARN_ON(1); |
224 | return ret; | 234 | return ret; |
225 | } | 235 | } |
226 | 236 | ||
227 | ret = btrfs_update_inode(trans, root, inode); | 237 | ret = btrfs_update_inode(trans, root, inode); |
238 | trans->block_rsv = rsv; | ||
239 | |||
228 | return ret; | 240 | return ret; |
229 | } | 241 | } |
230 | 242 | ||