|
@@ -197,30 +197,32 @@ int create_free_space_inode(struct btrfs_root *root,
|
|
|
block_group->key.objectid);
|
|
|
}
|
|
|
|
|
|
-int btrfs_truncate_free_space_cache(struct btrfs_root *root,
|
|
|
- struct btrfs_trans_handle *trans,
|
|
|
- struct btrfs_path *path,
|
|
|
- struct inode *inode)
|
|
|
+int btrfs_check_trunc_cache_free_space(struct btrfs_root *root,
|
|
|
+ struct btrfs_block_rsv *rsv)
|
|
|
{
|
|
|
- struct btrfs_block_rsv *rsv;
|
|
|
u64 needed_bytes;
|
|
|
- loff_t oldsize;
|
|
|
- int ret = 0;
|
|
|
-
|
|
|
- rsv = trans->block_rsv;
|
|
|
- trans->block_rsv = &root->fs_info->global_block_rsv;
|
|
|
+ int ret;
|
|
|
|
|
|
/* 1 for slack space, 1 for updating the inode */
|
|
|
needed_bytes = btrfs_calc_trunc_metadata_size(root, 1) +
|
|
|
btrfs_calc_trans_metadata_size(root, 1);
|
|
|
|
|
|
- spin_lock(&trans->block_rsv->lock);
|
|
|
- if (trans->block_rsv->reserved < needed_bytes) {
|
|
|
- spin_unlock(&trans->block_rsv->lock);
|
|
|
- trans->block_rsv = rsv;
|
|
|
- return -ENOSPC;
|
|
|
- }
|
|
|
- spin_unlock(&trans->block_rsv->lock);
|
|
|
+ spin_lock(&rsv->lock);
|
|
|
+ if (rsv->reserved < needed_bytes)
|
|
|
+ ret = -ENOSPC;
|
|
|
+ else
|
|
|
+ ret = 0;
|
|
|
+ spin_unlock(&rsv->lock);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int btrfs_truncate_free_space_cache(struct btrfs_root *root,
|
|
|
+ struct btrfs_trans_handle *trans,
|
|
|
+ struct btrfs_path *path,
|
|
|
+ struct inode *inode)
|
|
|
+{
|
|
|
+ loff_t oldsize;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
oldsize = i_size_read(inode);
|
|
|
btrfs_i_size_write(inode, 0);
|
|
@@ -232,9 +234,7 @@ int btrfs_truncate_free_space_cache(struct btrfs_root *root,
|
|
|
*/
|
|
|
ret = btrfs_truncate_inode_items(trans, root, inode,
|
|
|
0, BTRFS_EXTENT_DATA_KEY);
|
|
|
-
|
|
|
if (ret) {
|
|
|
- trans->block_rsv = rsv;
|
|
|
btrfs_abort_transaction(trans, root, ret);
|
|
|
return ret;
|
|
|
}
|
|
@@ -242,7 +242,6 @@ int btrfs_truncate_free_space_cache(struct btrfs_root *root,
|
|
|
ret = btrfs_update_inode(trans, root, inode);
|
|
|
if (ret)
|
|
|
btrfs_abort_transaction(trans, root, ret);
|
|
|
- trans->block_rsv = rsv;
|
|
|
|
|
|
return ret;
|
|
|
}
|