aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2011-11-08 14:49:59 -0500
committerChris Mason <chris.mason@oracle.com>2011-11-08 14:49:59 -0500
commit917c16b2b69fc2eeb432eabca73258f08c58361e (patch)
tree3eb8b7d59bbb8c7d6cb54876428b485e72878692
parent45ea6095c8f0d6caad5658306416a5d254f1205e (diff)
Btrfs: fix oops on NULL trans handle in btrfs_truncate
If we fail to reserve space in the transaction during truncate, we can error out with a NULL trans handle. The cleanup code needs an extra check to make sure we aren't trying to use the bad handle. Signed-off-by: Chris Mason <chris.mason@oracle.com>
-rw-r--r--fs/btrfs/inode.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 9d0eaa57d4ee..f60e2490bd0d 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -6529,14 +6529,16 @@ end_trans:
6529 ret = btrfs_orphan_del(NULL, inode); 6529 ret = btrfs_orphan_del(NULL, inode);
6530 } 6530 }
6531 6531
6532 trans->block_rsv = &root->fs_info->trans_block_rsv; 6532 if (trans) {
6533 ret = btrfs_update_inode(trans, root, inode); 6533 trans->block_rsv = &root->fs_info->trans_block_rsv;
6534 if (ret && !err) 6534 ret = btrfs_update_inode(trans, root, inode);
6535 err = ret; 6535 if (ret && !err)
6536 err = ret;
6536 6537
6537 nr = trans->blocks_used; 6538 nr = trans->blocks_used;
6538 ret = btrfs_end_transaction_throttle(trans, root); 6539 ret = btrfs_end_transaction_throttle(trans, root);
6539 btrfs_btree_balance_dirty(root, nr); 6540 btrfs_btree_balance_dirty(root, nr);
6541 }
6540 6542
6541out: 6543out:
6542 btrfs_free_block_rsv(root, rsv); 6544 btrfs_free_block_rsv(root, rsv);