aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/inode.c
diff options
context:
space:
mode:
authorJeff Mahoney <jeffm@suse.com>2012-03-12 11:03:00 -0400
committerDavid Sterba <dsterba@suse.cz>2012-03-22 06:52:54 -0400
commit79787eaab46121d4713ed03c8fc63b9ec3eaec76 (patch)
treeee6b17d0811ee54ab74a03aa4e0bb92769d2f12a /fs/btrfs/inode.c
parent49b25e0540904be0bf558b84475c69d72e4de66e (diff)
btrfs: replace many BUG_ONs with proper error handling
btrfs currently handles most errors with BUG_ON. This patch is a work-in- progress but aims to handle most errors other than internal logic errors and ENOMEM more gracefully. This iteration prevents most crashes but can run into lockups with the page lock on occasion when the timing "works out." Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r--fs/btrfs/inode.c378
1 files changed, 279 insertions, 99 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 41132339e2e..d6420cca9c8 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -150,7 +150,6 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans,
150 inode_add_bytes(inode, size); 150 inode_add_bytes(inode, size);
151 ret = btrfs_insert_empty_item(trans, root, path, &key, 151 ret = btrfs_insert_empty_item(trans, root, path, &key,
152 datasize); 152 datasize);
153 BUG_ON(ret);
154 if (ret) { 153 if (ret) {
155 err = ret; 154 err = ret;
156 goto fail; 155 goto fail;
@@ -206,9 +205,9 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans,
206 * could end up racing with unlink. 205 * could end up racing with unlink.
207 */ 206 */
208 BTRFS_I(inode)->disk_i_size = inode->i_size; 207 BTRFS_I(inode)->disk_i_size = inode->i_size;
209 btrfs_update_inode(trans, root, inode); 208 ret = btrfs_update_inode(trans, root, inode);
210 209
211 return 0; 210 return ret;
212fail: 211fail:
213 btrfs_free_path(path); 212 btrfs_free_path(path);
214 return err; 213 return err;
@@ -250,14 +249,18 @@ static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans,
250 249
251 ret = btrfs_drop_extents(trans, inode, start, aligned_end, 250 ret = btrfs_drop_extents(trans, inode, start, aligned_end,
252 &hint_byte, 1); 251 &hint_byte, 1);
253 BUG_ON(ret); 252 if (ret)
253 return ret;
254 254
255 if (isize > actual_end) 255 if (isize > actual_end)
256 inline_len = min_t(u64, isize, actual_end); 256 inline_len = min_t(u64, isize, actual_end);
257 ret = insert_inline_extent(trans, root, inode, start, 257 ret = insert_inline_extent(trans, root, inode, start,
258 inline_len, compressed_size, 258 inline_len, compressed_size,
259 compress_type, compressed_pages); 259 compress_type, compressed_pages);
260 BUG_ON(ret); 260 if (ret) {
261 btrfs_abort_transaction(trans, root, ret);
262 return ret;
263 }
261 btrfs_delalloc_release_metadata(inode, end + 1 - start); 264 btrfs_delalloc_release_metadata(inode, end + 1 - start);
262 btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0); 265 btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0);
263 return 0; 266 return 0;
@@ -293,7 +296,7 @@ static noinline int add_async_extent(struct async_cow *cow,
293 struct async_extent *async_extent; 296 struct async_extent *async_extent;
294 297
295 async_extent = kmalloc(sizeof(*async_extent), GFP_NOFS); 298 async_extent = kmalloc(sizeof(*async_extent), GFP_NOFS);
296 BUG_ON(!async_extent); 299 BUG_ON(!async_extent); /* -ENOMEM */
297 async_extent->start = start; 300 async_extent->start = start;
298 async_extent->ram_size = ram_size; 301 async_extent->ram_size = ram_size;
299 async_extent->compressed_size = compressed_size; 302 async_extent->compressed_size = compressed_size;
@@ -433,7 +436,11 @@ again:
433cont: 436cont:
434 if (start == 0) { 437 if (start == 0) {
435 trans = btrfs_join_transaction(root); 438 trans = btrfs_join_transaction(root);
436 BUG_ON(IS_ERR(trans)); 439 if (IS_ERR(trans)) {
440 ret = PTR_ERR(trans);
441 trans = NULL;
442 goto cleanup_and_out;
443 }
437 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 444 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
438 445
439 /* lets try to make an inline extent */ 446 /* lets try to make an inline extent */
@@ -450,11 +457,11 @@ cont:
450 total_compressed, 457 total_compressed,
451 compress_type, pages); 458 compress_type, pages);
452 } 459 }
453 if (ret == 0) { 460 if (ret <= 0) {
454 /* 461 /*
455 * inline extent creation worked, we don't need 462 * inline extent creation worked or returned error,
456 * to create any more async work items. Unlock 463 * we don't need to create any more async work items.
457 * and free up our temp pages. 464 * Unlock and free up our temp pages.
458 */ 465 */
459 extent_clear_unlock_delalloc(inode, 466 extent_clear_unlock_delalloc(inode,
460 &BTRFS_I(inode)->io_tree, 467 &BTRFS_I(inode)->io_tree,
@@ -547,7 +554,7 @@ cleanup_and_bail_uncompressed:
547 } 554 }
548 555
549out: 556out:
550 return 0; 557 return ret;
551 558
552free_pages_out: 559free_pages_out:
553 for (i = 0; i < nr_pages_ret; i++) { 560 for (i = 0; i < nr_pages_ret; i++) {
@@ -557,6 +564,20 @@ free_pages_out:
557 kfree(pages); 564 kfree(pages);
558 565
559 goto out; 566 goto out;
567
568cleanup_and_out:
569 extent_clear_unlock_delalloc(inode, &BTRFS_I(inode)->io_tree,
570 start, end, NULL,
571 EXTENT_CLEAR_UNLOCK_PAGE |
572 EXTENT_CLEAR_DIRTY |
573 EXTENT_CLEAR_DELALLOC |
574 EXTENT_SET_WRITEBACK |
575 EXTENT_END_WRITEBACK);
576 if (!trans || IS_ERR(trans))
577 btrfs_error(root->fs_info, ret, "Failed to join transaction");
578 else
579 btrfs_abort_transaction(trans, root, ret);
580 goto free_pages_out;
560} 581}
561 582
562/* 583/*
@@ -606,6 +627,8 @@ retry:
606 async_extent->ram_size - 1, 627 async_extent->ram_size - 1,
607 &page_started, &nr_written, 0); 628 &page_started, &nr_written, 0);
608 629
630 /* JDM XXX */
631
609 /* 632 /*
610 * if page_started, cow_file_range inserted an 633 * if page_started, cow_file_range inserted an
611 * inline extent and took care of all the unlocking 634 * inline extent and took care of all the unlocking
@@ -628,14 +651,19 @@ retry:
628 async_extent->start + async_extent->ram_size - 1); 651 async_extent->start + async_extent->ram_size - 1);
629 652
630 trans = btrfs_join_transaction(root); 653 trans = btrfs_join_transaction(root);
631 BUG_ON(IS_ERR(trans)); 654 if (IS_ERR(trans)) {
632 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 655 ret = PTR_ERR(trans);
633 ret = btrfs_reserve_extent(trans, root, 656 } else {
657 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
658 ret = btrfs_reserve_extent(trans, root,
634 async_extent->compressed_size, 659 async_extent->compressed_size,
635 async_extent->compressed_size, 660 async_extent->compressed_size,
636 0, alloc_hint, 661 0, alloc_hint,
637 (u64)-1, &ins, 1); 662 (u64)-1, &ins, 1);
638 btrfs_end_transaction(trans, root); 663 if (ret)
664 btrfs_abort_transaction(trans, root, ret);
665 btrfs_end_transaction(trans, root);
666 }
639 667
640 if (ret) { 668 if (ret) {
641 int i; 669 int i;
@@ -649,7 +677,9 @@ retry:
649 unlock_extent(io_tree, async_extent->start, 677 unlock_extent(io_tree, async_extent->start,
650 async_extent->start + 678 async_extent->start +
651 async_extent->ram_size - 1); 679 async_extent->ram_size - 1);
652 goto retry; 680 if (ret == -ENOSPC)
681 goto retry;
682 goto out_free; /* JDM: Requeue? */
653 } 683 }
654 684
655 /* 685 /*
@@ -661,7 +691,7 @@ retry:
661 async_extent->ram_size - 1, 0); 691 async_extent->ram_size - 1, 0);
662 692
663 em = alloc_extent_map(); 693 em = alloc_extent_map();
664 BUG_ON(!em); 694 BUG_ON(!em); /* -ENOMEM */
665 em->start = async_extent->start; 695 em->start = async_extent->start;
666 em->len = async_extent->ram_size; 696 em->len = async_extent->ram_size;
667 em->orig_start = em->start; 697 em->orig_start = em->start;
@@ -693,7 +723,7 @@ retry:
693 ins.offset, 723 ins.offset,
694 BTRFS_ORDERED_COMPRESSED, 724 BTRFS_ORDERED_COMPRESSED,
695 async_extent->compress_type); 725 async_extent->compress_type);
696 BUG_ON(ret); 726 BUG_ON(ret); /* -ENOMEM */
697 727
698 /* 728 /*
699 * clear dirty, set writeback and unlock the pages. 729 * clear dirty, set writeback and unlock the pages.
@@ -715,13 +745,17 @@ retry:
715 ins.offset, async_extent->pages, 745 ins.offset, async_extent->pages,
716 async_extent->nr_pages); 746 async_extent->nr_pages);
717 747
718 BUG_ON(ret); 748 BUG_ON(ret); /* -ENOMEM */
719 alloc_hint = ins.objectid + ins.offset; 749 alloc_hint = ins.objectid + ins.offset;
720 kfree(async_extent); 750 kfree(async_extent);
721 cond_resched(); 751 cond_resched();
722 } 752 }
723 753 ret = 0;
724 return 0; 754out:
755 return ret;
756out_free:
757 kfree(async_extent);
758 goto out;
725} 759}
726 760
727static u64 get_extent_allocation_hint(struct inode *inode, u64 start, 761static u64 get_extent_allocation_hint(struct inode *inode, u64 start,
@@ -790,7 +824,18 @@ static noinline int cow_file_range(struct inode *inode,
790 824
791 BUG_ON(btrfs_is_free_space_inode(root, inode)); 825 BUG_ON(btrfs_is_free_space_inode(root, inode));
792 trans = btrfs_join_transaction(root); 826 trans = btrfs_join_transaction(root);
793 BUG_ON(IS_ERR(trans)); 827 if (IS_ERR(trans)) {
828 extent_clear_unlock_delalloc(inode,
829 &BTRFS_I(inode)->io_tree,
830 start, end, NULL,
831 EXTENT_CLEAR_UNLOCK_PAGE |
832 EXTENT_CLEAR_UNLOCK |
833 EXTENT_CLEAR_DELALLOC |
834 EXTENT_CLEAR_DIRTY |
835 EXTENT_SET_WRITEBACK |
836 EXTENT_END_WRITEBACK);
837 return PTR_ERR(trans);
838 }
794 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 839 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
795 840
796 num_bytes = (end - start + blocksize) & ~(blocksize - 1); 841 num_bytes = (end - start + blocksize) & ~(blocksize - 1);
@@ -820,8 +865,10 @@ static noinline int cow_file_range(struct inode *inode,
820 *nr_written = *nr_written + 865 *nr_written = *nr_written +
821 (end - start + PAGE_CACHE_SIZE) / PAGE_CACHE_SIZE; 866 (end - start + PAGE_CACHE_SIZE) / PAGE_CACHE_SIZE;
822 *page_started = 1; 867 *page_started = 1;
823 ret = 0;
824 goto out; 868 goto out;
869 } else if (ret < 0) {
870 btrfs_abort_transaction(trans, root, ret);
871 goto out_unlock;
825 } 872 }
826 } 873 }
827 874
@@ -838,10 +885,13 @@ static noinline int cow_file_range(struct inode *inode,
838 ret = btrfs_reserve_extent(trans, root, cur_alloc_size, 885 ret = btrfs_reserve_extent(trans, root, cur_alloc_size,
839 root->sectorsize, 0, alloc_hint, 886 root->sectorsize, 0, alloc_hint,
840 (u64)-1, &ins, 1); 887 (u64)-1, &ins, 1);
841 BUG_ON(ret); 888 if (ret < 0) {
889 btrfs_abort_transaction(trans, root, ret);
890 goto out_unlock;
891 }
842 892
843 em = alloc_extent_map(); 893 em = alloc_extent_map();
844 BUG_ON(!em); 894 BUG_ON(!em); /* -ENOMEM */
845 em->start = start; 895 em->start = start;
846 em->orig_start = em->start; 896 em->orig_start = em->start;
847 ram_size = ins.offset; 897 ram_size = ins.offset;
@@ -867,13 +917,16 @@ static noinline int cow_file_range(struct inode *inode,
867 cur_alloc_size = ins.offset; 917 cur_alloc_size = ins.offset;
868 ret = btrfs_add_ordered_extent(inode, start, ins.objectid, 918 ret = btrfs_add_ordered_extent(inode, start, ins.objectid,
869 ram_size, cur_alloc_size, 0); 919 ram_size, cur_alloc_size, 0);
870 BUG_ON(ret); 920 BUG_ON(ret); /* -ENOMEM */
871 921
872 if (root->root_key.objectid == 922 if (root->root_key.objectid ==
873 BTRFS_DATA_RELOC_TREE_OBJECTID) { 923 BTRFS_DATA_RELOC_TREE_OBJECTID) {
874 ret = btrfs_reloc_clone_csums(inode, start, 924 ret = btrfs_reloc_clone_csums(inode, start,
875 cur_alloc_size); 925 cur_alloc_size);
876 BUG_ON(ret); 926 if (ret) {
927 btrfs_abort_transaction(trans, root, ret);
928 goto out_unlock;
929 }
877 } 930 }
878 931
879 if (disk_num_bytes < cur_alloc_size) 932 if (disk_num_bytes < cur_alloc_size)
@@ -898,11 +951,23 @@ static noinline int cow_file_range(struct inode *inode,
898 alloc_hint = ins.objectid + ins.offset; 951 alloc_hint = ins.objectid + ins.offset;
899 start += cur_alloc_size; 952 start += cur_alloc_size;
900 } 953 }
901out:
902 ret = 0; 954 ret = 0;
955out:
903 btrfs_end_transaction(trans, root); 956 btrfs_end_transaction(trans, root);
904 957
905 return ret; 958 return ret;
959out_unlock:
960 extent_clear_unlock_delalloc(inode,
961 &BTRFS_I(inode)->io_tree,
962 start, end, NULL,
963 EXTENT_CLEAR_UNLOCK_PAGE |
964 EXTENT_CLEAR_UNLOCK |
965 EXTENT_CLEAR_DELALLOC |
966 EXTENT_CLEAR_DIRTY |
967 EXTENT_SET_WRITEBACK |
968 EXTENT_END_WRITEBACK);
969
970 goto out;
906} 971}
907 972
908/* 973/*
@@ -968,7 +1033,7 @@ static int cow_file_range_async(struct inode *inode, struct page *locked_page,
968 1, 0, NULL, GFP_NOFS); 1033 1, 0, NULL, GFP_NOFS);
969 while (start < end) { 1034 while (start < end) {
970 async_cow = kmalloc(sizeof(*async_cow), GFP_NOFS); 1035 async_cow = kmalloc(sizeof(*async_cow), GFP_NOFS);
971 BUG_ON(!async_cow); 1036 BUG_ON(!async_cow); /* -ENOMEM */
972 async_cow->inode = inode; 1037 async_cow->inode = inode;
973 async_cow->root = root; 1038 async_cow->root = root;
974 async_cow->locked_page = locked_page; 1039 async_cow->locked_page = locked_page;
@@ -1059,7 +1124,7 @@ static noinline int run_delalloc_nocow(struct inode *inode,
1059 u64 disk_bytenr; 1124 u64 disk_bytenr;
1060 u64 num_bytes; 1125 u64 num_bytes;
1061 int extent_type; 1126 int extent_type;
1062 int ret; 1127 int ret, err;
1063 int type; 1128 int type;
1064 int nocow; 1129 int nocow;
1065 int check_prev = 1; 1130 int check_prev = 1;
@@ -1077,7 +1142,11 @@ static noinline int run_delalloc_nocow(struct inode *inode,
1077 else 1142 else
1078 trans = btrfs_join_transaction(root); 1143 trans = btrfs_join_transaction(root);
1079 1144
1080 BUG_ON(IS_ERR(trans)); 1145 if (IS_ERR(trans)) {
1146 btrfs_free_path(path);
1147 return PTR_ERR(trans);
1148 }
1149
1081 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 1150 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
1082 1151
1083 cow_start = (u64)-1; 1152 cow_start = (u64)-1;
@@ -1085,7 +1154,10 @@ static noinline int run_delalloc_nocow(struct inode *inode,
1085 while (1) { 1154 while (1) {
1086 ret = btrfs_lookup_file_extent(trans, root, path, ino, 1155 ret = btrfs_lookup_file_extent(trans, root, path, ino,
1087 cur_offset, 0); 1156 cur_offset, 0);
1088 BUG_ON(ret < 0); 1157 if (ret < 0) {
1158 btrfs_abort_transaction(trans, root, ret);
1159 goto error;
1160 }
1089 if (ret > 0 && path->slots[0] > 0 && check_prev) { 1161 if (ret > 0 && path->slots[0] > 0 && check_prev) {
1090 leaf = path->nodes[0]; 1162 leaf = path->nodes[0];
1091 btrfs_item_key_to_cpu(leaf, &found_key, 1163 btrfs_item_key_to_cpu(leaf, &found_key,
@@ -1099,8 +1171,10 @@ next_slot:
1099 leaf = path->nodes[0]; 1171 leaf = path->nodes[0];
1100 if (path->slots[0] >= btrfs_header_nritems(leaf)) { 1172 if (path->slots[0] >= btrfs_header_nritems(leaf)) {
1101 ret = btrfs_next_leaf(root, path); 1173 ret = btrfs_next_leaf(root, path);
1102 if (ret < 0) 1174 if (ret < 0) {
1103 BUG_ON(1); 1175 btrfs_abort_transaction(trans, root, ret);
1176 goto error;
1177 }
1104 if (ret > 0) 1178 if (ret > 0)
1105 break; 1179 break;
1106 leaf = path->nodes[0]; 1180 leaf = path->nodes[0];
@@ -1188,7 +1262,10 @@ out_check:
1188 ret = cow_file_range(inode, locked_page, cow_start, 1262 ret = cow_file_range(inode, locked_page, cow_start,
1189 found_key.offset - 1, page_started, 1263 found_key.offset - 1, page_started,
1190 nr_written, 1); 1264 nr_written, 1);
1191 BUG_ON(ret); 1265 if (ret) {
1266 btrfs_abort_transaction(trans, root, ret);
1267 goto error;
1268 }
1192 cow_start = (u64)-1; 1269 cow_start = (u64)-1;
1193 } 1270 }
1194 1271
@@ -1197,7 +1274,7 @@ out_check:
1197 struct extent_map_tree *em_tree; 1274 struct extent_map_tree *em_tree;
1198 em_tree = &BTRFS_I(inode)->extent_tree; 1275 em_tree = &BTRFS_I(inode)->extent_tree;
1199 em = alloc_extent_map(); 1276 em = alloc_extent_map();
1200 BUG_ON(!em); 1277 BUG_ON(!em); /* -ENOMEM */
1201 em->start = cur_offset; 1278 em->start = cur_offset;
1202 em->orig_start = em->start; 1279 em->orig_start = em->start;
1203 em->len = num_bytes; 1280 em->len = num_bytes;
@@ -1223,13 +1300,16 @@ out_check:
1223 1300
1224 ret = btrfs_add_ordered_extent(inode, cur_offset, disk_bytenr, 1301 ret = btrfs_add_ordered_extent(inode, cur_offset, disk_bytenr,
1225 num_bytes, num_bytes, type); 1302 num_bytes, num_bytes, type);
1226 BUG_ON(ret); 1303 BUG_ON(ret); /* -ENOMEM */
1227 1304
1228 if (root->root_key.objectid == 1305 if (root->root_key.objectid ==
1229 BTRFS_DATA_RELOC_TREE_OBJECTID) { 1306 BTRFS_DATA_RELOC_TREE_OBJECTID) {
1230 ret = btrfs_reloc_clone_csums(inode, cur_offset, 1307 ret = btrfs_reloc_clone_csums(inode, cur_offset,
1231 num_bytes); 1308 num_bytes);
1232 BUG_ON(ret); 1309 if (ret) {
1310 btrfs_abort_transaction(trans, root, ret);
1311 goto error;
1312 }
1233 } 1313 }
1234 1314
1235 extent_clear_unlock_delalloc(inode, &BTRFS_I(inode)->io_tree, 1315 extent_clear_unlock_delalloc(inode, &BTRFS_I(inode)->io_tree,
@@ -1248,18 +1328,23 @@ out_check:
1248 if (cow_start != (u64)-1) { 1328 if (cow_start != (u64)-1) {
1249 ret = cow_file_range(inode, locked_page, cow_start, end, 1329 ret = cow_file_range(inode, locked_page, cow_start, end,
1250 page_started, nr_written, 1); 1330 page_started, nr_written, 1);
1251 BUG_ON(ret); 1331 if (ret) {
1332 btrfs_abort_transaction(trans, root, ret);
1333 goto error;
1334 }
1252 } 1335 }
1253 1336
1337error:
1254 if (nolock) { 1338 if (nolock) {
1255 ret = btrfs_end_transaction_nolock(trans, root); 1339 err = btrfs_end_transaction_nolock(trans, root);
1256 BUG_ON(ret);
1257 } else { 1340 } else {
1258 ret = btrfs_end_transaction(trans, root); 1341 err = btrfs_end_transaction(trans, root);
1259 BUG_ON(ret);
1260 } 1342 }
1343 if (!ret)
1344 ret = err;
1345
1261 btrfs_free_path(path); 1346 btrfs_free_path(path);
1262 return 0; 1347 return ret;
1263} 1348}
1264 1349
1265/* 1350/*
@@ -1448,7 +1533,7 @@ static int __btrfs_submit_bio_start(struct inode *inode, int rw,
1448 int ret = 0; 1533 int ret = 0;
1449 1534
1450 ret = btrfs_csum_one_bio(root, inode, bio, 0, 0); 1535 ret = btrfs_csum_one_bio(root, inode, bio, 0, 0);
1451 BUG_ON(ret); 1536 BUG_ON(ret); /* -ENOMEM */
1452 return 0; 1537 return 0;
1453} 1538}
1454 1539
@@ -1677,13 +1762,15 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans,
1677 */ 1762 */
1678 ret = btrfs_drop_extents(trans, inode, file_pos, file_pos + num_bytes, 1763 ret = btrfs_drop_extents(trans, inode, file_pos, file_pos + num_bytes,
1679 &hint, 0); 1764 &hint, 0);
1680 BUG_ON(ret); 1765 if (ret)
1766 goto out;
1681 1767
1682 ins.objectid = btrfs_ino(inode); 1768 ins.objectid = btrfs_ino(inode);
1683 ins.offset = file_pos; 1769 ins.offset = file_pos;
1684 ins.type = BTRFS_EXTENT_DATA_KEY; 1770 ins.type = BTRFS_EXTENT_DATA_KEY;
1685 ret = btrfs_insert_empty_item(trans, root, path, &ins, sizeof(*fi)); 1771 ret = btrfs_insert_empty_item(trans, root, path, &ins, sizeof(*fi));
1686 BUG_ON(ret); 1772 if (ret)
1773 goto out;
1687 leaf = path->nodes[0]; 1774 leaf = path->nodes[0];
1688 fi = btrfs_item_ptr(leaf, path->slots[0], 1775 fi = btrfs_item_ptr(leaf, path->slots[0],
1689 struct btrfs_file_extent_item); 1776 struct btrfs_file_extent_item);
@@ -1711,10 +1798,10 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans,
1711 ret = btrfs_alloc_reserved_file_extent(trans, root, 1798 ret = btrfs_alloc_reserved_file_extent(trans, root,
1712 root->root_key.objectid, 1799 root->root_key.objectid,
1713 btrfs_ino(inode), file_pos, &ins); 1800 btrfs_ino(inode), file_pos, &ins);
1714 BUG_ON(ret); 1801out:
1715 btrfs_free_path(path); 1802 btrfs_free_path(path);
1716 1803
1717 return 0; 1804 return ret;
1718} 1805}
1719 1806
1720/* 1807/*
@@ -1742,22 +1829,24 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1742 end - start + 1); 1829 end - start + 1);
1743 if (!ret) 1830 if (!ret)
1744 return 0; 1831 return 0;
1745 BUG_ON(!ordered_extent); 1832 BUG_ON(!ordered_extent); /* Logic error */
1746 1833
1747 nolock = btrfs_is_free_space_inode(root, inode); 1834 nolock = btrfs_is_free_space_inode(root, inode);
1748 1835
1749 if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { 1836 if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) {
1750 BUG_ON(!list_empty(&ordered_extent->list)); 1837 BUG_ON(!list_empty(&ordered_extent->list)); /* Logic error */
1751 ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); 1838 ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent);
1752 if (!ret) { 1839 if (!ret) {
1753 if (nolock) 1840 if (nolock)
1754 trans = btrfs_join_transaction_nolock(root); 1841 trans = btrfs_join_transaction_nolock(root);
1755 else 1842 else
1756 trans = btrfs_join_transaction(root); 1843 trans = btrfs_join_transaction(root);
1757 BUG_ON(IS_ERR(trans)); 1844 if (IS_ERR(trans))
1845 return PTR_ERR(trans);
1758 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 1846 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
1759 ret = btrfs_update_inode_fallback(trans, root, inode); 1847 ret = btrfs_update_inode_fallback(trans, root, inode);
1760 BUG_ON(ret); 1848 if (ret) /* -ENOMEM or corruption */
1849 btrfs_abort_transaction(trans, root, ret);
1761 } 1850 }
1762 goto out; 1851 goto out;
1763 } 1852 }
@@ -1770,7 +1859,11 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1770 trans = btrfs_join_transaction_nolock(root); 1859 trans = btrfs_join_transaction_nolock(root);
1771 else 1860 else
1772 trans = btrfs_join_transaction(root); 1861 trans = btrfs_join_transaction(root);
1773 BUG_ON(IS_ERR(trans)); 1862 if (IS_ERR(trans)) {
1863 ret = PTR_ERR(trans);
1864 trans = NULL;
1865 goto out_unlock;
1866 }
1774 trans->block_rsv = &root->fs_info->delalloc_block_rsv; 1867 trans->block_rsv = &root->fs_info->delalloc_block_rsv;
1775 1868
1776 if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) 1869 if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags))
@@ -1781,7 +1874,6 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1781 ordered_extent->file_offset, 1874 ordered_extent->file_offset,
1782 ordered_extent->file_offset + 1875 ordered_extent->file_offset +
1783 ordered_extent->len); 1876 ordered_extent->len);
1784 BUG_ON(ret);
1785 } else { 1877 } else {
1786 BUG_ON(root == root->fs_info->tree_root); 1878 BUG_ON(root == root->fs_info->tree_root);
1787 ret = insert_reserved_file_extent(trans, inode, 1879 ret = insert_reserved_file_extent(trans, inode,
@@ -1795,11 +1887,14 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1795 unpin_extent_cache(&BTRFS_I(inode)->extent_tree, 1887 unpin_extent_cache(&BTRFS_I(inode)->extent_tree,
1796 ordered_extent->file_offset, 1888 ordered_extent->file_offset,
1797 ordered_extent->len); 1889 ordered_extent->len);
1798 BUG_ON(ret);
1799 } 1890 }
1800 unlock_extent_cached(io_tree, ordered_extent->file_offset, 1891 unlock_extent_cached(io_tree, ordered_extent->file_offset,
1801 ordered_extent->file_offset + 1892 ordered_extent->file_offset +
1802 ordered_extent->len - 1, &cached_state, GFP_NOFS); 1893 ordered_extent->len - 1, &cached_state, GFP_NOFS);
1894 if (ret < 0) {
1895 btrfs_abort_transaction(trans, root, ret);
1896 goto out;
1897 }
1803 1898
1804 add_pending_csums(trans, inode, ordered_extent->file_offset, 1899 add_pending_csums(trans, inode, ordered_extent->file_offset,
1805 &ordered_extent->list); 1900 &ordered_extent->list);
@@ -1807,7 +1902,10 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end)
1807 ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); 1902 ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent);
1808 if (!ret || !test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) { 1903 if (!ret || !test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) {
1809 ret = btrfs_update_inode_fallback(trans, root, inode); 1904 ret = btrfs_update_inode_fallback(trans, root, inode);
1810 BUG_ON(ret); 1905 if (ret) { /* -ENOMEM or corruption */
1906 btrfs_abort_transaction(trans, root, ret);
1907 goto out;
1908 }
1811 } 1909 }
1812 ret = 0; 1910 ret = 0;
1813out: 1911out:
@@ -1826,6 +1924,11 @@ out:
1826 btrfs_put_ordered_extent(ordered_extent); 1924 btrfs_put_ordered_extent(ordered_extent);
1827 1925
1828 return 0; 1926 return 0;
1927out_unlock:
1928 unlock_extent_cached(io_tree, ordered_extent->file_offset,
1929 ordered_extent->file_offset +
1930 ordered_extent->len - 1, &cached_state, GFP_NOFS);
1931 goto out;
1829} 1932}
1830 1933
1831static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, 1934static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end,
@@ -1907,6 +2010,8 @@ struct delayed_iput {
1907 struct inode *inode; 2010 struct inode *inode;
1908}; 2011};
1909 2012
2013/* JDM: If this is fs-wide, why can't we add a pointer to
2014 * btrfs_inode instead and avoid the allocation? */
1910void btrfs_add_delayed_iput(struct inode *inode) 2015void btrfs_add_delayed_iput(struct inode *inode)
1911{ 2016{
1912 struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; 2017 struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
@@ -2053,20 +2158,27 @@ int btrfs_orphan_add(struct btrfs_trans_handle *trans, struct inode *inode)
2053 /* grab metadata reservation from transaction handle */ 2158 /* grab metadata reservation from transaction handle */
2054 if (reserve) { 2159 if (reserve) {
2055 ret = btrfs_orphan_reserve_metadata(trans, inode); 2160 ret = btrfs_orphan_reserve_metadata(trans, inode);
2056 BUG_ON(ret); 2161 BUG_ON(ret); /* -ENOSPC in reservation; Logic error? JDM */
2057 } 2162 }
2058 2163
2059 /* insert an orphan item to track this unlinked/truncated file */ 2164 /* insert an orphan item to track this unlinked/truncated file */
2060 if (insert >= 1) { 2165 if (insert >= 1) {
2061 ret = btrfs_insert_orphan_item(trans, root, btrfs_ino(inode)); 2166 ret = btrfs_insert_orphan_item(trans, root, btrfs_ino(inode));
2062 BUG_ON(ret && ret != -EEXIST); 2167 if (ret && ret != -EEXIST) {
2168 btrfs_abort_transaction(trans, root, ret);
2169 return ret;
2170 }
2171 ret = 0;
2063 } 2172 }
2064 2173
2065 /* insert an orphan item to track subvolume contains orphan files */ 2174 /* insert an orphan item to track subvolume contains orphan files */
2066 if (insert >= 2) { 2175 if (insert >= 2) {
2067 ret = btrfs_insert_orphan_item(trans, root->fs_info->tree_root, 2176 ret = btrfs_insert_orphan_item(trans, root->fs_info->tree_root,
2068 root->root_key.objectid); 2177 root->root_key.objectid);
2069 BUG_ON(ret); 2178 if (ret && ret != -EEXIST) {
2179 btrfs_abort_transaction(trans, root, ret);
2180 return ret;
2181 }
2070 } 2182 }
2071 return 0; 2183 return 0;
2072} 2184}
@@ -2096,7 +2208,7 @@ int btrfs_orphan_del(struct btrfs_trans_handle *trans, struct inode *inode)
2096 2208
2097 if (trans && delete_item) { 2209 if (trans && delete_item) {
2098 ret = btrfs_del_orphan_item(trans, root, btrfs_ino(inode)); 2210 ret = btrfs_del_orphan_item(trans, root, btrfs_ino(inode));
2099 BUG_ON(ret); 2211 BUG_ON(ret); /* -ENOMEM or corruption (JDM: Recheck) */
2100 } 2212 }
2101 2213
2102 if (release_rsv) 2214 if (release_rsv)
@@ -2230,7 +2342,7 @@ int btrfs_orphan_cleanup(struct btrfs_root *root)
2230 } 2342 }
2231 ret = btrfs_del_orphan_item(trans, root, 2343 ret = btrfs_del_orphan_item(trans, root,
2232 found_key.objectid); 2344 found_key.objectid);
2233 BUG_ON(ret); 2345 BUG_ON(ret); /* -ENOMEM or corruption (JDM: Recheck) */
2234 btrfs_end_transaction(trans, root); 2346 btrfs_end_transaction(trans, root);
2235 continue; 2347 continue;
2236 } 2348 }
@@ -2612,16 +2724,22 @@ static int __btrfs_unlink_inode(struct btrfs_trans_handle *trans,
2612 printk(KERN_INFO "btrfs failed to delete reference to %.*s, " 2724 printk(KERN_INFO "btrfs failed to delete reference to %.*s, "
2613 "inode %llu parent %llu\n", name_len, name, 2725 "inode %llu parent %llu\n", name_len, name,
2614 (unsigned long long)ino, (unsigned long long)dir_ino); 2726 (unsigned long long)ino, (unsigned long long)dir_ino);
2727 btrfs_abort_transaction(trans, root, ret);
2615 goto err; 2728 goto err;
2616 } 2729 }
2617 2730
2618 ret = btrfs_delete_delayed_dir_index(trans, root, dir, index); 2731 ret = btrfs_delete_delayed_dir_index(trans, root, dir, index);
2619 if (ret) 2732 if (ret) {
2733 btrfs_abort_transaction(trans, root, ret);
2620 goto err; 2734 goto err;
2735 }
2621 2736
2622 ret = btrfs_del_inode_ref_in_log(trans, root, name, name_len, 2737 ret = btrfs_del_inode_ref_in_log(trans, root, name, name_len,
2623 inode, dir_ino); 2738 inode, dir_ino);
2624 BUG_ON(ret != 0 && ret != -ENOENT); 2739 if (ret != 0 && ret != -ENOENT) {
2740 btrfs_abort_transaction(trans, root, ret);
2741 goto err;
2742 }
2625 2743
2626 ret = btrfs_del_dir_entries_in_log(trans, root, name, name_len, 2744 ret = btrfs_del_dir_entries_in_log(trans, root, name, name_len,
2627 dir, index); 2745 dir, index);
@@ -2779,7 +2897,7 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir,
2779 err = ret; 2897 err = ret;
2780 goto out; 2898 goto out;
2781 } 2899 }
2782 BUG_ON(ret == 0); 2900 BUG_ON(ret == 0); /* Corruption */
2783 if (check_path_shared(root, path)) 2901 if (check_path_shared(root, path))
2784 goto out; 2902 goto out;
2785 btrfs_release_path(path); 2903 btrfs_release_path(path);
@@ -2812,7 +2930,7 @@ static struct btrfs_trans_handle *__unlink_start_trans(struct inode *dir,
2812 err = PTR_ERR(ref); 2930 err = PTR_ERR(ref);
2813 goto out; 2931 goto out;
2814 } 2932 }
2815 BUG_ON(!ref); 2933 BUG_ON(!ref); /* Logic error */
2816 if (check_path_shared(root, path)) 2934 if (check_path_shared(root, path))
2817 goto out; 2935 goto out;
2818 index = btrfs_inode_ref_index(path->nodes[0], ref); 2936 index = btrfs_inode_ref_index(path->nodes[0], ref);
@@ -2919,23 +3037,42 @@ int btrfs_unlink_subvol(struct btrfs_trans_handle *trans,
2919 3037
2920 di = btrfs_lookup_dir_item(trans, root, path, dir_ino, 3038 di = btrfs_lookup_dir_item(trans, root, path, dir_ino,
2921 name, name_len, -1); 3039 name, name_len, -1);
2922 BUG_ON(IS_ERR_OR_NULL(di)); 3040 if (IS_ERR_OR_NULL(di)) {
3041 if (!di)
3042 ret = -ENOENT;
3043 else
3044 ret = PTR_ERR(di);
3045 goto out;
3046 }
2923 3047
2924 leaf = path->nodes[0]; 3048 leaf = path->nodes[0];
2925 btrfs_dir_item_key_to_cpu(leaf, di, &key); 3049 btrfs_dir_item_key_to_cpu(leaf, di, &key);
2926 WARN_ON(key.type != BTRFS_ROOT_ITEM_KEY || key.objectid != objectid); 3050 WARN_ON(key.type != BTRFS_ROOT_ITEM_KEY || key.objectid != objectid);
2927 ret = btrfs_delete_one_dir_name(trans, root, path, di); 3051 ret = btrfs_delete_one_dir_name(trans, root, path, di);
2928 BUG_ON(ret); 3052 if (ret) {
3053 btrfs_abort_transaction(trans, root, ret);
3054 goto out;
3055 }
2929 btrfs_release_path(path); 3056 btrfs_release_path(path);
2930 3057
2931 ret = btrfs_del_root_ref(trans, root->fs_info->tree_root, 3058 ret = btrfs_del_root_ref(trans, root->fs_info->tree_root,
2932 objectid, root->root_key.objectid, 3059 objectid, root->root_key.objectid,
2933 dir_ino, &index, name, name_len); 3060 dir_ino, &index, name, name_len);
2934 if (ret < 0) { 3061 if (ret < 0) {
2935 BUG_ON(ret != -ENOENT); 3062 if (ret != -ENOENT) {
3063 btrfs_abort_transaction(trans, root, ret);
3064 goto out;
3065 }
2936 di = btrfs_search_dir_index_item(root, path, dir_ino, 3066 di = btrfs_search_dir_index_item(root, path, dir_ino,
2937 name, name_len); 3067 name, name_len);
2938 BUG_ON(IS_ERR_OR_NULL(di)); 3068 if (IS_ERR_OR_NULL(di)) {
3069 if (!di)
3070 ret = -ENOENT;
3071 else
3072 ret = PTR_ERR(di);
3073 btrfs_abort_transaction(trans, root, ret);
3074 goto out;
3075 }
2939 3076
2940 leaf = path->nodes[0]; 3077 leaf = path->nodes[0];
2941 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); 3078 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
@@ -2945,15 +3082,19 @@ int btrfs_unlink_subvol(struct btrfs_trans_handle *trans,
2945 btrfs_release_path(path); 3082 btrfs_release_path(path);
2946 3083
2947 ret = btrfs_delete_delayed_dir_index(trans, root, dir, index); 3084 ret = btrfs_delete_delayed_dir_index(trans, root, dir, index);
2948 BUG_ON(ret); 3085 if (ret) {
3086 btrfs_abort_transaction(trans, root, ret);
3087 goto out;
3088 }
2949 3089
2950 btrfs_i_size_write(dir, dir->i_size - name_len * 2); 3090 btrfs_i_size_write(dir, dir->i_size - name_len * 2);
2951 dir->i_mtime = dir->i_ctime = CURRENT_TIME; 3091 dir->i_mtime = dir->i_ctime = CURRENT_TIME;
2952 ret = btrfs_update_inode(trans, root, dir); 3092 ret = btrfs_update_inode(trans, root, dir);
2953 BUG_ON(ret); 3093 if (ret)
2954 3094 btrfs_abort_transaction(trans, root, ret);
3095out:
2955 btrfs_free_path(path); 3096 btrfs_free_path(path);
2956 return 0; 3097 return ret;
2957} 3098}
2958 3099
2959static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) 3100static int btrfs_rmdir(struct inode *dir, struct dentry *dentry)
@@ -3212,7 +3353,11 @@ delete:
3212 ret = btrfs_del_items(trans, root, path, 3353 ret = btrfs_del_items(trans, root, path,
3213 pending_del_slot, 3354 pending_del_slot,
3214 pending_del_nr); 3355 pending_del_nr);
3215 BUG_ON(ret); 3356 if (ret) {
3357 btrfs_abort_transaction(trans,
3358 root, ret);
3359 goto error;
3360 }
3216 pending_del_nr = 0; 3361 pending_del_nr = 0;
3217 } 3362 }
3218 btrfs_release_path(path); 3363 btrfs_release_path(path);
@@ -3225,8 +3370,10 @@ out:
3225 if (pending_del_nr) { 3370 if (pending_del_nr) {
3226 ret = btrfs_del_items(trans, root, path, pending_del_slot, 3371 ret = btrfs_del_items(trans, root, path, pending_del_slot,
3227 pending_del_nr); 3372 pending_del_nr);
3228 BUG_ON(ret); 3373 if (ret)
3374 btrfs_abort_transaction(trans, root, ret);
3229 } 3375 }
3376error:
3230 btrfs_free_path(path); 3377 btrfs_free_path(path);
3231 return err; 3378 return err;
3232} 3379}
@@ -3373,7 +3520,10 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
3373 while (1) { 3520 while (1) {
3374 em = btrfs_get_extent(inode, NULL, 0, cur_offset, 3521 em = btrfs_get_extent(inode, NULL, 0, cur_offset,
3375 block_end - cur_offset, 0); 3522 block_end - cur_offset, 0);
3376 BUG_ON(IS_ERR_OR_NULL(em)); 3523 if (IS_ERR(em)) {
3524 err = PTR_ERR(em);
3525 break;
3526 }
3377 last_byte = min(extent_map_end(em), block_end); 3527 last_byte = min(extent_map_end(em), block_end);
3378 last_byte = (last_byte + mask) & ~mask; 3528 last_byte = (last_byte + mask) & ~mask;
3379 if (!test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) { 3529 if (!test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) {
@@ -3390,7 +3540,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
3390 cur_offset + hole_size, 3540 cur_offset + hole_size,
3391 &hint_byte, 1); 3541 &hint_byte, 1);
3392 if (err) { 3542 if (err) {
3393 btrfs_update_inode(trans, root, inode); 3543 btrfs_abort_transaction(trans, root, err);
3394 btrfs_end_transaction(trans, root); 3544 btrfs_end_transaction(trans, root);
3395 break; 3545 break;
3396 } 3546 }
@@ -3400,7 +3550,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size)
3400 0, hole_size, 0, hole_size, 3550 0, hole_size, 0, hole_size,
3401 0, 0, 0); 3551 0, 0, 0);
3402 if (err) { 3552 if (err) {
3403 btrfs_update_inode(trans, root, inode); 3553 btrfs_abort_transaction(trans, root, err);
3404 btrfs_end_transaction(trans, root); 3554 btrfs_end_transaction(trans, root);
3405 break; 3555 break;
3406 } 3556 }
@@ -4581,18 +4731,26 @@ int btrfs_add_link(struct btrfs_trans_handle *trans,
4581 parent_ino, index); 4731 parent_ino, index);
4582 } 4732 }
4583 4733
4584 if (ret == 0) { 4734 /* Nothing to clean up yet */
4585 ret = btrfs_insert_dir_item(trans, root, name, name_len, 4735 if (ret)
4586 parent_inode, &key, 4736 return ret;
4587 btrfs_inode_type(inode), index);
4588 if (ret)
4589 goto fail_dir_item;
4590 4737
4591 btrfs_i_size_write(parent_inode, parent_inode->i_size + 4738 ret = btrfs_insert_dir_item(trans, root, name, name_len,
4592 name_len * 2); 4739 parent_inode, &key,
4593 parent_inode->i_mtime = parent_inode->i_ctime = CURRENT_TIME; 4740 btrfs_inode_type(inode), index);
4594 ret = btrfs_update_inode(trans, root, parent_inode); 4741 if (ret == -EEXIST)
4742 goto fail_dir_item;
4743 else if (ret) {
4744 btrfs_abort_transaction(trans, root, ret);
4745 return ret;
4595 } 4746 }
4747
4748 btrfs_i_size_write(parent_inode, parent_inode->i_size +
4749 name_len * 2);
4750 parent_inode->i_mtime = parent_inode->i_ctime = CURRENT_TIME;
4751 ret = btrfs_update_inode(trans, root, parent_inode);
4752 if (ret)
4753 btrfs_abort_transaction(trans, root, ret);
4596 return ret; 4754 return ret;
4597 4755
4598fail_dir_item: 4756fail_dir_item:
@@ -4806,7 +4964,8 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
4806 } else { 4964 } else {
4807 struct dentry *parent = dentry->d_parent; 4965 struct dentry *parent = dentry->d_parent;
4808 err = btrfs_update_inode(trans, root, inode); 4966 err = btrfs_update_inode(trans, root, inode);
4809 BUG_ON(err); 4967 if (err)
4968 goto fail;
4810 d_instantiate(dentry, inode); 4969 d_instantiate(dentry, inode);
4811 btrfs_log_new_name(trans, inode, NULL, parent); 4970 btrfs_log_new_name(trans, inode, NULL, parent);
4812 } 4971 }
@@ -5137,7 +5296,7 @@ again:
5137 ret = uncompress_inline(path, inode, page, 5296 ret = uncompress_inline(path, inode, page,
5138 pg_offset, 5297 pg_offset,
5139 extent_offset, item); 5298 extent_offset, item);
5140 BUG_ON(ret); 5299 BUG_ON(ret); /* -ENOMEM */
5141 } else { 5300 } else {
5142 map = kmap(page); 5301 map = kmap(page);
5143 read_extent_buffer(leaf, map + pg_offset, ptr, 5302 read_extent_buffer(leaf, map + pg_offset, ptr,
@@ -5252,6 +5411,7 @@ out:
5252 free_extent_map(em); 5411 free_extent_map(em);
5253 return ERR_PTR(err); 5412 return ERR_PTR(err);
5254 } 5413 }
5414 BUG_ON(!em); /* Error is always set */
5255 return em; 5415 return em;
5256} 5416}
5257 5417
@@ -5868,7 +6028,7 @@ static int __btrfs_submit_bio_start_direct_io(struct inode *inode, int rw,
5868 int ret; 6028 int ret;
5869 struct btrfs_root *root = BTRFS_I(inode)->root; 6029 struct btrfs_root *root = BTRFS_I(inode)->root;
5870 ret = btrfs_csum_one_bio(root, inode, bio, offset, 1); 6030 ret = btrfs_csum_one_bio(root, inode, bio, offset, 1);
5871 BUG_ON(ret); 6031 BUG_ON(ret); /* -ENOMEM */
5872 return 0; 6032 return 0;
5873} 6033}
5874 6034
@@ -7068,7 +7228,10 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
7068 if (!ret) 7228 if (!ret)
7069 ret = btrfs_update_inode(trans, root, old_inode); 7229 ret = btrfs_update_inode(trans, root, old_inode);
7070 } 7230 }
7071 BUG_ON(ret); 7231 if (ret) {
7232 btrfs_abort_transaction(trans, root, ret);
7233 goto out_fail;
7234 }
7072 7235
7073 if (new_inode) { 7236 if (new_inode) {
7074 new_inode->i_ctime = CURRENT_TIME; 7237 new_inode->i_ctime = CURRENT_TIME;
@@ -7086,11 +7249,14 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
7086 new_dentry->d_name.name, 7249 new_dentry->d_name.name,
7087 new_dentry->d_name.len); 7250 new_dentry->d_name.len);
7088 } 7251 }
7089 BUG_ON(ret); 7252 if (!ret && new_inode->i_nlink == 0) {
7090 if (new_inode->i_nlink == 0) {
7091 ret = btrfs_orphan_add(trans, new_dentry->d_inode); 7253 ret = btrfs_orphan_add(trans, new_dentry->d_inode);
7092 BUG_ON(ret); 7254 BUG_ON(ret);
7093 } 7255 }
7256 if (ret) {
7257 btrfs_abort_transaction(trans, root, ret);
7258 goto out_fail;
7259 }
7094 } 7260 }
7095 7261
7096 fixup_inode_flags(new_dir, old_inode); 7262 fixup_inode_flags(new_dir, old_inode);
@@ -7098,7 +7264,10 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,
7098 ret = btrfs_add_link(trans, new_dir, old_inode, 7264 ret = btrfs_add_link(trans, new_dir, old_inode,
7099 new_dentry->d_name.name, 7265 new_dentry->d_name.name,
7100 new_dentry->d_name.len, 0, index); 7266 new_dentry->d_name.len, 0, index);
7101 BUG_ON(ret); 7267 if (ret) {
7268 btrfs_abort_transaction(trans, root, ret);
7269 goto out_fail;
7270 }
7102 7271
7103 if (old_ino != BTRFS_FIRST_FREE_OBJECTID) { 7272 if (old_ino != BTRFS_FIRST_FREE_OBJECTID) {
7104 struct dentry *parent = new_dentry->d_parent; 7273 struct dentry *parent = new_dentry->d_parent;
@@ -7323,7 +7492,12 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode,
7323 ins.offset, ins.offset, 7492 ins.offset, ins.offset,
7324 ins.offset, 0, 0, 0, 7493 ins.offset, 0, 0, 0,
7325 BTRFS_FILE_EXTENT_PREALLOC); 7494 BTRFS_FILE_EXTENT_PREALLOC);
7326 BUG_ON(ret); 7495 if (ret) {
7496 btrfs_abort_transaction(trans, root, ret);
7497 if (own_trans)
7498 btrfs_end_transaction(trans, root);
7499 break;
7500 }
7327 btrfs_drop_extent_cache(inode, cur_offset, 7501 btrfs_drop_extent_cache(inode, cur_offset,
7328 cur_offset + ins.offset -1, 0); 7502 cur_offset + ins.offset -1, 0);
7329 7503
@@ -7345,7 +7519,13 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode,
7345 } 7519 }
7346 7520
7347 ret = btrfs_update_inode(trans, root, inode); 7521 ret = btrfs_update_inode(trans, root, inode);
7348 BUG_ON(ret); 7522
7523 if (ret) {
7524 btrfs_abort_transaction(trans, root, ret);
7525 if (own_trans)
7526 btrfs_end_transaction(trans, root);
7527 break;
7528 }
7349 7529
7350 if (own_trans) 7530 if (own_trans)
7351 btrfs_end_transaction(trans, root); 7531 btrfs_end_transaction(trans, root);