diff options
author | Chris Mason <chris.mason@oracle.com> | 2011-11-08 14:49:59 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2011-11-08 14:49:59 -0500 |
commit | 917c16b2b69fc2eeb432eabca73258f08c58361e (patch) | |
tree | 3eb8b7d59bbb8c7d6cb54876428b485e72878692 | |
parent | 45ea6095c8f0d6caad5658306416a5d254f1205e (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.c | 16 |
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 | ||
6541 | out: | 6543 | out: |
6542 | btrfs_free_block_rsv(root, rsv); | 6544 | btrfs_free_block_rsv(root, rsv); |