diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 160b55b3e132..fb9bd7832b6d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -416,7 +416,7 @@ again: | |||
416 | } | 416 | } |
417 | if (start == 0) { | 417 | if (start == 0) { |
418 | trans = btrfs_join_transaction(root, 1); | 418 | trans = btrfs_join_transaction(root, 1); |
419 | BUG_ON(!trans); | 419 | BUG_ON(IS_ERR(trans)); |
420 | btrfs_set_trans_block_group(trans, inode); | 420 | btrfs_set_trans_block_group(trans, inode); |
421 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 421 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
422 | 422 | ||
@@ -612,6 +612,7 @@ retry: | |||
612 | GFP_NOFS); | 612 | GFP_NOFS); |
613 | 613 | ||
614 | trans = btrfs_join_transaction(root, 1); | 614 | trans = btrfs_join_transaction(root, 1); |
615 | BUG_ON(IS_ERR(trans)); | ||
615 | ret = btrfs_reserve_extent(trans, root, | 616 | ret = btrfs_reserve_extent(trans, root, |
616 | async_extent->compressed_size, | 617 | async_extent->compressed_size, |
617 | async_extent->compressed_size, | 618 | async_extent->compressed_size, |
@@ -643,6 +644,7 @@ retry: | |||
643 | async_extent->ram_size - 1, 0); | 644 | async_extent->ram_size - 1, 0); |
644 | 645 | ||
645 | em = alloc_extent_map(GFP_NOFS); | 646 | em = alloc_extent_map(GFP_NOFS); |
647 | BUG_ON(!em); | ||
646 | em->start = async_extent->start; | 648 | em->start = async_extent->start; |
647 | em->len = async_extent->ram_size; | 649 | em->len = async_extent->ram_size; |
648 | em->orig_start = em->start; | 650 | em->orig_start = em->start; |
@@ -771,7 +773,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
771 | 773 | ||
772 | BUG_ON(root == root->fs_info->tree_root); | 774 | BUG_ON(root == root->fs_info->tree_root); |
773 | trans = btrfs_join_transaction(root, 1); | 775 | trans = btrfs_join_transaction(root, 1); |
774 | BUG_ON(!trans); | 776 | BUG_ON(IS_ERR(trans)); |
775 | btrfs_set_trans_block_group(trans, inode); | 777 | btrfs_set_trans_block_group(trans, inode); |
776 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 778 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
777 | 779 | ||
@@ -819,6 +821,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
819 | BUG_ON(ret); | 821 | BUG_ON(ret); |
820 | 822 | ||
821 | em = alloc_extent_map(GFP_NOFS); | 823 | em = alloc_extent_map(GFP_NOFS); |
824 | BUG_ON(!em); | ||
822 | em->start = start; | 825 | em->start = start; |
823 | em->orig_start = em->start; | 826 | em->orig_start = em->start; |
824 | ram_size = ins.offset; | 827 | ram_size = ins.offset; |
@@ -1049,7 +1052,7 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
1049 | } else { | 1052 | } else { |
1050 | trans = btrfs_join_transaction(root, 1); | 1053 | trans = btrfs_join_transaction(root, 1); |
1051 | } | 1054 | } |
1052 | BUG_ON(!trans); | 1055 | BUG_ON(IS_ERR(trans)); |
1053 | 1056 | ||
1054 | cow_start = (u64)-1; | 1057 | cow_start = (u64)-1; |
1055 | cur_offset = start; | 1058 | cur_offset = start; |
@@ -1168,6 +1171,7 @@ out_check: | |||
1168 | struct extent_map_tree *em_tree; | 1171 | struct extent_map_tree *em_tree; |
1169 | em_tree = &BTRFS_I(inode)->extent_tree; | 1172 | em_tree = &BTRFS_I(inode)->extent_tree; |
1170 | em = alloc_extent_map(GFP_NOFS); | 1173 | em = alloc_extent_map(GFP_NOFS); |
1174 | BUG_ON(!em); | ||
1171 | em->start = cur_offset; | 1175 | em->start = cur_offset; |
1172 | em->orig_start = em->start; | 1176 | em->orig_start = em->start; |
1173 | em->len = num_bytes; | 1177 | em->len = num_bytes; |
@@ -1557,6 +1561,7 @@ out: | |||
1557 | out_page: | 1561 | out_page: |
1558 | unlock_page(page); | 1562 | unlock_page(page); |
1559 | page_cache_release(page); | 1563 | page_cache_release(page); |
1564 | kfree(fixup); | ||
1560 | } | 1565 | } |
1561 | 1566 | ||
1562 | /* | 1567 | /* |
@@ -1703,7 +1708,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1703 | trans = btrfs_join_transaction_nolock(root, 1); | 1708 | trans = btrfs_join_transaction_nolock(root, 1); |
1704 | else | 1709 | else |
1705 | trans = btrfs_join_transaction(root, 1); | 1710 | trans = btrfs_join_transaction(root, 1); |
1706 | BUG_ON(!trans); | 1711 | BUG_ON(IS_ERR(trans)); |
1707 | btrfs_set_trans_block_group(trans, inode); | 1712 | btrfs_set_trans_block_group(trans, inode); |
1708 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1713 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
1709 | ret = btrfs_update_inode(trans, root, inode); | 1714 | ret = btrfs_update_inode(trans, root, inode); |
@@ -1720,6 +1725,7 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1720 | trans = btrfs_join_transaction_nolock(root, 1); | 1725 | trans = btrfs_join_transaction_nolock(root, 1); |
1721 | else | 1726 | else |
1722 | trans = btrfs_join_transaction(root, 1); | 1727 | trans = btrfs_join_transaction(root, 1); |
1728 | BUG_ON(IS_ERR(trans)); | ||
1723 | btrfs_set_trans_block_group(trans, inode); | 1729 | btrfs_set_trans_block_group(trans, inode); |
1724 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1730 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
1725 | 1731 | ||
@@ -2354,6 +2360,7 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2354 | */ | 2360 | */ |
2355 | if (is_bad_inode(inode)) { | 2361 | if (is_bad_inode(inode)) { |
2356 | trans = btrfs_start_transaction(root, 0); | 2362 | trans = btrfs_start_transaction(root, 0); |
2363 | BUG_ON(IS_ERR(trans)); | ||
2357 | btrfs_orphan_del(trans, inode); | 2364 | btrfs_orphan_del(trans, inode); |
2358 | btrfs_end_transaction(trans, root); | 2365 | btrfs_end_transaction(trans, root); |
2359 | iput(inode); | 2366 | iput(inode); |
@@ -2381,6 +2388,7 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2381 | 2388 | ||
2382 | if (root->orphan_block_rsv || root->orphan_item_inserted) { | 2389 | if (root->orphan_block_rsv || root->orphan_item_inserted) { |
2383 | trans = btrfs_join_transaction(root, 1); | 2390 | trans = btrfs_join_transaction(root, 1); |
2391 | BUG_ON(IS_ERR(trans)); | ||
2384 | btrfs_end_transaction(trans, root); | 2392 | btrfs_end_transaction(trans, root); |
2385 | } | 2393 | } |
2386 | 2394 | ||
@@ -2641,7 +2649,7 @@ int btrfs_unlink_inode(struct btrfs_trans_handle *trans, | |||
2641 | path = btrfs_alloc_path(); | 2649 | path = btrfs_alloc_path(); |
2642 | if (!path) { | 2650 | if (!path) { |
2643 | ret = -ENOMEM; | 2651 | ret = -ENOMEM; |
2644 | goto err; | 2652 | goto out; |
2645 | } | 2653 | } |
2646 | 2654 | ||
2647 | path->leave_spinning = 1; | 2655 | path->leave_spinning = 1; |
@@ -2714,9 +2722,10 @@ static int check_path_shared(struct btrfs_root *root, | |||
2714 | struct extent_buffer *eb; | 2722 | struct extent_buffer *eb; |
2715 | int level; | 2723 | int level; |
2716 | u64 refs = 1; | 2724 | u64 refs = 1; |
2717 | int uninitialized_var(ret); | ||
2718 | 2725 | ||
2719 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { | 2726 | for (level = 0; level < BTRFS_MAX_LEVEL; level++) { |
2727 | int ret; | ||
2728 | |||
2720 | if (!path->nodes[level]) | 2729 | if (!path->nodes[level]) |
2721 | break; | 2730 | break; |
2722 | eb = path->nodes[level]; | 2731 | eb = path->nodes[level]; |
@@ -2727,7 +2736,7 @@ static int check_path_shared(struct btrfs_root *root, | |||
2727 | if (refs > 1) | 2736 | if (refs > 1) |
2728 | return 1; | 2737 | return 1; |
2729 | } | 2738 | } |
2730 | return ret; /* XXX callers? */ | 2739 | return 0; |
2731 | } | 2740 | } |
2732 | 2741 | ||
2733 | /* | 2742 | /* |
@@ -4134,7 +4143,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
4134 | } | 4143 | } |
4135 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); | 4144 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); |
4136 | 4145 | ||
4137 | if (root != sub_root) { | 4146 | if (!IS_ERR(inode) && root != sub_root) { |
4138 | down_read(&root->fs_info->cleanup_work_sem); | 4147 | down_read(&root->fs_info->cleanup_work_sem); |
4139 | if (!(inode->i_sb->s_flags & MS_RDONLY)) | 4148 | if (!(inode->i_sb->s_flags & MS_RDONLY)) |
4140 | btrfs_orphan_cleanup(sub_root); | 4149 | btrfs_orphan_cleanup(sub_root); |
@@ -4347,6 +4356,8 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
4347 | trans = btrfs_join_transaction_nolock(root, 1); | 4356 | trans = btrfs_join_transaction_nolock(root, 1); |
4348 | else | 4357 | else |
4349 | trans = btrfs_join_transaction(root, 1); | 4358 | trans = btrfs_join_transaction(root, 1); |
4359 | if (IS_ERR(trans)) | ||
4360 | return PTR_ERR(trans); | ||
4350 | btrfs_set_trans_block_group(trans, inode); | 4361 | btrfs_set_trans_block_group(trans, inode); |
4351 | if (nolock) | 4362 | if (nolock) |
4352 | ret = btrfs_end_transaction_nolock(trans, root); | 4363 | ret = btrfs_end_transaction_nolock(trans, root); |
@@ -4372,6 +4383,7 @@ void btrfs_dirty_inode(struct inode *inode) | |||
4372 | return; | 4383 | return; |
4373 | 4384 | ||
4374 | trans = btrfs_join_transaction(root, 1); | 4385 | trans = btrfs_join_transaction(root, 1); |
4386 | BUG_ON(IS_ERR(trans)); | ||
4375 | btrfs_set_trans_block_group(trans, inode); | 4387 | btrfs_set_trans_block_group(trans, inode); |
4376 | 4388 | ||
4377 | ret = btrfs_update_inode(trans, root, inode); | 4389 | ret = btrfs_update_inode(trans, root, inode); |
@@ -5176,6 +5188,8 @@ again: | |||
5176 | em = NULL; | 5188 | em = NULL; |
5177 | btrfs_release_path(root, path); | 5189 | btrfs_release_path(root, path); |
5178 | trans = btrfs_join_transaction(root, 1); | 5190 | trans = btrfs_join_transaction(root, 1); |
5191 | if (IS_ERR(trans)) | ||
5192 | return ERR_CAST(trans); | ||
5179 | goto again; | 5193 | goto again; |
5180 | } | 5194 | } |
5181 | map = kmap(page); | 5195 | map = kmap(page); |
@@ -5280,8 +5294,8 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5280 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | 5294 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); |
5281 | 5295 | ||
5282 | trans = btrfs_join_transaction(root, 0); | 5296 | trans = btrfs_join_transaction(root, 0); |
5283 | if (!trans) | 5297 | if (IS_ERR(trans)) |
5284 | return ERR_PTR(-ENOMEM); | 5298 | return ERR_CAST(trans); |
5285 | 5299 | ||
5286 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 5300 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
5287 | 5301 | ||
@@ -5505,7 +5519,7 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
5505 | * while we look for nocow cross refs | 5519 | * while we look for nocow cross refs |
5506 | */ | 5520 | */ |
5507 | trans = btrfs_join_transaction(root, 0); | 5521 | trans = btrfs_join_transaction(root, 0); |
5508 | if (!trans) | 5522 | if (IS_ERR(trans)) |
5509 | goto must_cow; | 5523 | goto must_cow; |
5510 | 5524 | ||
5511 | if (can_nocow_odirect(trans, inode, start, len) == 1) { | 5525 | if (can_nocow_odirect(trans, inode, start, len) == 1) { |
@@ -5640,7 +5654,7 @@ again: | |||
5640 | BUG_ON(!ordered); | 5654 | BUG_ON(!ordered); |
5641 | 5655 | ||
5642 | trans = btrfs_join_transaction(root, 1); | 5656 | trans = btrfs_join_transaction(root, 1); |
5643 | if (!trans) { | 5657 | if (IS_ERR(trans)) { |
5644 | err = -ENOMEM; | 5658 | err = -ENOMEM; |
5645 | goto out; | 5659 | goto out; |
5646 | } | 5660 | } |