aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/free-space-cache.c22
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