diff options
author | Chris Mason <chris.mason@oracle.com> | 2011-11-08 20:49:59 +0100 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2011-11-08 20:49:59 +0100 |
commit | 917c16b2b69fc2eeb432eabca73258f08c58361e (patch) | |
tree | 3eb8b7d59bbb8c7d6cb54876428b485e72878692 /fs | |
parent | btrfs: fix double-free 'tree_root' in 'btrfs_mount()' (diff) | |
download | linux-917c16b2b69fc2eeb432eabca73258f08c58361e.tar.xz linux-917c16b2b69fc2eeb432eabca73258f08c58361e.zip |
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>
Diffstat (limited to 'fs')
-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: ret = btrfs_orphan_del(NULL, inode); } - trans->block_rsv = &root->fs_info->trans_block_rsv; - ret = btrfs_update_inode(trans, root, inode); - if (ret && !err) - err = ret; + if (trans) { + trans->block_rsv = &root->fs_info->trans_block_rsv; + ret = btrfs_update_inode(trans, root, inode); + if (ret && !err) + err = ret; - nr = trans->blocks_used; - ret = btrfs_end_transaction_throttle(trans, root); - btrfs_btree_balance_dirty(root, nr); + nr = trans->blocks_used; + ret = btrfs_end_transaction_throttle(trans, root); + btrfs_btree_balance_dirty(root, nr); + } out: btrfs_free_block_rsv(root, rsv); |