Commit 07127184 authored by Josef Bacik's avatar Josef Bacik

Btrfs: reduce the amount of space needed for truncates

With btrfs_truncate_inode_items we always return if we have to go to another
leaf, which makes us do our reservation again.  This means we will only ever
modify one leaf at a time, so we only need 1 items worth of slack space.  Also,
since we are deleting we will not be creating nodes as we go down, if anything
we'll be free'ing them as we merge them together, so make a different
calculation for truncate which will only have the worst case useage of COW'ing
the entire path down to the leaf.  Thanks,
Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
parent 1b9c332b
...@@ -2125,6 +2125,17 @@ static inline u64 btrfs_calc_trans_metadata_size(struct btrfs_root *root, ...@@ -2125,6 +2125,17 @@ static inline u64 btrfs_calc_trans_metadata_size(struct btrfs_root *root,
3 * num_items; 3 * num_items;
} }
/*
* Doing a truncate won't result in new nodes or leaves, just what we need for
* COW.
*/
static inline u64 btrfs_calc_trunc_metadata_size(struct btrfs_root *root,
unsigned num_items)
{
return (root->leafsize + root->nodesize * (BTRFS_MAX_LEVEL - 1)) *
num_items;
}
void btrfs_put_block_group(struct btrfs_block_group_cache *cache); void btrfs_put_block_group(struct btrfs_block_group_cache *cache);
int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,
struct btrfs_root *root, unsigned long count); struct btrfs_root *root, unsigned long count);
......
...@@ -3528,7 +3528,7 @@ void btrfs_evict_inode(struct inode *inode) ...@@ -3528,7 +3528,7 @@ void btrfs_evict_inode(struct inode *inode)
struct btrfs_trans_handle *trans; struct btrfs_trans_handle *trans;
struct btrfs_root *root = BTRFS_I(inode)->root; struct btrfs_root *root = BTRFS_I(inode)->root;
struct btrfs_block_rsv *rsv; struct btrfs_block_rsv *rsv;
u64 min_size = btrfs_calc_trans_metadata_size(root, 2); u64 min_size = btrfs_calc_trunc_metadata_size(root, 1);
unsigned long nr; unsigned long nr;
int ret; int ret;
...@@ -6482,7 +6482,7 @@ static int btrfs_truncate(struct inode *inode) ...@@ -6482,7 +6482,7 @@ static int btrfs_truncate(struct inode *inode)
struct btrfs_trans_handle *trans; struct btrfs_trans_handle *trans;
unsigned long nr; unsigned long nr;
u64 mask = root->sectorsize - 1; u64 mask = root->sectorsize - 1;
u64 min_size = btrfs_calc_trans_metadata_size(root, 2); u64 min_size = btrfs_calc_trunc_metadata_size(root, 1);
ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); ret = btrfs_truncate_page(inode->i_mapping, inode->i_size);
if (ret) if (ret)
...@@ -6532,12 +6532,12 @@ static int btrfs_truncate(struct inode *inode) ...@@ -6532,12 +6532,12 @@ static int btrfs_truncate(struct inode *inode)
return -ENOMEM; return -ENOMEM;
/* /*
* 2 for the truncate slack space * 1 for the truncate slack space
* 1 for the orphan item we're going to add * 1 for the orphan item we're going to add
* 1 for the orphan item deletion * 1 for the orphan item deletion
* 1 for updating the inode. * 1 for updating the inode.
*/ */
trans = btrfs_start_transaction(root, 5); trans = btrfs_start_transaction(root, 4);
if (IS_ERR(trans)) { if (IS_ERR(trans)) {
err = PTR_ERR(trans); err = PTR_ERR(trans);
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment