Skip to content

Commit

Permalink
Btrfs: only add orphan items when truncating
Browse files Browse the repository at this point in the history
We don't need an orphan item when expanding files, we just need them for
truncating them, so only add the orphan item in btrfs_truncate instead of in
btrfs_setsize.  Thanks,

Signed-off-by: Josef Bacik <josef@redhat.com>
  • Loading branch information
Josef Bacik committed Mar 17, 2011
1 parent ded5db9 commit f0cd846
Showing 1 changed file with 18 additions and 27 deletions.
45 changes: 18 additions & 27 deletions fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -3649,22 +3649,6 @@ static int btrfs_setsize(struct inode *inode, loff_t newsize)
if (newsize == oldsize)
return 0;

trans = btrfs_start_transaction(root, 5);
if (IS_ERR(trans))
return PTR_ERR(trans);

btrfs_set_trans_block_group(trans, inode);

ret = btrfs_orphan_add(trans, inode);
if (ret) {
btrfs_end_transaction(trans, root);
return ret;
}

nr = trans->blocks_used;
btrfs_end_transaction(trans, root);
btrfs_btree_balance_dirty(root, nr);

if (newsize > oldsize) {
i_size_write(inode, newsize);
btrfs_ordered_update_i_size(inode, i_size_read(inode), NULL);
Expand All @@ -3675,25 +3659,15 @@ static int btrfs_setsize(struct inode *inode, loff_t newsize)
return ret;
}

trans = btrfs_start_transaction(root, 0);
trans = btrfs_start_transaction(root, 1);
if (IS_ERR(trans))
return PTR_ERR(trans);

btrfs_set_trans_block_group(trans, inode);
trans->block_rsv = root->orphan_block_rsv;
BUG_ON(!trans->block_rsv);

/*
* If this fails just leave the orphan item so that it can get
* cleaned up next time we mount.
*/
ret = btrfs_update_inode(trans, root, inode);
if (ret) {
btrfs_end_transaction(trans, root);
return ret;
}
if (inode->i_nlink > 0)
ret = btrfs_orphan_del(trans, inode);
nr = trans->blocks_used;
btrfs_end_transaction(trans, root);
btrfs_btree_balance_dirty(root, nr);
Expand Down Expand Up @@ -6517,6 +6491,23 @@ static int btrfs_truncate(struct inode *inode)
btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1);
btrfs_ordered_update_i_size(inode, inode->i_size, NULL);

trans = btrfs_start_transaction(root, 5);
if (IS_ERR(trans))
return PTR_ERR(trans);

btrfs_set_trans_block_group(trans, inode);

ret = btrfs_orphan_add(trans, inode);
if (ret) {
btrfs_end_transaction(trans, root);
return ret;
}

nr = trans->blocks_used;
btrfs_end_transaction(trans, root);
btrfs_btree_balance_dirty(root, nr);

/* Now start a transaction for the truncate */
trans = btrfs_start_transaction(root, 0);
if (IS_ERR(trans))
return PTR_ERR(trans);
Expand Down

0 comments on commit f0cd846

Please sign in to comment.