From 58f683bec23c6f087b481b1d080b044bd034857e Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Fri, 19 Aug 2011 10:29:59 -0400 Subject: [PATCH] --- yaml --- r: 274617 b: refs/heads/master c: 07127184efb629f1336c0592bfdacec258cab731 h: refs/heads/master i: 274615: 2fdb9c68b248739774c486231ec9651f19b4d7f4 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/ctree.h | 11 +++++++++++ trunk/fs/btrfs/inode.c | 8 ++++---- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 0d0c20f2059f..ed2f4ddf9cee 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1b9c332b6c92e992b1971a08412c6f460a54b514 +refs/heads/master: 07127184efb629f1336c0592bfdacec258cab731 diff --git a/trunk/fs/btrfs/ctree.h b/trunk/fs/btrfs/ctree.h index 22a9347a3908..2e18b068841b 100644 --- a/trunk/fs/btrfs/ctree.h +++ b/trunk/fs/btrfs/ctree.h @@ -2125,6 +2125,17 @@ static inline u64 btrfs_calc_trans_metadata_size(struct btrfs_root *root, 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); int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, struct btrfs_root *root, unsigned long count); diff --git a/trunk/fs/btrfs/inode.c b/trunk/fs/btrfs/inode.c index 4d057c084de6..8316b570db55 100644 --- a/trunk/fs/btrfs/inode.c +++ b/trunk/fs/btrfs/inode.c @@ -3528,7 +3528,7 @@ void btrfs_evict_inode(struct inode *inode) struct btrfs_trans_handle *trans; struct btrfs_root *root = BTRFS_I(inode)->root; 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; int ret; @@ -6482,7 +6482,7 @@ static int btrfs_truncate(struct inode *inode) struct btrfs_trans_handle *trans; unsigned long nr; 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); if (ret) @@ -6532,12 +6532,12 @@ static int btrfs_truncate(struct inode *inode) 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 deletion * 1 for updating the inode. */ - trans = btrfs_start_transaction(root, 5); + trans = btrfs_start_transaction(root, 4); if (IS_ERR(trans)) { err = PTR_ERR(trans); goto out;