aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2011-11-02 09:29:35 -0400
committerChris Mason <chris.mason@oracle.com>2011-11-06 03:03:50 -0500
commitc8174313a8102e874aaa321e2fc4c7c460a87151 (patch)
tree366dc804d4b5d0d8c32d70cc554651efa552ba59
parent5a77d76c243be18d854aa1b14d697525f60e169a (diff)
Btrfs: use the global reserve when truncating the free space cache inode
We no longer use the orphan block rsv for holding the reservation for truncating the inode, so instead use the global block rsv and check to make sure it has enough space for us to truncate the space. Thanks, Signed-off-by: Josef Bacik <josef@redhat.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
-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