diff options
-rw-r--r-- | fs/btrfs/compression.c | 24 | ||||
-rw-r--r-- | fs/btrfs/ctree.c | 19 | ||||
-rw-r--r-- | fs/btrfs/delayed-inode.c | 27 | ||||
-rw-r--r-- | fs/btrfs/dir-item.c | 1 | ||||
-rw-r--r-- | fs/btrfs/disk-io.c | 116 | ||||
-rw-r--r-- | fs/btrfs/export.c | 2 | ||||
-rw-r--r-- | fs/btrfs/extent-tree.c | 316 | ||||
-rw-r--r-- | fs/btrfs/extent_io.c | 40 | ||||
-rw-r--r-- | fs/btrfs/file-item.c | 13 | ||||
-rw-r--r-- | fs/btrfs/file.c | 45 | ||||
-rw-r--r-- | fs/btrfs/free-space-cache.c | 13 | ||||
-rw-r--r-- | fs/btrfs/inode-item.c | 1 | ||||
-rw-r--r-- | fs/btrfs/inode-map.c | 19 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 378 | ||||
-rw-r--r-- | fs/btrfs/ioctl.c | 79 | ||||
-rw-r--r-- | fs/btrfs/orphan.c | 2 | ||||
-rw-r--r-- | fs/btrfs/relocation.c | 35 | ||||
-rw-r--r-- | fs/btrfs/root-tree.c | 12 | ||||
-rw-r--r-- | fs/btrfs/scrub.c | 3 | ||||
-rw-r--r-- | fs/btrfs/super.c | 2 | ||||
-rw-r--r-- | fs/btrfs/transaction.c | 36 | ||||
-rw-r--r-- | fs/btrfs/tree-log.c | 79 | ||||
-rw-r--r-- | fs/btrfs/volumes.c | 103 |
23 files changed, 980 insertions, 385 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index cfd158dccdec..d11afa67c7d8 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c | |||
@@ -391,16 +391,16 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, | |||
391 | */ | 391 | */ |
392 | atomic_inc(&cb->pending_bios); | 392 | atomic_inc(&cb->pending_bios); |
393 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); | 393 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); |
394 | BUG_ON(ret); | 394 | BUG_ON(ret); /* -ENOMEM */ |
395 | 395 | ||
396 | if (!skip_sum) { | 396 | if (!skip_sum) { |
397 | ret = btrfs_csum_one_bio(root, inode, bio, | 397 | ret = btrfs_csum_one_bio(root, inode, bio, |
398 | start, 1); | 398 | start, 1); |
399 | BUG_ON(ret); | 399 | BUG_ON(ret); /* -ENOMEM */ |
400 | } | 400 | } |
401 | 401 | ||
402 | ret = btrfs_map_bio(root, WRITE, bio, 0, 1); | 402 | ret = btrfs_map_bio(root, WRITE, bio, 0, 1); |
403 | BUG_ON(ret); | 403 | BUG_ON(ret); /* -ENOMEM */ |
404 | 404 | ||
405 | bio_put(bio); | 405 | bio_put(bio); |
406 | 406 | ||
@@ -420,15 +420,15 @@ int btrfs_submit_compressed_write(struct inode *inode, u64 start, | |||
420 | bio_get(bio); | 420 | bio_get(bio); |
421 | 421 | ||
422 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); | 422 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0); |
423 | BUG_ON(ret); | 423 | BUG_ON(ret); /* -ENOMEM */ |
424 | 424 | ||
425 | if (!skip_sum) { | 425 | if (!skip_sum) { |
426 | ret = btrfs_csum_one_bio(root, inode, bio, start, 1); | 426 | ret = btrfs_csum_one_bio(root, inode, bio, start, 1); |
427 | BUG_ON(ret); | 427 | BUG_ON(ret); /* -ENOMEM */ |
428 | } | 428 | } |
429 | 429 | ||
430 | ret = btrfs_map_bio(root, WRITE, bio, 0, 1); | 430 | ret = btrfs_map_bio(root, WRITE, bio, 0, 1); |
431 | BUG_ON(ret); | 431 | BUG_ON(ret); /* -ENOMEM */ |
432 | 432 | ||
433 | bio_put(bio); | 433 | bio_put(bio); |
434 | return 0; | 434 | return 0; |
@@ -661,7 +661,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
661 | bio_get(comp_bio); | 661 | bio_get(comp_bio); |
662 | 662 | ||
663 | ret = btrfs_bio_wq_end_io(root->fs_info, comp_bio, 0); | 663 | ret = btrfs_bio_wq_end_io(root->fs_info, comp_bio, 0); |
664 | BUG_ON(ret); | 664 | BUG_ON(ret); /* -ENOMEM */ |
665 | 665 | ||
666 | /* | 666 | /* |
667 | * inc the count before we submit the bio so | 667 | * inc the count before we submit the bio so |
@@ -674,14 +674,14 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
674 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) { | 674 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) { |
675 | ret = btrfs_lookup_bio_sums(root, inode, | 675 | ret = btrfs_lookup_bio_sums(root, inode, |
676 | comp_bio, sums); | 676 | comp_bio, sums); |
677 | BUG_ON(ret); | 677 | BUG_ON(ret); /* -ENOMEM */ |
678 | } | 678 | } |
679 | sums += (comp_bio->bi_size + root->sectorsize - 1) / | 679 | sums += (comp_bio->bi_size + root->sectorsize - 1) / |
680 | root->sectorsize; | 680 | root->sectorsize; |
681 | 681 | ||
682 | ret = btrfs_map_bio(root, READ, comp_bio, | 682 | ret = btrfs_map_bio(root, READ, comp_bio, |
683 | mirror_num, 0); | 683 | mirror_num, 0); |
684 | BUG_ON(ret); | 684 | BUG_ON(ret); /* -ENOMEM */ |
685 | 685 | ||
686 | bio_put(comp_bio); | 686 | bio_put(comp_bio); |
687 | 687 | ||
@@ -697,15 +697,15 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, | |||
697 | bio_get(comp_bio); | 697 | bio_get(comp_bio); |
698 | 698 | ||
699 | ret = btrfs_bio_wq_end_io(root->fs_info, comp_bio, 0); | 699 | ret = btrfs_bio_wq_end_io(root->fs_info, comp_bio, 0); |
700 | BUG_ON(ret); | 700 | BUG_ON(ret); /* -ENOMEM */ |
701 | 701 | ||
702 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) { | 702 | if (!(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM)) { |
703 | ret = btrfs_lookup_bio_sums(root, inode, comp_bio, sums); | 703 | ret = btrfs_lookup_bio_sums(root, inode, comp_bio, sums); |
704 | BUG_ON(ret); | 704 | BUG_ON(ret); /* -ENOMEM */ |
705 | } | 705 | } |
706 | 706 | ||
707 | ret = btrfs_map_bio(root, READ, comp_bio, mirror_num, 0); | 707 | ret = btrfs_map_bio(root, READ, comp_bio, mirror_num, 0); |
708 | BUG_ON(ret); | 708 | BUG_ON(ret); /* -ENOMEM */ |
709 | 709 | ||
710 | bio_put(comp_bio); | 710 | bio_put(comp_bio); |
711 | return 0; | 711 | return 0; |
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 651a26a6c651..e697afd18159 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -356,14 +356,14 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
356 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && | 356 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && |
357 | !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) { | 357 | !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) { |
358 | ret = btrfs_inc_ref(trans, root, buf, 1, 1); | 358 | ret = btrfs_inc_ref(trans, root, buf, 1, 1); |
359 | BUG_ON(ret); | 359 | BUG_ON(ret); /* -ENOMEM */ |
360 | 360 | ||
361 | if (root->root_key.objectid == | 361 | if (root->root_key.objectid == |
362 | BTRFS_TREE_RELOC_OBJECTID) { | 362 | BTRFS_TREE_RELOC_OBJECTID) { |
363 | ret = btrfs_dec_ref(trans, root, buf, 0, 1); | 363 | ret = btrfs_dec_ref(trans, root, buf, 0, 1); |
364 | BUG_ON(ret); | 364 | BUG_ON(ret); /* -ENOMEM */ |
365 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); | 365 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); |
366 | BUG_ON(ret); | 366 | BUG_ON(ret); /* -ENOMEM */ |
367 | } | 367 | } |
368 | new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; | 368 | new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF; |
369 | } else { | 369 | } else { |
@@ -373,7 +373,7 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
373 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); | 373 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); |
374 | else | 374 | else |
375 | ret = btrfs_inc_ref(trans, root, cow, 0, 1); | 375 | ret = btrfs_inc_ref(trans, root, cow, 0, 1); |
376 | BUG_ON(ret); | 376 | BUG_ON(ret); /* -ENOMEM */ |
377 | } | 377 | } |
378 | if (new_flags != 0) { | 378 | if (new_flags != 0) { |
379 | ret = btrfs_set_disk_extent_flags(trans, root, | 379 | ret = btrfs_set_disk_extent_flags(trans, root, |
@@ -390,9 +390,9 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans, | |||
390 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); | 390 | ret = btrfs_inc_ref(trans, root, cow, 1, 1); |
391 | else | 391 | else |
392 | ret = btrfs_inc_ref(trans, root, cow, 0, 1); | 392 | ret = btrfs_inc_ref(trans, root, cow, 0, 1); |
393 | BUG_ON(ret); | 393 | BUG_ON(ret); /* -ENOMEM */ |
394 | ret = btrfs_dec_ref(trans, root, buf, 1, 1); | 394 | ret = btrfs_dec_ref(trans, root, buf, 1, 1); |
395 | BUG_ON(ret); | 395 | BUG_ON(ret); /* -ENOMEM */ |
396 | } | 396 | } |
397 | clean_tree_block(trans, root, buf); | 397 | clean_tree_block(trans, root, buf); |
398 | *last_ref = 1; | 398 | *last_ref = 1; |
@@ -475,7 +475,7 @@ static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans, | |||
475 | 475 | ||
476 | ret = update_ref_for_cow(trans, root, buf, cow, &last_ref); | 476 | ret = update_ref_for_cow(trans, root, buf, cow, &last_ref); |
477 | if (ret) { | 477 | if (ret) { |
478 | btrfs_std_error(root->fs_info, ret); | 478 | btrfs_abort_transaction(trans, root, ret); |
479 | return ret; | 479 | return ret; |
480 | } | 480 | } |
481 | 481 | ||
@@ -2713,7 +2713,8 @@ static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root | |||
2713 | path->nodes[1], slot - 1, &left); | 2713 | path->nodes[1], slot - 1, &left); |
2714 | if (ret) { | 2714 | if (ret) { |
2715 | /* we hit -ENOSPC, but it isn't fatal here */ | 2715 | /* we hit -ENOSPC, but it isn't fatal here */ |
2716 | ret = 1; | 2716 | if (ret == -ENOSPC) |
2717 | ret = 1; | ||
2717 | goto out; | 2718 | goto out; |
2718 | } | 2719 | } |
2719 | 2720 | ||
@@ -4017,7 +4018,7 @@ find_next_key: | |||
4017 | } | 4018 | } |
4018 | btrfs_set_path_blocking(path); | 4019 | btrfs_set_path_blocking(path); |
4019 | cur = read_node_slot(root, cur, slot); | 4020 | cur = read_node_slot(root, cur, slot); |
4020 | BUG_ON(!cur); | 4021 | BUG_ON(!cur); /* -ENOMEM */ |
4021 | 4022 | ||
4022 | btrfs_tree_read_lock(cur); | 4023 | btrfs_tree_read_lock(cur); |
4023 | 4024 | ||
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 6829590d0fbb..03e3748d84d0 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
@@ -115,6 +115,7 @@ static struct btrfs_delayed_node *btrfs_get_delayed_node(struct inode *inode) | |||
115 | return NULL; | 115 | return NULL; |
116 | } | 116 | } |
117 | 117 | ||
118 | /* Will return either the node or PTR_ERR(-ENOMEM) */ | ||
118 | static struct btrfs_delayed_node *btrfs_get_or_create_delayed_node( | 119 | static struct btrfs_delayed_node *btrfs_get_or_create_delayed_node( |
119 | struct inode *inode) | 120 | struct inode *inode) |
120 | { | 121 | { |
@@ -1106,16 +1107,25 @@ static int btrfs_update_delayed_inode(struct btrfs_trans_handle *trans, | |||
1106 | return 0; | 1107 | return 0; |
1107 | } | 1108 | } |
1108 | 1109 | ||
1109 | /* Called when committing the transaction. */ | 1110 | /* |
1111 | * Called when committing the transaction. | ||
1112 | * Returns 0 on success. | ||
1113 | * Returns < 0 on error and returns with an aborted transaction with any | ||
1114 | * outstanding delayed items cleaned up. | ||
1115 | */ | ||
1110 | int btrfs_run_delayed_items(struct btrfs_trans_handle *trans, | 1116 | int btrfs_run_delayed_items(struct btrfs_trans_handle *trans, |
1111 | struct btrfs_root *root) | 1117 | struct btrfs_root *root) |
1112 | { | 1118 | { |
1119 | struct btrfs_root *curr_root = root; | ||
1113 | struct btrfs_delayed_root *delayed_root; | 1120 | struct btrfs_delayed_root *delayed_root; |
1114 | struct btrfs_delayed_node *curr_node, *prev_node; | 1121 | struct btrfs_delayed_node *curr_node, *prev_node; |
1115 | struct btrfs_path *path; | 1122 | struct btrfs_path *path; |
1116 | struct btrfs_block_rsv *block_rsv; | 1123 | struct btrfs_block_rsv *block_rsv; |
1117 | int ret = 0; | 1124 | int ret = 0; |
1118 | 1125 | ||
1126 | if (trans->aborted) | ||
1127 | return -EIO; | ||
1128 | |||
1119 | path = btrfs_alloc_path(); | 1129 | path = btrfs_alloc_path(); |
1120 | if (!path) | 1130 | if (!path) |
1121 | return -ENOMEM; | 1131 | return -ENOMEM; |
@@ -1128,17 +1138,18 @@ int btrfs_run_delayed_items(struct btrfs_trans_handle *trans, | |||
1128 | 1138 | ||
1129 | curr_node = btrfs_first_delayed_node(delayed_root); | 1139 | curr_node = btrfs_first_delayed_node(delayed_root); |
1130 | while (curr_node) { | 1140 | while (curr_node) { |
1131 | root = curr_node->root; | 1141 | curr_root = curr_node->root; |
1132 | ret = btrfs_insert_delayed_items(trans, path, root, | 1142 | ret = btrfs_insert_delayed_items(trans, path, curr_root, |
1133 | curr_node); | 1143 | curr_node); |
1134 | if (!ret) | 1144 | if (!ret) |
1135 | ret = btrfs_delete_delayed_items(trans, path, root, | 1145 | ret = btrfs_delete_delayed_items(trans, path, |
1136 | curr_node); | 1146 | curr_root, curr_node); |
1137 | if (!ret) | 1147 | if (!ret) |
1138 | ret = btrfs_update_delayed_inode(trans, root, path, | 1148 | ret = btrfs_update_delayed_inode(trans, curr_root, |
1139 | curr_node); | 1149 | path, curr_node); |
1140 | if (ret) { | 1150 | if (ret) { |
1141 | btrfs_release_delayed_node(curr_node); | 1151 | btrfs_release_delayed_node(curr_node); |
1152 | btrfs_abort_transaction(trans, root, ret); | ||
1142 | break; | 1153 | break; |
1143 | } | 1154 | } |
1144 | 1155 | ||
@@ -1149,6 +1160,7 @@ int btrfs_run_delayed_items(struct btrfs_trans_handle *trans, | |||
1149 | 1160 | ||
1150 | btrfs_free_path(path); | 1161 | btrfs_free_path(path); |
1151 | trans->block_rsv = block_rsv; | 1162 | trans->block_rsv = block_rsv; |
1163 | |||
1152 | return ret; | 1164 | return ret; |
1153 | } | 1165 | } |
1154 | 1166 | ||
@@ -1369,6 +1381,7 @@ void btrfs_balance_delayed_items(struct btrfs_root *root) | |||
1369 | btrfs_wq_run_delayed_node(delayed_root, root, 0); | 1381 | btrfs_wq_run_delayed_node(delayed_root, root, 0); |
1370 | } | 1382 | } |
1371 | 1383 | ||
1384 | /* Will return 0 or -ENOMEM */ | ||
1372 | int btrfs_insert_delayed_dir_index(struct btrfs_trans_handle *trans, | 1385 | int btrfs_insert_delayed_dir_index(struct btrfs_trans_handle *trans, |
1373 | struct btrfs_root *root, const char *name, | 1386 | struct btrfs_root *root, const char *name, |
1374 | int name_len, struct inode *dir, | 1387 | int name_len, struct inode *dir, |
diff --git a/fs/btrfs/dir-item.c b/fs/btrfs/dir-item.c index 76743308bd9f..c1a074d0696f 100644 --- a/fs/btrfs/dir-item.c +++ b/fs/btrfs/dir-item.c | |||
@@ -115,6 +115,7 @@ int btrfs_insert_xattr_item(struct btrfs_trans_handle *trans, | |||
115 | * 'location' is the key to stuff into the directory item, 'type' is the | 115 | * 'location' is the key to stuff into the directory item, 'type' is the |
116 | * type of the inode we're pointing to, and 'index' is the sequence number | 116 | * type of the inode we're pointing to, and 'index' is the sequence number |
117 | * to use for the second index (if one is created). | 117 | * to use for the second index (if one is created). |
118 | * Will return 0 or -ENOMEM | ||
118 | */ | 119 | */ |
119 | int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root | 120 | int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root |
120 | *root, const char *name, int name_len, | 121 | *root, const char *name, int name_len, |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 6297a030ac50..16a0cada26c2 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -98,6 +98,7 @@ struct async_submit_bio { | |||
98 | */ | 98 | */ |
99 | u64 bio_offset; | 99 | u64 bio_offset; |
100 | struct btrfs_work work; | 100 | struct btrfs_work work; |
101 | int error; | ||
101 | }; | 102 | }; |
102 | 103 | ||
103 | /* | 104 | /* |
@@ -405,7 +406,7 @@ static int csum_dirty_buffer(struct btrfs_root *root, struct page *page) | |||
405 | u64 found_start; | 406 | u64 found_start; |
406 | unsigned long len; | 407 | unsigned long len; |
407 | struct extent_buffer *eb; | 408 | struct extent_buffer *eb; |
408 | int ret; | 409 | int ret = -EIO; |
409 | 410 | ||
410 | tree = &BTRFS_I(page->mapping->host)->io_tree; | 411 | tree = &BTRFS_I(page->mapping->host)->io_tree; |
411 | 412 | ||
@@ -423,13 +424,20 @@ static int csum_dirty_buffer(struct btrfs_root *root, struct page *page) | |||
423 | eb = alloc_extent_buffer(tree, start, len, page); | 424 | eb = alloc_extent_buffer(tree, start, len, page); |
424 | if (eb == NULL) { | 425 | if (eb == NULL) { |
425 | WARN_ON(1); | 426 | WARN_ON(1); |
427 | ret = -ENOMEM; | ||
426 | goto out; | 428 | goto out; |
427 | } | 429 | } |
428 | ret = btree_read_extent_buffer_pages(root, eb, start + PAGE_CACHE_SIZE, | 430 | ret = btree_read_extent_buffer_pages(root, eb, start + PAGE_CACHE_SIZE, |
429 | btrfs_header_generation(eb)); | 431 | btrfs_header_generation(eb)); |
430 | BUG_ON(ret); | 432 | if (ret) { |
433 | btrfs_printk(root->fs_info, KERN_WARNING | ||
434 | "Failed to checksum dirty buffer @ %llu[%lu]\n", | ||
435 | start, len); | ||
436 | goto err; | ||
437 | } | ||
431 | WARN_ON(!btrfs_header_flag(eb, BTRFS_HEADER_FLAG_WRITTEN)); | 438 | WARN_ON(!btrfs_header_flag(eb, BTRFS_HEADER_FLAG_WRITTEN)); |
432 | 439 | ||
440 | ret = -EIO; | ||
433 | found_start = btrfs_header_bytenr(eb); | 441 | found_start = btrfs_header_bytenr(eb); |
434 | if (found_start != start) { | 442 | if (found_start != start) { |
435 | WARN_ON(1); | 443 | WARN_ON(1); |
@@ -444,10 +452,11 @@ static int csum_dirty_buffer(struct btrfs_root *root, struct page *page) | |||
444 | goto err; | 452 | goto err; |
445 | } | 453 | } |
446 | csum_tree_block(root, eb, 0); | 454 | csum_tree_block(root, eb, 0); |
455 | ret = 0; | ||
447 | err: | 456 | err: |
448 | free_extent_buffer(eb); | 457 | free_extent_buffer(eb); |
449 | out: | 458 | out: |
450 | return 0; | 459 | return ret; |
451 | } | 460 | } |
452 | 461 | ||
453 | static int check_tree_block_fsid(struct btrfs_root *root, | 462 | static int check_tree_block_fsid(struct btrfs_root *root, |
@@ -718,11 +727,14 @@ unsigned long btrfs_async_submit_limit(struct btrfs_fs_info *info) | |||
718 | static void run_one_async_start(struct btrfs_work *work) | 727 | static void run_one_async_start(struct btrfs_work *work) |
719 | { | 728 | { |
720 | struct async_submit_bio *async; | 729 | struct async_submit_bio *async; |
730 | int ret; | ||
721 | 731 | ||
722 | async = container_of(work, struct async_submit_bio, work); | 732 | async = container_of(work, struct async_submit_bio, work); |
723 | async->submit_bio_start(async->inode, async->rw, async->bio, | 733 | ret = async->submit_bio_start(async->inode, async->rw, async->bio, |
724 | async->mirror_num, async->bio_flags, | 734 | async->mirror_num, async->bio_flags, |
725 | async->bio_offset); | 735 | async->bio_offset); |
736 | if (ret) | ||
737 | async->error = ret; | ||
726 | } | 738 | } |
727 | 739 | ||
728 | static void run_one_async_done(struct btrfs_work *work) | 740 | static void run_one_async_done(struct btrfs_work *work) |
@@ -743,6 +755,12 @@ static void run_one_async_done(struct btrfs_work *work) | |||
743 | waitqueue_active(&fs_info->async_submit_wait)) | 755 | waitqueue_active(&fs_info->async_submit_wait)) |
744 | wake_up(&fs_info->async_submit_wait); | 756 | wake_up(&fs_info->async_submit_wait); |
745 | 757 | ||
758 | /* If an error occured we just want to clean up the bio and move on */ | ||
759 | if (async->error) { | ||
760 | bio_endio(async->bio, async->error); | ||
761 | return; | ||
762 | } | ||
763 | |||
746 | async->submit_bio_done(async->inode, async->rw, async->bio, | 764 | async->submit_bio_done(async->inode, async->rw, async->bio, |
747 | async->mirror_num, async->bio_flags, | 765 | async->mirror_num, async->bio_flags, |
748 | async->bio_offset); | 766 | async->bio_offset); |
@@ -784,6 +802,8 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, | |||
784 | async->bio_flags = bio_flags; | 802 | async->bio_flags = bio_flags; |
785 | async->bio_offset = bio_offset; | 803 | async->bio_offset = bio_offset; |
786 | 804 | ||
805 | async->error = 0; | ||
806 | |||
787 | atomic_inc(&fs_info->nr_async_submits); | 807 | atomic_inc(&fs_info->nr_async_submits); |
788 | 808 | ||
789 | if (rw & REQ_SYNC) | 809 | if (rw & REQ_SYNC) |
@@ -805,15 +825,18 @@ static int btree_csum_one_bio(struct bio *bio) | |||
805 | struct bio_vec *bvec = bio->bi_io_vec; | 825 | struct bio_vec *bvec = bio->bi_io_vec; |
806 | int bio_index = 0; | 826 | int bio_index = 0; |
807 | struct btrfs_root *root; | 827 | struct btrfs_root *root; |
828 | int ret = 0; | ||
808 | 829 | ||
809 | WARN_ON(bio->bi_vcnt <= 0); | 830 | WARN_ON(bio->bi_vcnt <= 0); |
810 | while (bio_index < bio->bi_vcnt) { | 831 | while (bio_index < bio->bi_vcnt) { |
811 | root = BTRFS_I(bvec->bv_page->mapping->host)->root; | 832 | root = BTRFS_I(bvec->bv_page->mapping->host)->root; |
812 | csum_dirty_buffer(root, bvec->bv_page); | 833 | ret = csum_dirty_buffer(root, bvec->bv_page); |
834 | if (ret) | ||
835 | break; | ||
813 | bio_index++; | 836 | bio_index++; |
814 | bvec++; | 837 | bvec++; |
815 | } | 838 | } |
816 | return 0; | 839 | return ret; |
817 | } | 840 | } |
818 | 841 | ||
819 | static int __btree_submit_bio_start(struct inode *inode, int rw, | 842 | static int __btree_submit_bio_start(struct inode *inode, int rw, |
@@ -825,8 +848,7 @@ static int __btree_submit_bio_start(struct inode *inode, int rw, | |||
825 | * when we're called for a write, we're already in the async | 848 | * when we're called for a write, we're already in the async |
826 | * submission context. Just jump into btrfs_map_bio | 849 | * submission context. Just jump into btrfs_map_bio |
827 | */ | 850 | */ |
828 | btree_csum_one_bio(bio); | 851 | return btree_csum_one_bio(bio); |
829 | return 0; | ||
830 | } | 852 | } |
831 | 853 | ||
832 | static int __btree_submit_bio_done(struct inode *inode, int rw, struct bio *bio, | 854 | static int __btree_submit_bio_done(struct inode *inode, int rw, struct bio *bio, |
@@ -1381,7 +1403,7 @@ struct btrfs_root *btrfs_read_fs_root_no_radix(struct btrfs_root *tree_root, | |||
1381 | root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), | 1403 | root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), |
1382 | blocksize, generation); | 1404 | blocksize, generation); |
1383 | root->commit_root = btrfs_root_node(root); | 1405 | root->commit_root = btrfs_root_node(root); |
1384 | BUG_ON(!root->node); | 1406 | BUG_ON(!root->node); /* -ENOMEM */ |
1385 | out: | 1407 | out: |
1386 | if (location->objectid != BTRFS_TREE_LOG_OBJECTID) { | 1408 | if (location->objectid != BTRFS_TREE_LOG_OBJECTID) { |
1387 | root->ref_cows = 1; | 1409 | root->ref_cows = 1; |
@@ -1618,7 +1640,6 @@ static int transaction_kthread(void *arg) | |||
1618 | u64 transid; | 1640 | u64 transid; |
1619 | unsigned long now; | 1641 | unsigned long now; |
1620 | unsigned long delay; | 1642 | unsigned long delay; |
1621 | int ret; | ||
1622 | 1643 | ||
1623 | do { | 1644 | do { |
1624 | delay = HZ * 30; | 1645 | delay = HZ * 30; |
@@ -1642,11 +1663,12 @@ static int transaction_kthread(void *arg) | |||
1642 | transid = cur->transid; | 1663 | transid = cur->transid; |
1643 | spin_unlock(&root->fs_info->trans_lock); | 1664 | spin_unlock(&root->fs_info->trans_lock); |
1644 | 1665 | ||
1666 | /* If the file system is aborted, this will always fail. */ | ||
1645 | trans = btrfs_join_transaction(root); | 1667 | trans = btrfs_join_transaction(root); |
1646 | BUG_ON(IS_ERR(trans)); | 1668 | if (IS_ERR(trans)) |
1669 | goto sleep; | ||
1647 | if (transid == trans->transid) { | 1670 | if (transid == trans->transid) { |
1648 | ret = btrfs_commit_transaction(trans, root); | 1671 | btrfs_commit_transaction(trans, root); |
1649 | BUG_ON(ret); | ||
1650 | } else { | 1672 | } else { |
1651 | btrfs_end_transaction(trans, root); | 1673 | btrfs_end_transaction(trans, root); |
1652 | } | 1674 | } |
@@ -2289,7 +2311,7 @@ int open_ctree(struct super_block *sb, | |||
2289 | chunk_root->node = read_tree_block(chunk_root, | 2311 | chunk_root->node = read_tree_block(chunk_root, |
2290 | btrfs_super_chunk_root(disk_super), | 2312 | btrfs_super_chunk_root(disk_super), |
2291 | blocksize, generation); | 2313 | blocksize, generation); |
2292 | BUG_ON(!chunk_root->node); | 2314 | BUG_ON(!chunk_root->node); /* -ENOMEM */ |
2293 | if (!test_bit(EXTENT_BUFFER_UPTODATE, &chunk_root->node->bflags)) { | 2315 | if (!test_bit(EXTENT_BUFFER_UPTODATE, &chunk_root->node->bflags)) { |
2294 | printk(KERN_WARNING "btrfs: failed to read chunk root on %s\n", | 2316 | printk(KERN_WARNING "btrfs: failed to read chunk root on %s\n", |
2295 | sb->s_id); | 2317 | sb->s_id); |
@@ -2429,21 +2451,31 @@ retry_root_backup: | |||
2429 | log_tree_root->node = read_tree_block(tree_root, bytenr, | 2451 | log_tree_root->node = read_tree_block(tree_root, bytenr, |
2430 | blocksize, | 2452 | blocksize, |
2431 | generation + 1); | 2453 | generation + 1); |
2454 | /* returns with log_tree_root freed on success */ | ||
2432 | ret = btrfs_recover_log_trees(log_tree_root); | 2455 | ret = btrfs_recover_log_trees(log_tree_root); |
2433 | BUG_ON(ret); | 2456 | if (ret) { |
2457 | btrfs_error(tree_root->fs_info, ret, | ||
2458 | "Failed to recover log tree"); | ||
2459 | free_extent_buffer(log_tree_root->node); | ||
2460 | kfree(log_tree_root); | ||
2461 | goto fail_trans_kthread; | ||
2462 | } | ||
2434 | 2463 | ||
2435 | if (sb->s_flags & MS_RDONLY) { | 2464 | if (sb->s_flags & MS_RDONLY) { |
2436 | ret = btrfs_commit_super(tree_root); | 2465 | ret = btrfs_commit_super(tree_root); |
2437 | BUG_ON(ret); | 2466 | if (ret) |
2467 | goto fail_trans_kthread; | ||
2438 | } | 2468 | } |
2439 | } | 2469 | } |
2440 | 2470 | ||
2441 | ret = btrfs_find_orphan_roots(tree_root); | 2471 | ret = btrfs_find_orphan_roots(tree_root); |
2442 | BUG_ON(ret); | 2472 | if (ret) |
2473 | goto fail_trans_kthread; | ||
2443 | 2474 | ||
2444 | if (!(sb->s_flags & MS_RDONLY)) { | 2475 | if (!(sb->s_flags & MS_RDONLY)) { |
2445 | ret = btrfs_cleanup_fs_roots(fs_info); | 2476 | ret = btrfs_cleanup_fs_roots(fs_info); |
2446 | BUG_ON(ret); | 2477 | if (ret) { |
2478 | } | ||
2447 | 2479 | ||
2448 | ret = btrfs_recover_relocation(tree_root); | 2480 | ret = btrfs_recover_relocation(tree_root); |
2449 | if (ret < 0) { | 2481 | if (ret < 0) { |
@@ -2863,6 +2895,8 @@ int write_all_supers(struct btrfs_root *root, int max_mirrors) | |||
2863 | if (total_errors > max_errors) { | 2895 | if (total_errors > max_errors) { |
2864 | printk(KERN_ERR "btrfs: %d errors while writing supers\n", | 2896 | printk(KERN_ERR "btrfs: %d errors while writing supers\n", |
2865 | total_errors); | 2897 | total_errors); |
2898 | |||
2899 | /* This shouldn't happen. FUA is masked off if unsupported */ | ||
2866 | BUG(); | 2900 | BUG(); |
2867 | } | 2901 | } |
2868 | 2902 | ||
@@ -2879,9 +2913,9 @@ int write_all_supers(struct btrfs_root *root, int max_mirrors) | |||
2879 | } | 2913 | } |
2880 | mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); | 2914 | mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); |
2881 | if (total_errors > max_errors) { | 2915 | if (total_errors > max_errors) { |
2882 | printk(KERN_ERR "btrfs: %d errors while writing supers\n", | 2916 | btrfs_error(root->fs_info, -EIO, |
2883 | total_errors); | 2917 | "%d errors while writing supers", total_errors); |
2884 | BUG(); | 2918 | return -EIO; |
2885 | } | 2919 | } |
2886 | return 0; | 2920 | return 0; |
2887 | } | 2921 | } |
@@ -3014,14 +3048,21 @@ int btrfs_commit_super(struct btrfs_root *root) | |||
3014 | if (IS_ERR(trans)) | 3048 | if (IS_ERR(trans)) |
3015 | return PTR_ERR(trans); | 3049 | return PTR_ERR(trans); |
3016 | ret = btrfs_commit_transaction(trans, root); | 3050 | ret = btrfs_commit_transaction(trans, root); |
3017 | BUG_ON(ret); | 3051 | if (ret) |
3052 | return ret; | ||
3018 | /* run commit again to drop the original snapshot */ | 3053 | /* run commit again to drop the original snapshot */ |
3019 | trans = btrfs_join_transaction(root); | 3054 | trans = btrfs_join_transaction(root); |
3020 | if (IS_ERR(trans)) | 3055 | if (IS_ERR(trans)) |
3021 | return PTR_ERR(trans); | 3056 | return PTR_ERR(trans); |
3022 | btrfs_commit_transaction(trans, root); | 3057 | ret = btrfs_commit_transaction(trans, root); |
3058 | if (ret) | ||
3059 | return ret; | ||
3023 | ret = btrfs_write_and_wait_transaction(NULL, root); | 3060 | ret = btrfs_write_and_wait_transaction(NULL, root); |
3024 | BUG_ON(ret); | 3061 | if (ret) { |
3062 | btrfs_error(root->fs_info, ret, | ||
3063 | "Failed to sync btree inode to disk."); | ||
3064 | return ret; | ||
3065 | } | ||
3025 | 3066 | ||
3026 | ret = write_ctree_super(NULL, root, 0); | 3067 | ret = write_ctree_super(NULL, root, 0); |
3027 | return ret; | 3068 | return ret; |
@@ -3366,8 +3407,8 @@ static void btrfs_destroy_ordered_extents(struct btrfs_root *root) | |||
3366 | spin_unlock(&root->fs_info->ordered_extent_lock); | 3407 | spin_unlock(&root->fs_info->ordered_extent_lock); |
3367 | } | 3408 | } |
3368 | 3409 | ||
3369 | static int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans, | 3410 | int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans, |
3370 | struct btrfs_root *root) | 3411 | struct btrfs_root *root) |
3371 | { | 3412 | { |
3372 | struct rb_node *node; | 3413 | struct rb_node *node; |
3373 | struct btrfs_delayed_ref_root *delayed_refs; | 3414 | struct btrfs_delayed_ref_root *delayed_refs; |
@@ -3376,6 +3417,7 @@ static int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans, | |||
3376 | 3417 | ||
3377 | delayed_refs = &trans->delayed_refs; | 3418 | delayed_refs = &trans->delayed_refs; |
3378 | 3419 | ||
3420 | again: | ||
3379 | spin_lock(&delayed_refs->lock); | 3421 | spin_lock(&delayed_refs->lock); |
3380 | if (delayed_refs->num_entries == 0) { | 3422 | if (delayed_refs->num_entries == 0) { |
3381 | spin_unlock(&delayed_refs->lock); | 3423 | spin_unlock(&delayed_refs->lock); |
@@ -3397,6 +3439,7 @@ static int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans, | |||
3397 | struct btrfs_delayed_ref_head *head; | 3439 | struct btrfs_delayed_ref_head *head; |
3398 | 3440 | ||
3399 | head = btrfs_delayed_node_to_head(ref); | 3441 | head = btrfs_delayed_node_to_head(ref); |
3442 | spin_unlock(&delayed_refs->lock); | ||
3400 | mutex_lock(&head->mutex); | 3443 | mutex_lock(&head->mutex); |
3401 | kfree(head->extent_op); | 3444 | kfree(head->extent_op); |
3402 | delayed_refs->num_heads--; | 3445 | delayed_refs->num_heads--; |
@@ -3404,8 +3447,9 @@ static int btrfs_destroy_delayed_refs(struct btrfs_transaction *trans, | |||
3404 | delayed_refs->num_heads_ready--; | 3447 | delayed_refs->num_heads_ready--; |
3405 | list_del_init(&head->cluster); | 3448 | list_del_init(&head->cluster); |
3406 | mutex_unlock(&head->mutex); | 3449 | mutex_unlock(&head->mutex); |
3450 | btrfs_put_delayed_ref(ref); | ||
3451 | goto again; | ||
3407 | } | 3452 | } |
3408 | |||
3409 | spin_unlock(&delayed_refs->lock); | 3453 | spin_unlock(&delayed_refs->lock); |
3410 | btrfs_put_delayed_ref(ref); | 3454 | btrfs_put_delayed_ref(ref); |
3411 | 3455 | ||
@@ -3649,6 +3693,17 @@ int btrfs_cleanup_transaction(struct btrfs_root *root) | |||
3649 | return 0; | 3693 | return 0; |
3650 | } | 3694 | } |
3651 | 3695 | ||
3696 | static int btree_writepage_io_failed_hook(struct bio *bio, struct page *page, | ||
3697 | u64 start, u64 end, | ||
3698 | struct extent_state *state) | ||
3699 | { | ||
3700 | struct super_block *sb = page->mapping->host->i_sb; | ||
3701 | struct btrfs_fs_info *fs_info = btrfs_sb(sb); | ||
3702 | btrfs_error(fs_info, -EIO, | ||
3703 | "Error occured while writing out btree at %llu", start); | ||
3704 | return -EIO; | ||
3705 | } | ||
3706 | |||
3652 | static struct extent_io_ops btree_extent_io_ops = { | 3707 | static struct extent_io_ops btree_extent_io_ops = { |
3653 | .write_cache_pages_lock_hook = btree_lock_page_hook, | 3708 | .write_cache_pages_lock_hook = btree_lock_page_hook, |
3654 | .readpage_end_io_hook = btree_readpage_end_io_hook, | 3709 | .readpage_end_io_hook = btree_readpage_end_io_hook, |
@@ -3656,4 +3711,5 @@ static struct extent_io_ops btree_extent_io_ops = { | |||
3656 | .submit_bio_hook = btree_submit_bio_hook, | 3711 | .submit_bio_hook = btree_submit_bio_hook, |
3657 | /* note we're sharing with inode.c for the merge bio hook */ | 3712 | /* note we're sharing with inode.c for the merge bio hook */ |
3658 | .merge_bio_hook = btrfs_merge_bio_hook, | 3713 | .merge_bio_hook = btrfs_merge_bio_hook, |
3714 | .writepage_io_failed_hook = btree_writepage_io_failed_hook, | ||
3659 | }; | 3715 | }; |
diff --git a/fs/btrfs/export.c b/fs/btrfs/export.c index 5f77166fd01c..e887ee62b6d4 100644 --- a/fs/btrfs/export.c +++ b/fs/btrfs/export.c | |||
@@ -193,7 +193,7 @@ static struct dentry *btrfs_get_parent(struct dentry *child) | |||
193 | if (ret < 0) | 193 | if (ret < 0) |
194 | goto fail; | 194 | goto fail; |
195 | 195 | ||
196 | BUG_ON(ret == 0); | 196 | BUG_ON(ret == 0); /* Key with offset of -1 found */ |
197 | if (path->slots[0] == 0) { | 197 | if (path->slots[0] == 0) { |
198 | ret = -ENOENT; | 198 | ret = -ENOENT; |
199 | goto fail; | 199 | goto fail; |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index cd6f8ae0a78d..4b3f1eedced0 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -245,7 +245,7 @@ static int exclude_super_stripes(struct btrfs_root *root, | |||
245 | cache->bytes_super += stripe_len; | 245 | cache->bytes_super += stripe_len; |
246 | ret = add_excluded_extent(root, cache->key.objectid, | 246 | ret = add_excluded_extent(root, cache->key.objectid, |
247 | stripe_len); | 247 | stripe_len); |
248 | BUG_ON(ret); | 248 | BUG_ON(ret); /* -ENOMEM */ |
249 | } | 249 | } |
250 | 250 | ||
251 | for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) { | 251 | for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) { |
@@ -253,13 +253,13 @@ static int exclude_super_stripes(struct btrfs_root *root, | |||
253 | ret = btrfs_rmap_block(&root->fs_info->mapping_tree, | 253 | ret = btrfs_rmap_block(&root->fs_info->mapping_tree, |
254 | cache->key.objectid, bytenr, | 254 | cache->key.objectid, bytenr, |
255 | 0, &logical, &nr, &stripe_len); | 255 | 0, &logical, &nr, &stripe_len); |
256 | BUG_ON(ret); | 256 | BUG_ON(ret); /* -ENOMEM */ |
257 | 257 | ||
258 | while (nr--) { | 258 | while (nr--) { |
259 | cache->bytes_super += stripe_len; | 259 | cache->bytes_super += stripe_len; |
260 | ret = add_excluded_extent(root, logical[nr], | 260 | ret = add_excluded_extent(root, logical[nr], |
261 | stripe_len); | 261 | stripe_len); |
262 | BUG_ON(ret); | 262 | BUG_ON(ret); /* -ENOMEM */ |
263 | } | 263 | } |
264 | 264 | ||
265 | kfree(logical); | 265 | kfree(logical); |
@@ -321,7 +321,7 @@ static u64 add_new_free_space(struct btrfs_block_group_cache *block_group, | |||
321 | total_added += size; | 321 | total_added += size; |
322 | ret = btrfs_add_free_space(block_group, start, | 322 | ret = btrfs_add_free_space(block_group, start, |
323 | size); | 323 | size); |
324 | BUG_ON(ret); | 324 | BUG_ON(ret); /* -ENOMEM or logic error */ |
325 | start = extent_end + 1; | 325 | start = extent_end + 1; |
326 | } else { | 326 | } else { |
327 | break; | 327 | break; |
@@ -332,7 +332,7 @@ static u64 add_new_free_space(struct btrfs_block_group_cache *block_group, | |||
332 | size = end - start; | 332 | size = end - start; |
333 | total_added += size; | 333 | total_added += size; |
334 | ret = btrfs_add_free_space(block_group, start, size); | 334 | ret = btrfs_add_free_space(block_group, start, size); |
335 | BUG_ON(ret); | 335 | BUG_ON(ret); /* -ENOMEM or logic error */ |
336 | } | 336 | } |
337 | 337 | ||
338 | return total_added; | 338 | return total_added; |
@@ -474,7 +474,8 @@ static int cache_block_group(struct btrfs_block_group_cache *cache, | |||
474 | int ret = 0; | 474 | int ret = 0; |
475 | 475 | ||
476 | caching_ctl = kzalloc(sizeof(*caching_ctl), GFP_NOFS); | 476 | caching_ctl = kzalloc(sizeof(*caching_ctl), GFP_NOFS); |
477 | BUG_ON(!caching_ctl); | 477 | if (!caching_ctl) |
478 | return -ENOMEM; | ||
478 | 479 | ||
479 | INIT_LIST_HEAD(&caching_ctl->list); | 480 | INIT_LIST_HEAD(&caching_ctl->list); |
480 | mutex_init(&caching_ctl->mutex); | 481 | mutex_init(&caching_ctl->mutex); |
@@ -982,7 +983,7 @@ static int convert_extent_item_v0(struct btrfs_trans_handle *trans, | |||
982 | ret = btrfs_next_leaf(root, path); | 983 | ret = btrfs_next_leaf(root, path); |
983 | if (ret < 0) | 984 | if (ret < 0) |
984 | return ret; | 985 | return ret; |
985 | BUG_ON(ret > 0); | 986 | BUG_ON(ret > 0); /* Corruption */ |
986 | leaf = path->nodes[0]; | 987 | leaf = path->nodes[0]; |
987 | } | 988 | } |
988 | btrfs_item_key_to_cpu(leaf, &found_key, | 989 | btrfs_item_key_to_cpu(leaf, &found_key, |
@@ -1008,7 +1009,7 @@ static int convert_extent_item_v0(struct btrfs_trans_handle *trans, | |||
1008 | new_size + extra_size, 1); | 1009 | new_size + extra_size, 1); |
1009 | if (ret < 0) | 1010 | if (ret < 0) |
1010 | return ret; | 1011 | return ret; |
1011 | BUG_ON(ret); | 1012 | BUG_ON(ret); /* Corruption */ |
1012 | 1013 | ||
1013 | btrfs_extend_item(trans, root, path, new_size); | 1014 | btrfs_extend_item(trans, root, path, new_size); |
1014 | 1015 | ||
@@ -1478,7 +1479,11 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans, | |||
1478 | err = ret; | 1479 | err = ret; |
1479 | goto out; | 1480 | goto out; |
1480 | } | 1481 | } |
1481 | BUG_ON(ret); | 1482 | if (ret && !insert) { |
1483 | err = -ENOENT; | ||
1484 | goto out; | ||
1485 | } | ||
1486 | BUG_ON(ret); /* Corruption */ | ||
1482 | 1487 | ||
1483 | leaf = path->nodes[0]; | 1488 | leaf = path->nodes[0]; |
1484 | item_size = btrfs_item_size_nr(leaf, path->slots[0]); | 1489 | item_size = btrfs_item_size_nr(leaf, path->slots[0]); |
@@ -1831,6 +1836,7 @@ static int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr, | |||
1831 | /* Tell the block device(s) that the sectors can be discarded */ | 1836 | /* Tell the block device(s) that the sectors can be discarded */ |
1832 | ret = btrfs_map_block(&root->fs_info->mapping_tree, REQ_DISCARD, | 1837 | ret = btrfs_map_block(&root->fs_info->mapping_tree, REQ_DISCARD, |
1833 | bytenr, &num_bytes, &bbio, 0); | 1838 | bytenr, &num_bytes, &bbio, 0); |
1839 | /* Error condition is -ENOMEM */ | ||
1834 | if (!ret) { | 1840 | if (!ret) { |
1835 | struct btrfs_bio_stripe *stripe = bbio->stripes; | 1841 | struct btrfs_bio_stripe *stripe = bbio->stripes; |
1836 | int i; | 1842 | int i; |
@@ -1846,7 +1852,7 @@ static int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr, | |||
1846 | if (!ret) | 1852 | if (!ret) |
1847 | discarded_bytes += stripe->length; | 1853 | discarded_bytes += stripe->length; |
1848 | else if (ret != -EOPNOTSUPP) | 1854 | else if (ret != -EOPNOTSUPP) |
1849 | break; | 1855 | break; /* Logic errors or -ENOMEM, or -EIO but I don't know how that could happen JDM */ |
1850 | 1856 | ||
1851 | /* | 1857 | /* |
1852 | * Just in case we get back EOPNOTSUPP for some reason, | 1858 | * Just in case we get back EOPNOTSUPP for some reason, |
@@ -1865,6 +1871,7 @@ static int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr, | |||
1865 | return ret; | 1871 | return ret; |
1866 | } | 1872 | } |
1867 | 1873 | ||
1874 | /* Can return -ENOMEM */ | ||
1868 | int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans, | 1875 | int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans, |
1869 | struct btrfs_root *root, | 1876 | struct btrfs_root *root, |
1870 | u64 bytenr, u64 num_bytes, u64 parent, | 1877 | u64 bytenr, u64 num_bytes, u64 parent, |
@@ -1940,7 +1947,8 @@ static int __btrfs_inc_extent_ref(struct btrfs_trans_handle *trans, | |||
1940 | ret = insert_extent_backref(trans, root->fs_info->extent_root, | 1947 | ret = insert_extent_backref(trans, root->fs_info->extent_root, |
1941 | path, bytenr, parent, root_objectid, | 1948 | path, bytenr, parent, root_objectid, |
1942 | owner, offset, refs_to_add); | 1949 | owner, offset, refs_to_add); |
1943 | BUG_ON(ret); | 1950 | if (ret) |
1951 | btrfs_abort_transaction(trans, root, ret); | ||
1944 | out: | 1952 | out: |
1945 | btrfs_free_path(path); | 1953 | btrfs_free_path(path); |
1946 | return err; | 1954 | return err; |
@@ -2027,6 +2035,9 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans, | |||
2027 | int ret; | 2035 | int ret; |
2028 | int err = 0; | 2036 | int err = 0; |
2029 | 2037 | ||
2038 | if (trans->aborted) | ||
2039 | return 0; | ||
2040 | |||
2030 | path = btrfs_alloc_path(); | 2041 | path = btrfs_alloc_path(); |
2031 | if (!path) | 2042 | if (!path) |
2032 | return -ENOMEM; | 2043 | return -ENOMEM; |
@@ -2124,7 +2135,11 @@ static int run_one_delayed_ref(struct btrfs_trans_handle *trans, | |||
2124 | struct btrfs_delayed_extent_op *extent_op, | 2135 | struct btrfs_delayed_extent_op *extent_op, |
2125 | int insert_reserved) | 2136 | int insert_reserved) |
2126 | { | 2137 | { |
2127 | int ret; | 2138 | int ret = 0; |
2139 | |||
2140 | if (trans->aborted) | ||
2141 | return 0; | ||
2142 | |||
2128 | if (btrfs_delayed_ref_is_head(node)) { | 2143 | if (btrfs_delayed_ref_is_head(node)) { |
2129 | struct btrfs_delayed_ref_head *head; | 2144 | struct btrfs_delayed_ref_head *head; |
2130 | /* | 2145 | /* |
@@ -2142,11 +2157,10 @@ static int run_one_delayed_ref(struct btrfs_trans_handle *trans, | |||
2142 | ret = btrfs_del_csums(trans, root, | 2157 | ret = btrfs_del_csums(trans, root, |
2143 | node->bytenr, | 2158 | node->bytenr, |
2144 | node->num_bytes); | 2159 | node->num_bytes); |
2145 | BUG_ON(ret); | ||
2146 | } | 2160 | } |
2147 | } | 2161 | } |
2148 | mutex_unlock(&head->mutex); | 2162 | mutex_unlock(&head->mutex); |
2149 | return 0; | 2163 | return ret; |
2150 | } | 2164 | } |
2151 | 2165 | ||
2152 | if (node->type == BTRFS_TREE_BLOCK_REF_KEY || | 2166 | if (node->type == BTRFS_TREE_BLOCK_REF_KEY || |
@@ -2193,6 +2207,10 @@ again: | |||
2193 | return NULL; | 2207 | return NULL; |
2194 | } | 2208 | } |
2195 | 2209 | ||
2210 | /* | ||
2211 | * Returns 0 on success or if called with an already aborted transaction. | ||
2212 | * Returns -ENOMEM or -EIO on failure and will abort the transaction. | ||
2213 | */ | ||
2196 | static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | 2214 | static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, |
2197 | struct btrfs_root *root, | 2215 | struct btrfs_root *root, |
2198 | struct list_head *cluster) | 2216 | struct list_head *cluster) |
@@ -2281,9 +2299,13 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | |||
2281 | 2299 | ||
2282 | ret = run_delayed_extent_op(trans, root, | 2300 | ret = run_delayed_extent_op(trans, root, |
2283 | ref, extent_op); | 2301 | ref, extent_op); |
2284 | BUG_ON(ret); | ||
2285 | kfree(extent_op); | 2302 | kfree(extent_op); |
2286 | 2303 | ||
2304 | if (ret) { | ||
2305 | printk(KERN_DEBUG "btrfs: run_delayed_extent_op returned %d\n", ret); | ||
2306 | return ret; | ||
2307 | } | ||
2308 | |||
2287 | goto next; | 2309 | goto next; |
2288 | } | 2310 | } |
2289 | 2311 | ||
@@ -2304,11 +2326,16 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | |||
2304 | 2326 | ||
2305 | ret = run_one_delayed_ref(trans, root, ref, extent_op, | 2327 | ret = run_one_delayed_ref(trans, root, ref, extent_op, |
2306 | must_insert_reserved); | 2328 | must_insert_reserved); |
2307 | BUG_ON(ret); | ||
2308 | 2329 | ||
2309 | btrfs_put_delayed_ref(ref); | 2330 | btrfs_put_delayed_ref(ref); |
2310 | kfree(extent_op); | 2331 | kfree(extent_op); |
2311 | count++; | 2332 | count++; |
2333 | |||
2334 | if (ret) { | ||
2335 | printk(KERN_DEBUG "btrfs: run_one_delayed_ref returned %d\n", ret); | ||
2336 | return ret; | ||
2337 | } | ||
2338 | |||
2312 | next: | 2339 | next: |
2313 | do_chunk_alloc(trans, root->fs_info->extent_root, | 2340 | do_chunk_alloc(trans, root->fs_info->extent_root, |
2314 | 2 * 1024 * 1024, | 2341 | 2 * 1024 * 1024, |
@@ -2343,6 +2370,9 @@ static void wait_for_more_refs(struct btrfs_delayed_ref_root *delayed_refs, | |||
2343 | * 0, which means to process everything in the tree at the start | 2370 | * 0, which means to process everything in the tree at the start |
2344 | * of the run (but not newly added entries), or it can be some target | 2371 | * of the run (but not newly added entries), or it can be some target |
2345 | * number you'd like to process. | 2372 | * number you'd like to process. |
2373 | * | ||
2374 | * Returns 0 on success or if called with an aborted transaction | ||
2375 | * Returns <0 on error and aborts the transaction | ||
2346 | */ | 2376 | */ |
2347 | int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, | 2377 | int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, |
2348 | struct btrfs_root *root, unsigned long count) | 2378 | struct btrfs_root *root, unsigned long count) |
@@ -2358,6 +2388,10 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, | |||
2358 | unsigned long num_refs = 0; | 2388 | unsigned long num_refs = 0; |
2359 | int consider_waiting; | 2389 | int consider_waiting; |
2360 | 2390 | ||
2391 | /* We'll clean this up in btrfs_cleanup_transaction */ | ||
2392 | if (trans->aborted) | ||
2393 | return 0; | ||
2394 | |||
2361 | if (root == root->fs_info->extent_root) | 2395 | if (root == root->fs_info->extent_root) |
2362 | root = root->fs_info->tree_root; | 2396 | root = root->fs_info->tree_root; |
2363 | 2397 | ||
@@ -2415,7 +2449,11 @@ again: | |||
2415 | } | 2449 | } |
2416 | 2450 | ||
2417 | ret = run_clustered_refs(trans, root, &cluster); | 2451 | ret = run_clustered_refs(trans, root, &cluster); |
2418 | BUG_ON(ret < 0); | 2452 | if (ret < 0) { |
2453 | spin_unlock(&delayed_refs->lock); | ||
2454 | btrfs_abort_transaction(trans, root, ret); | ||
2455 | return ret; | ||
2456 | } | ||
2419 | 2457 | ||
2420 | count -= min_t(unsigned long, ret, count); | 2458 | count -= min_t(unsigned long, ret, count); |
2421 | 2459 | ||
@@ -2580,7 +2618,7 @@ static noinline int check_committed_ref(struct btrfs_trans_handle *trans, | |||
2580 | ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0); | 2618 | ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0); |
2581 | if (ret < 0) | 2619 | if (ret < 0) |
2582 | goto out; | 2620 | goto out; |
2583 | BUG_ON(ret == 0); | 2621 | BUG_ON(ret == 0); /* Corruption */ |
2584 | 2622 | ||
2585 | ret = -ENOENT; | 2623 | ret = -ENOENT; |
2586 | if (path->slots[0] == 0) | 2624 | if (path->slots[0] == 0) |
@@ -2734,7 +2772,6 @@ static int __btrfs_mod_ref(struct btrfs_trans_handle *trans, | |||
2734 | } | 2772 | } |
2735 | return 0; | 2773 | return 0; |
2736 | fail: | 2774 | fail: |
2737 | BUG(); | ||
2738 | return ret; | 2775 | return ret; |
2739 | } | 2776 | } |
2740 | 2777 | ||
@@ -2763,7 +2800,7 @@ static int write_one_cache_group(struct btrfs_trans_handle *trans, | |||
2763 | ret = btrfs_search_slot(trans, extent_root, &cache->key, path, 0, 1); | 2800 | ret = btrfs_search_slot(trans, extent_root, &cache->key, path, 0, 1); |
2764 | if (ret < 0) | 2801 | if (ret < 0) |
2765 | goto fail; | 2802 | goto fail; |
2766 | BUG_ON(ret); | 2803 | BUG_ON(ret); /* Corruption */ |
2767 | 2804 | ||
2768 | leaf = path->nodes[0]; | 2805 | leaf = path->nodes[0]; |
2769 | bi = btrfs_item_ptr_offset(leaf, path->slots[0]); | 2806 | bi = btrfs_item_ptr_offset(leaf, path->slots[0]); |
@@ -2771,8 +2808,10 @@ static int write_one_cache_group(struct btrfs_trans_handle *trans, | |||
2771 | btrfs_mark_buffer_dirty(leaf); | 2808 | btrfs_mark_buffer_dirty(leaf); |
2772 | btrfs_release_path(path); | 2809 | btrfs_release_path(path); |
2773 | fail: | 2810 | fail: |
2774 | if (ret) | 2811 | if (ret) { |
2812 | btrfs_abort_transaction(trans, root, ret); | ||
2775 | return ret; | 2813 | return ret; |
2814 | } | ||
2776 | return 0; | 2815 | return 0; |
2777 | 2816 | ||
2778 | } | 2817 | } |
@@ -2945,7 +2984,8 @@ again: | |||
2945 | if (last == 0) { | 2984 | if (last == 0) { |
2946 | err = btrfs_run_delayed_refs(trans, root, | 2985 | err = btrfs_run_delayed_refs(trans, root, |
2947 | (unsigned long)-1); | 2986 | (unsigned long)-1); |
2948 | BUG_ON(err); | 2987 | if (err) /* File system offline */ |
2988 | goto out; | ||
2949 | } | 2989 | } |
2950 | 2990 | ||
2951 | cache = btrfs_lookup_first_block_group(root->fs_info, last); | 2991 | cache = btrfs_lookup_first_block_group(root->fs_info, last); |
@@ -2972,7 +3012,9 @@ again: | |||
2972 | last = cache->key.objectid + cache->key.offset; | 3012 | last = cache->key.objectid + cache->key.offset; |
2973 | 3013 | ||
2974 | err = write_one_cache_group(trans, root, path, cache); | 3014 | err = write_one_cache_group(trans, root, path, cache); |
2975 | BUG_ON(err); | 3015 | if (err) /* File system offline */ |
3016 | goto out; | ||
3017 | |||
2976 | btrfs_put_block_group(cache); | 3018 | btrfs_put_block_group(cache); |
2977 | } | 3019 | } |
2978 | 3020 | ||
@@ -2985,7 +3027,8 @@ again: | |||
2985 | if (last == 0) { | 3027 | if (last == 0) { |
2986 | err = btrfs_run_delayed_refs(trans, root, | 3028 | err = btrfs_run_delayed_refs(trans, root, |
2987 | (unsigned long)-1); | 3029 | (unsigned long)-1); |
2988 | BUG_ON(err); | 3030 | if (err) /* File system offline */ |
3031 | goto out; | ||
2989 | } | 3032 | } |
2990 | 3033 | ||
2991 | cache = btrfs_lookup_first_block_group(root->fs_info, last); | 3034 | cache = btrfs_lookup_first_block_group(root->fs_info, last); |
@@ -3010,20 +3053,21 @@ again: | |||
3010 | continue; | 3053 | continue; |
3011 | } | 3054 | } |
3012 | 3055 | ||
3013 | btrfs_write_out_cache(root, trans, cache, path); | 3056 | err = btrfs_write_out_cache(root, trans, cache, path); |
3014 | 3057 | ||
3015 | /* | 3058 | /* |
3016 | * If we didn't have an error then the cache state is still | 3059 | * If we didn't have an error then the cache state is still |
3017 | * NEED_WRITE, so we can set it to WRITTEN. | 3060 | * NEED_WRITE, so we can set it to WRITTEN. |
3018 | */ | 3061 | */ |
3019 | if (cache->disk_cache_state == BTRFS_DC_NEED_WRITE) | 3062 | if (!err && cache->disk_cache_state == BTRFS_DC_NEED_WRITE) |
3020 | cache->disk_cache_state = BTRFS_DC_WRITTEN; | 3063 | cache->disk_cache_state = BTRFS_DC_WRITTEN; |
3021 | last = cache->key.objectid + cache->key.offset; | 3064 | last = cache->key.objectid + cache->key.offset; |
3022 | btrfs_put_block_group(cache); | 3065 | btrfs_put_block_group(cache); |
3023 | } | 3066 | } |
3067 | out: | ||
3024 | 3068 | ||
3025 | btrfs_free_path(path); | 3069 | btrfs_free_path(path); |
3026 | return 0; | 3070 | return err; |
3027 | } | 3071 | } |
3028 | 3072 | ||
3029 | int btrfs_extent_readonly(struct btrfs_root *root, u64 bytenr) | 3073 | int btrfs_extent_readonly(struct btrfs_root *root, u64 bytenr) |
@@ -3407,9 +3451,9 @@ static int do_chunk_alloc(struct btrfs_trans_handle *trans, | |||
3407 | if (!space_info) { | 3451 | if (!space_info) { |
3408 | ret = update_space_info(extent_root->fs_info, flags, | 3452 | ret = update_space_info(extent_root->fs_info, flags, |
3409 | 0, 0, &space_info); | 3453 | 0, 0, &space_info); |
3410 | BUG_ON(ret); | 3454 | BUG_ON(ret); /* -ENOMEM */ |
3411 | } | 3455 | } |
3412 | BUG_ON(!space_info); | 3456 | BUG_ON(!space_info); /* Logic error */ |
3413 | 3457 | ||
3414 | again: | 3458 | again: |
3415 | spin_lock(&space_info->lock); | 3459 | spin_lock(&space_info->lock); |
@@ -3674,8 +3718,10 @@ again: | |||
3674 | ret = wait_event_interruptible(space_info->wait, | 3718 | ret = wait_event_interruptible(space_info->wait, |
3675 | !space_info->flush); | 3719 | !space_info->flush); |
3676 | /* Must have been interrupted, return */ | 3720 | /* Must have been interrupted, return */ |
3677 | if (ret) | 3721 | if (ret) { |
3722 | printk(KERN_DEBUG "btrfs: %s returning -EINTR\n", __func__); | ||
3678 | return -EINTR; | 3723 | return -EINTR; |
3724 | } | ||
3679 | 3725 | ||
3680 | spin_lock(&space_info->lock); | 3726 | spin_lock(&space_info->lock); |
3681 | } | 3727 | } |
@@ -3832,8 +3878,9 @@ out: | |||
3832 | return ret; | 3878 | return ret; |
3833 | } | 3879 | } |
3834 | 3880 | ||
3835 | static struct btrfs_block_rsv *get_block_rsv(struct btrfs_trans_handle *trans, | 3881 | static struct btrfs_block_rsv *get_block_rsv( |
3836 | struct btrfs_root *root) | 3882 | const struct btrfs_trans_handle *trans, |
3883 | const struct btrfs_root *root) | ||
3837 | { | 3884 | { |
3838 | struct btrfs_block_rsv *block_rsv = NULL; | 3885 | struct btrfs_block_rsv *block_rsv = NULL; |
3839 | 3886 | ||
@@ -4200,6 +4247,7 @@ void btrfs_trans_release_metadata(struct btrfs_trans_handle *trans, | |||
4200 | trans->bytes_reserved = 0; | 4247 | trans->bytes_reserved = 0; |
4201 | } | 4248 | } |
4202 | 4249 | ||
4250 | /* Can only return 0 or -ENOSPC */ | ||
4203 | int btrfs_orphan_reserve_metadata(struct btrfs_trans_handle *trans, | 4251 | int btrfs_orphan_reserve_metadata(struct btrfs_trans_handle *trans, |
4204 | struct inode *inode) | 4252 | struct inode *inode) |
4205 | { | 4253 | { |
@@ -4536,7 +4584,7 @@ static int update_block_group(struct btrfs_trans_handle *trans, | |||
4536 | while (total) { | 4584 | while (total) { |
4537 | cache = btrfs_lookup_block_group(info, bytenr); | 4585 | cache = btrfs_lookup_block_group(info, bytenr); |
4538 | if (!cache) | 4586 | if (!cache) |
4539 | return -1; | 4587 | return -ENOENT; |
4540 | if (cache->flags & (BTRFS_BLOCK_GROUP_DUP | | 4588 | if (cache->flags & (BTRFS_BLOCK_GROUP_DUP | |
4541 | BTRFS_BLOCK_GROUP_RAID1 | | 4589 | BTRFS_BLOCK_GROUP_RAID1 | |
4542 | BTRFS_BLOCK_GROUP_RAID10)) | 4590 | BTRFS_BLOCK_GROUP_RAID10)) |
@@ -4639,7 +4687,7 @@ int btrfs_pin_extent(struct btrfs_root *root, | |||
4639 | struct btrfs_block_group_cache *cache; | 4687 | struct btrfs_block_group_cache *cache; |
4640 | 4688 | ||
4641 | cache = btrfs_lookup_block_group(root->fs_info, bytenr); | 4689 | cache = btrfs_lookup_block_group(root->fs_info, bytenr); |
4642 | BUG_ON(!cache); | 4690 | BUG_ON(!cache); /* Logic error */ |
4643 | 4691 | ||
4644 | pin_down_extent(root, cache, bytenr, num_bytes, reserved); | 4692 | pin_down_extent(root, cache, bytenr, num_bytes, reserved); |
4645 | 4693 | ||
@@ -4657,7 +4705,7 @@ int btrfs_pin_extent_for_log_replay(struct btrfs_trans_handle *trans, | |||
4657 | struct btrfs_block_group_cache *cache; | 4705 | struct btrfs_block_group_cache *cache; |
4658 | 4706 | ||
4659 | cache = btrfs_lookup_block_group(root->fs_info, bytenr); | 4707 | cache = btrfs_lookup_block_group(root->fs_info, bytenr); |
4660 | BUG_ON(!cache); | 4708 | BUG_ON(!cache); /* Logic error */ |
4661 | 4709 | ||
4662 | /* | 4710 | /* |
4663 | * pull in the free space cache (if any) so that our pin | 4711 | * pull in the free space cache (if any) so that our pin |
@@ -4702,6 +4750,7 @@ static int btrfs_update_reserved_bytes(struct btrfs_block_group_cache *cache, | |||
4702 | { | 4750 | { |
4703 | struct btrfs_space_info *space_info = cache->space_info; | 4751 | struct btrfs_space_info *space_info = cache->space_info; |
4704 | int ret = 0; | 4752 | int ret = 0; |
4753 | |||
4705 | spin_lock(&space_info->lock); | 4754 | spin_lock(&space_info->lock); |
4706 | spin_lock(&cache->lock); | 4755 | spin_lock(&cache->lock); |
4707 | if (reserve != RESERVE_FREE) { | 4756 | if (reserve != RESERVE_FREE) { |
@@ -4774,7 +4823,7 @@ static int unpin_extent_range(struct btrfs_root *root, u64 start, u64 end) | |||
4774 | if (cache) | 4823 | if (cache) |
4775 | btrfs_put_block_group(cache); | 4824 | btrfs_put_block_group(cache); |
4776 | cache = btrfs_lookup_block_group(fs_info, start); | 4825 | cache = btrfs_lookup_block_group(fs_info, start); |
4777 | BUG_ON(!cache); | 4826 | BUG_ON(!cache); /* Logic error */ |
4778 | } | 4827 | } |
4779 | 4828 | ||
4780 | len = cache->key.objectid + cache->key.offset - start; | 4829 | len = cache->key.objectid + cache->key.offset - start; |
@@ -4811,6 +4860,9 @@ int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, | |||
4811 | u64 end; | 4860 | u64 end; |
4812 | int ret; | 4861 | int ret; |
4813 | 4862 | ||
4863 | if (trans->aborted) | ||
4864 | return 0; | ||
4865 | |||
4814 | if (fs_info->pinned_extents == &fs_info->freed_extents[0]) | 4866 | if (fs_info->pinned_extents == &fs_info->freed_extents[0]) |
4815 | unpin = &fs_info->freed_extents[1]; | 4867 | unpin = &fs_info->freed_extents[1]; |
4816 | else | 4868 | else |
@@ -4896,7 +4948,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
4896 | ret = remove_extent_backref(trans, extent_root, path, | 4948 | ret = remove_extent_backref(trans, extent_root, path, |
4897 | NULL, refs_to_drop, | 4949 | NULL, refs_to_drop, |
4898 | is_data); | 4950 | is_data); |
4899 | BUG_ON(ret); | 4951 | if (ret) |
4952 | goto abort; | ||
4900 | btrfs_release_path(path); | 4953 | btrfs_release_path(path); |
4901 | path->leave_spinning = 1; | 4954 | path->leave_spinning = 1; |
4902 | 4955 | ||
@@ -4914,10 +4967,11 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
4914 | btrfs_print_leaf(extent_root, | 4967 | btrfs_print_leaf(extent_root, |
4915 | path->nodes[0]); | 4968 | path->nodes[0]); |
4916 | } | 4969 | } |
4917 | BUG_ON(ret); | 4970 | if (ret < 0) |
4971 | goto abort; | ||
4918 | extent_slot = path->slots[0]; | 4972 | extent_slot = path->slots[0]; |
4919 | } | 4973 | } |
4920 | } else { | 4974 | } else if (ret == -ENOENT) { |
4921 | btrfs_print_leaf(extent_root, path->nodes[0]); | 4975 | btrfs_print_leaf(extent_root, path->nodes[0]); |
4922 | WARN_ON(1); | 4976 | WARN_ON(1); |
4923 | printk(KERN_ERR "btrfs unable to find ref byte nr %llu " | 4977 | printk(KERN_ERR "btrfs unable to find ref byte nr %llu " |
@@ -4927,6 +4981,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
4927 | (unsigned long long)root_objectid, | 4981 | (unsigned long long)root_objectid, |
4928 | (unsigned long long)owner_objectid, | 4982 | (unsigned long long)owner_objectid, |
4929 | (unsigned long long)owner_offset); | 4983 | (unsigned long long)owner_offset); |
4984 | } else { | ||
4985 | goto abort; | ||
4930 | } | 4986 | } |
4931 | 4987 | ||
4932 | leaf = path->nodes[0]; | 4988 | leaf = path->nodes[0]; |
@@ -4936,7 +4992,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
4936 | BUG_ON(found_extent || extent_slot != path->slots[0]); | 4992 | BUG_ON(found_extent || extent_slot != path->slots[0]); |
4937 | ret = convert_extent_item_v0(trans, extent_root, path, | 4993 | ret = convert_extent_item_v0(trans, extent_root, path, |
4938 | owner_objectid, 0); | 4994 | owner_objectid, 0); |
4939 | BUG_ON(ret < 0); | 4995 | if (ret < 0) |
4996 | goto abort; | ||
4940 | 4997 | ||
4941 | btrfs_release_path(path); | 4998 | btrfs_release_path(path); |
4942 | path->leave_spinning = 1; | 4999 | path->leave_spinning = 1; |
@@ -4953,7 +5010,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
4953 | (unsigned long long)bytenr); | 5010 | (unsigned long long)bytenr); |
4954 | btrfs_print_leaf(extent_root, path->nodes[0]); | 5011 | btrfs_print_leaf(extent_root, path->nodes[0]); |
4955 | } | 5012 | } |
4956 | BUG_ON(ret); | 5013 | if (ret < 0) |
5014 | goto abort; | ||
4957 | extent_slot = path->slots[0]; | 5015 | extent_slot = path->slots[0]; |
4958 | leaf = path->nodes[0]; | 5016 | leaf = path->nodes[0]; |
4959 | item_size = btrfs_item_size_nr(leaf, extent_slot); | 5017 | item_size = btrfs_item_size_nr(leaf, extent_slot); |
@@ -4990,7 +5048,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
4990 | ret = remove_extent_backref(trans, extent_root, path, | 5048 | ret = remove_extent_backref(trans, extent_root, path, |
4991 | iref, refs_to_drop, | 5049 | iref, refs_to_drop, |
4992 | is_data); | 5050 | is_data); |
4993 | BUG_ON(ret); | 5051 | if (ret) |
5052 | goto abort; | ||
4994 | } | 5053 | } |
4995 | } else { | 5054 | } else { |
4996 | if (found_extent) { | 5055 | if (found_extent) { |
@@ -5007,12 +5066,14 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5007 | 5066 | ||
5008 | ret = btrfs_del_items(trans, extent_root, path, path->slots[0], | 5067 | ret = btrfs_del_items(trans, extent_root, path, path->slots[0], |
5009 | num_to_del); | 5068 | num_to_del); |
5010 | BUG_ON(ret); | 5069 | if (ret) |
5070 | goto abort; | ||
5011 | btrfs_release_path(path); | 5071 | btrfs_release_path(path); |
5012 | 5072 | ||
5013 | if (is_data) { | 5073 | if (is_data) { |
5014 | ret = btrfs_del_csums(trans, root, bytenr, num_bytes); | 5074 | ret = btrfs_del_csums(trans, root, bytenr, num_bytes); |
5015 | BUG_ON(ret); | 5075 | if (ret) |
5076 | goto abort; | ||
5016 | } else { | 5077 | } else { |
5017 | invalidate_mapping_pages(info->btree_inode->i_mapping, | 5078 | invalidate_mapping_pages(info->btree_inode->i_mapping, |
5018 | bytenr >> PAGE_CACHE_SHIFT, | 5079 | bytenr >> PAGE_CACHE_SHIFT, |
@@ -5020,10 +5081,16 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5020 | } | 5081 | } |
5021 | 5082 | ||
5022 | ret = update_block_group(trans, root, bytenr, num_bytes, 0); | 5083 | ret = update_block_group(trans, root, bytenr, num_bytes, 0); |
5023 | BUG_ON(ret); | 5084 | if (ret) |
5085 | goto abort; | ||
5024 | } | 5086 | } |
5087 | out: | ||
5025 | btrfs_free_path(path); | 5088 | btrfs_free_path(path); |
5026 | return ret; | 5089 | return ret; |
5090 | |||
5091 | abort: | ||
5092 | btrfs_abort_transaction(trans, extent_root, ret); | ||
5093 | goto out; | ||
5027 | } | 5094 | } |
5028 | 5095 | ||
5029 | /* | 5096 | /* |
@@ -5119,7 +5186,7 @@ void btrfs_free_tree_block(struct btrfs_trans_handle *trans, | |||
5119 | parent, root->root_key.objectid, | 5186 | parent, root->root_key.objectid, |
5120 | btrfs_header_level(buf), | 5187 | btrfs_header_level(buf), |
5121 | BTRFS_DROP_DELAYED_REF, NULL, for_cow); | 5188 | BTRFS_DROP_DELAYED_REF, NULL, for_cow); |
5122 | BUG_ON(ret); | 5189 | BUG_ON(ret); /* -ENOMEM */ |
5123 | } | 5190 | } |
5124 | 5191 | ||
5125 | if (!last_ref) | 5192 | if (!last_ref) |
@@ -5153,6 +5220,7 @@ out: | |||
5153 | btrfs_put_block_group(cache); | 5220 | btrfs_put_block_group(cache); |
5154 | } | 5221 | } |
5155 | 5222 | ||
5223 | /* Can return -ENOMEM */ | ||
5156 | int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root *root, | 5224 | int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root *root, |
5157 | u64 bytenr, u64 num_bytes, u64 parent, u64 root_objectid, | 5225 | u64 bytenr, u64 num_bytes, u64 parent, u64 root_objectid, |
5158 | u64 owner, u64 offset, int for_cow) | 5226 | u64 owner, u64 offset, int for_cow) |
@@ -5174,14 +5242,12 @@ int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
5174 | num_bytes, | 5242 | num_bytes, |
5175 | parent, root_objectid, (int)owner, | 5243 | parent, root_objectid, (int)owner, |
5176 | BTRFS_DROP_DELAYED_REF, NULL, for_cow); | 5244 | BTRFS_DROP_DELAYED_REF, NULL, for_cow); |
5177 | BUG_ON(ret); | ||
5178 | } else { | 5245 | } else { |
5179 | ret = btrfs_add_delayed_data_ref(fs_info, trans, bytenr, | 5246 | ret = btrfs_add_delayed_data_ref(fs_info, trans, bytenr, |
5180 | num_bytes, | 5247 | num_bytes, |
5181 | parent, root_objectid, owner, | 5248 | parent, root_objectid, owner, |
5182 | offset, BTRFS_DROP_DELAYED_REF, | 5249 | offset, BTRFS_DROP_DELAYED_REF, |
5183 | NULL, for_cow); | 5250 | NULL, for_cow); |
5184 | BUG_ON(ret); | ||
5185 | } | 5251 | } |
5186 | return ret; | 5252 | return ret; |
5187 | } | 5253 | } |
@@ -5418,6 +5484,7 @@ have_block_group: | |||
5418 | found_uncached_bg = true; | 5484 | found_uncached_bg = true; |
5419 | ret = cache_block_group(block_group, trans, | 5485 | ret = cache_block_group(block_group, trans, |
5420 | orig_root, 1); | 5486 | orig_root, 1); |
5487 | BUG_ON(ret < 0); /* -ENOMEM */ | ||
5421 | if (block_group->cached == BTRFS_CACHE_FINISHED) | 5488 | if (block_group->cached == BTRFS_CACHE_FINISHED) |
5422 | goto alloc; | 5489 | goto alloc; |
5423 | 5490 | ||
@@ -5439,7 +5506,7 @@ have_block_group: | |||
5439 | if (loop > LOOP_FIND_IDEAL) { | 5506 | if (loop > LOOP_FIND_IDEAL) { |
5440 | ret = cache_block_group(block_group, trans, | 5507 | ret = cache_block_group(block_group, trans, |
5441 | orig_root, 0); | 5508 | orig_root, 0); |
5442 | BUG_ON(ret); | 5509 | BUG_ON(ret); /* -ENOMEM */ |
5443 | } | 5510 | } |
5444 | 5511 | ||
5445 | /* | 5512 | /* |
@@ -5712,6 +5779,11 @@ loop: | |||
5712 | ret = do_chunk_alloc(trans, root, num_bytes + | 5779 | ret = do_chunk_alloc(trans, root, num_bytes + |
5713 | 2 * 1024 * 1024, data, | 5780 | 2 * 1024 * 1024, data, |
5714 | CHUNK_ALLOC_LIMITED); | 5781 | CHUNK_ALLOC_LIMITED); |
5782 | if (ret < 0) { | ||
5783 | btrfs_abort_transaction(trans, | ||
5784 | root, ret); | ||
5785 | goto out; | ||
5786 | } | ||
5715 | allowed_chunk_alloc = 0; | 5787 | allowed_chunk_alloc = 0; |
5716 | if (ret == 1) | 5788 | if (ret == 1) |
5717 | done_chunk_alloc = 1; | 5789 | done_chunk_alloc = 1; |
@@ -5740,6 +5812,7 @@ loop: | |||
5740 | } else if (ins->objectid) { | 5812 | } else if (ins->objectid) { |
5741 | ret = 0; | 5813 | ret = 0; |
5742 | } | 5814 | } |
5815 | out: | ||
5743 | 5816 | ||
5744 | return ret; | 5817 | return ret; |
5745 | } | 5818 | } |
@@ -5806,10 +5879,15 @@ again: | |||
5806 | * the only place that sets empty_size is btrfs_realloc_node, which | 5879 | * the only place that sets empty_size is btrfs_realloc_node, which |
5807 | * is not called recursively on allocations | 5880 | * is not called recursively on allocations |
5808 | */ | 5881 | */ |
5809 | if (empty_size || root->ref_cows) | 5882 | if (empty_size || root->ref_cows) { |
5810 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, | 5883 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, |
5811 | num_bytes + 2 * 1024 * 1024, data, | 5884 | num_bytes + 2 * 1024 * 1024, data, |
5812 | CHUNK_ALLOC_NO_FORCE); | 5885 | CHUNK_ALLOC_NO_FORCE); |
5886 | if (ret < 0 && ret != -ENOSPC) { | ||
5887 | btrfs_abort_transaction(trans, root, ret); | ||
5888 | return ret; | ||
5889 | } | ||
5890 | } | ||
5813 | 5891 | ||
5814 | WARN_ON(num_bytes < root->sectorsize); | 5892 | WARN_ON(num_bytes < root->sectorsize); |
5815 | ret = find_free_extent(trans, root, num_bytes, empty_size, | 5893 | ret = find_free_extent(trans, root, num_bytes, empty_size, |
@@ -5821,8 +5899,12 @@ again: | |||
5821 | num_bytes = num_bytes >> 1; | 5899 | num_bytes = num_bytes >> 1; |
5822 | num_bytes = num_bytes & ~(root->sectorsize - 1); | 5900 | num_bytes = num_bytes & ~(root->sectorsize - 1); |
5823 | num_bytes = max(num_bytes, min_alloc_size); | 5901 | num_bytes = max(num_bytes, min_alloc_size); |
5824 | do_chunk_alloc(trans, root->fs_info->extent_root, | 5902 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, |
5825 | num_bytes, data, CHUNK_ALLOC_FORCE); | 5903 | num_bytes, data, CHUNK_ALLOC_FORCE); |
5904 | if (ret < 0 && ret != -ENOSPC) { | ||
5905 | btrfs_abort_transaction(trans, root, ret); | ||
5906 | return ret; | ||
5907 | } | ||
5826 | if (num_bytes == min_alloc_size) | 5908 | if (num_bytes == min_alloc_size) |
5827 | final_tried = true; | 5909 | final_tried = true; |
5828 | goto again; | 5910 | goto again; |
@@ -5913,7 +5995,10 @@ static int alloc_reserved_file_extent(struct btrfs_trans_handle *trans, | |||
5913 | path->leave_spinning = 1; | 5995 | path->leave_spinning = 1; |
5914 | ret = btrfs_insert_empty_item(trans, fs_info->extent_root, path, | 5996 | ret = btrfs_insert_empty_item(trans, fs_info->extent_root, path, |
5915 | ins, size); | 5997 | ins, size); |
5916 | BUG_ON(ret); | 5998 | if (ret) { |
5999 | btrfs_free_path(path); | ||
6000 | return ret; | ||
6001 | } | ||
5917 | 6002 | ||
5918 | leaf = path->nodes[0]; | 6003 | leaf = path->nodes[0]; |
5919 | extent_item = btrfs_item_ptr(leaf, path->slots[0], | 6004 | extent_item = btrfs_item_ptr(leaf, path->slots[0], |
@@ -5943,7 +6028,7 @@ static int alloc_reserved_file_extent(struct btrfs_trans_handle *trans, | |||
5943 | btrfs_free_path(path); | 6028 | btrfs_free_path(path); |
5944 | 6029 | ||
5945 | ret = update_block_group(trans, root, ins->objectid, ins->offset, 1); | 6030 | ret = update_block_group(trans, root, ins->objectid, ins->offset, 1); |
5946 | if (ret) { | 6031 | if (ret) { /* -ENOENT, logic error */ |
5947 | printk(KERN_ERR "btrfs update block group failed for %llu " | 6032 | printk(KERN_ERR "btrfs update block group failed for %llu " |
5948 | "%llu\n", (unsigned long long)ins->objectid, | 6033 | "%llu\n", (unsigned long long)ins->objectid, |
5949 | (unsigned long long)ins->offset); | 6034 | (unsigned long long)ins->offset); |
@@ -5974,7 +6059,10 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans, | |||
5974 | path->leave_spinning = 1; | 6059 | path->leave_spinning = 1; |
5975 | ret = btrfs_insert_empty_item(trans, fs_info->extent_root, path, | 6060 | ret = btrfs_insert_empty_item(trans, fs_info->extent_root, path, |
5976 | ins, size); | 6061 | ins, size); |
5977 | BUG_ON(ret); | 6062 | if (ret) { |
6063 | btrfs_free_path(path); | ||
6064 | return ret; | ||
6065 | } | ||
5978 | 6066 | ||
5979 | leaf = path->nodes[0]; | 6067 | leaf = path->nodes[0]; |
5980 | extent_item = btrfs_item_ptr(leaf, path->slots[0], | 6068 | extent_item = btrfs_item_ptr(leaf, path->slots[0], |
@@ -6004,7 +6092,7 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans, | |||
6004 | btrfs_free_path(path); | 6092 | btrfs_free_path(path); |
6005 | 6093 | ||
6006 | ret = update_block_group(trans, root, ins->objectid, ins->offset, 1); | 6094 | ret = update_block_group(trans, root, ins->objectid, ins->offset, 1); |
6007 | if (ret) { | 6095 | if (ret) { /* -ENOENT, logic error */ |
6008 | printk(KERN_ERR "btrfs update block group failed for %llu " | 6096 | printk(KERN_ERR "btrfs update block group failed for %llu " |
6009 | "%llu\n", (unsigned long long)ins->objectid, | 6097 | "%llu\n", (unsigned long long)ins->objectid, |
6010 | (unsigned long long)ins->offset); | 6098 | (unsigned long long)ins->offset); |
@@ -6052,28 +6140,28 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans, | |||
6052 | if (!caching_ctl) { | 6140 | if (!caching_ctl) { |
6053 | BUG_ON(!block_group_cache_done(block_group)); | 6141 | BUG_ON(!block_group_cache_done(block_group)); |
6054 | ret = btrfs_remove_free_space(block_group, start, num_bytes); | 6142 | ret = btrfs_remove_free_space(block_group, start, num_bytes); |
6055 | BUG_ON(ret); | 6143 | BUG_ON(ret); /* -ENOMEM */ |
6056 | } else { | 6144 | } else { |
6057 | mutex_lock(&caching_ctl->mutex); | 6145 | mutex_lock(&caching_ctl->mutex); |
6058 | 6146 | ||
6059 | if (start >= caching_ctl->progress) { | 6147 | if (start >= caching_ctl->progress) { |
6060 | ret = add_excluded_extent(root, start, num_bytes); | 6148 | ret = add_excluded_extent(root, start, num_bytes); |
6061 | BUG_ON(ret); | 6149 | BUG_ON(ret); /* -ENOMEM */ |
6062 | } else if (start + num_bytes <= caching_ctl->progress) { | 6150 | } else if (start + num_bytes <= caching_ctl->progress) { |
6063 | ret = btrfs_remove_free_space(block_group, | 6151 | ret = btrfs_remove_free_space(block_group, |
6064 | start, num_bytes); | 6152 | start, num_bytes); |
6065 | BUG_ON(ret); | 6153 | BUG_ON(ret); /* -ENOMEM */ |
6066 | } else { | 6154 | } else { |
6067 | num_bytes = caching_ctl->progress - start; | 6155 | num_bytes = caching_ctl->progress - start; |
6068 | ret = btrfs_remove_free_space(block_group, | 6156 | ret = btrfs_remove_free_space(block_group, |
6069 | start, num_bytes); | 6157 | start, num_bytes); |
6070 | BUG_ON(ret); | 6158 | BUG_ON(ret); /* -ENOMEM */ |
6071 | 6159 | ||
6072 | start = caching_ctl->progress; | 6160 | start = caching_ctl->progress; |
6073 | num_bytes = ins->objectid + ins->offset - | 6161 | num_bytes = ins->objectid + ins->offset - |
6074 | caching_ctl->progress; | 6162 | caching_ctl->progress; |
6075 | ret = add_excluded_extent(root, start, num_bytes); | 6163 | ret = add_excluded_extent(root, start, num_bytes); |
6076 | BUG_ON(ret); | 6164 | BUG_ON(ret); /* -ENOMEM */ |
6077 | } | 6165 | } |
6078 | 6166 | ||
6079 | mutex_unlock(&caching_ctl->mutex); | 6167 | mutex_unlock(&caching_ctl->mutex); |
@@ -6082,7 +6170,7 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans, | |||
6082 | 6170 | ||
6083 | ret = btrfs_update_reserved_bytes(block_group, ins->offset, | 6171 | ret = btrfs_update_reserved_bytes(block_group, ins->offset, |
6084 | RESERVE_ALLOC_NO_ACCOUNT); | 6172 | RESERVE_ALLOC_NO_ACCOUNT); |
6085 | BUG_ON(ret); | 6173 | BUG_ON(ret); /* logic error */ |
6086 | btrfs_put_block_group(block_group); | 6174 | btrfs_put_block_group(block_group); |
6087 | ret = alloc_reserved_file_extent(trans, root, 0, root_objectid, | 6175 | ret = alloc_reserved_file_extent(trans, root, 0, root_objectid, |
6088 | 0, owner, offset, ins, 1); | 6176 | 0, owner, offset, ins, 1); |
@@ -6218,7 +6306,7 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans, | |||
6218 | 6306 | ||
6219 | buf = btrfs_init_new_buffer(trans, root, ins.objectid, | 6307 | buf = btrfs_init_new_buffer(trans, root, ins.objectid, |
6220 | blocksize, level); | 6308 | blocksize, level); |
6221 | BUG_ON(IS_ERR(buf)); | 6309 | BUG_ON(IS_ERR(buf)); /* -ENOMEM */ |
6222 | 6310 | ||
6223 | if (root_objectid == BTRFS_TREE_RELOC_OBJECTID) { | 6311 | if (root_objectid == BTRFS_TREE_RELOC_OBJECTID) { |
6224 | if (parent == 0) | 6312 | if (parent == 0) |
@@ -6230,7 +6318,7 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans, | |||
6230 | if (root_objectid != BTRFS_TREE_LOG_OBJECTID) { | 6318 | if (root_objectid != BTRFS_TREE_LOG_OBJECTID) { |
6231 | struct btrfs_delayed_extent_op *extent_op; | 6319 | struct btrfs_delayed_extent_op *extent_op; |
6232 | extent_op = kmalloc(sizeof(*extent_op), GFP_NOFS); | 6320 | extent_op = kmalloc(sizeof(*extent_op), GFP_NOFS); |
6233 | BUG_ON(!extent_op); | 6321 | BUG_ON(!extent_op); /* -ENOMEM */ |
6234 | if (key) | 6322 | if (key) |
6235 | memcpy(&extent_op->key, key, sizeof(extent_op->key)); | 6323 | memcpy(&extent_op->key, key, sizeof(extent_op->key)); |
6236 | else | 6324 | else |
@@ -6245,7 +6333,7 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans, | |||
6245 | ins.offset, parent, root_objectid, | 6333 | ins.offset, parent, root_objectid, |
6246 | level, BTRFS_ADD_DELAYED_EXTENT, | 6334 | level, BTRFS_ADD_DELAYED_EXTENT, |
6247 | extent_op, for_cow); | 6335 | extent_op, for_cow); |
6248 | BUG_ON(ret); | 6336 | BUG_ON(ret); /* -ENOMEM */ |
6249 | } | 6337 | } |
6250 | return buf; | 6338 | return buf; |
6251 | } | 6339 | } |
@@ -6315,7 +6403,9 @@ static noinline void reada_walk_down(struct btrfs_trans_handle *trans, | |||
6315 | /* We don't lock the tree block, it's OK to be racy here */ | 6403 | /* We don't lock the tree block, it's OK to be racy here */ |
6316 | ret = btrfs_lookup_extent_info(trans, root, bytenr, blocksize, | 6404 | ret = btrfs_lookup_extent_info(trans, root, bytenr, blocksize, |
6317 | &refs, &flags); | 6405 | &refs, &flags); |
6318 | BUG_ON(ret); | 6406 | /* We don't care about errors in readahead. */ |
6407 | if (ret < 0) | ||
6408 | continue; | ||
6319 | BUG_ON(refs == 0); | 6409 | BUG_ON(refs == 0); |
6320 | 6410 | ||
6321 | if (wc->stage == DROP_REFERENCE) { | 6411 | if (wc->stage == DROP_REFERENCE) { |
@@ -6382,7 +6472,9 @@ static noinline int walk_down_proc(struct btrfs_trans_handle *trans, | |||
6382 | eb->start, eb->len, | 6472 | eb->start, eb->len, |
6383 | &wc->refs[level], | 6473 | &wc->refs[level], |
6384 | &wc->flags[level]); | 6474 | &wc->flags[level]); |
6385 | BUG_ON(ret); | 6475 | BUG_ON(ret == -ENOMEM); |
6476 | if (ret) | ||
6477 | return ret; | ||
6386 | BUG_ON(wc->refs[level] == 0); | 6478 | BUG_ON(wc->refs[level] == 0); |
6387 | } | 6479 | } |
6388 | 6480 | ||
@@ -6401,12 +6493,12 @@ static noinline int walk_down_proc(struct btrfs_trans_handle *trans, | |||
6401 | if (!(wc->flags[level] & flag)) { | 6493 | if (!(wc->flags[level] & flag)) { |
6402 | BUG_ON(!path->locks[level]); | 6494 | BUG_ON(!path->locks[level]); |
6403 | ret = btrfs_inc_ref(trans, root, eb, 1, wc->for_reloc); | 6495 | ret = btrfs_inc_ref(trans, root, eb, 1, wc->for_reloc); |
6404 | BUG_ON(ret); | 6496 | BUG_ON(ret); /* -ENOMEM */ |
6405 | ret = btrfs_dec_ref(trans, root, eb, 0, wc->for_reloc); | 6497 | ret = btrfs_dec_ref(trans, root, eb, 0, wc->for_reloc); |
6406 | BUG_ON(ret); | 6498 | BUG_ON(ret); /* -ENOMEM */ |
6407 | ret = btrfs_set_disk_extent_flags(trans, root, eb->start, | 6499 | ret = btrfs_set_disk_extent_flags(trans, root, eb->start, |
6408 | eb->len, flag, 0); | 6500 | eb->len, flag, 0); |
6409 | BUG_ON(ret); | 6501 | BUG_ON(ret); /* -ENOMEM */ |
6410 | wc->flags[level] |= flag; | 6502 | wc->flags[level] |= flag; |
6411 | } | 6503 | } |
6412 | 6504 | ||
@@ -6478,7 +6570,11 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, | |||
6478 | ret = btrfs_lookup_extent_info(trans, root, bytenr, blocksize, | 6570 | ret = btrfs_lookup_extent_info(trans, root, bytenr, blocksize, |
6479 | &wc->refs[level - 1], | 6571 | &wc->refs[level - 1], |
6480 | &wc->flags[level - 1]); | 6572 | &wc->flags[level - 1]); |
6481 | BUG_ON(ret); | 6573 | if (ret < 0) { |
6574 | btrfs_tree_unlock(next); | ||
6575 | return ret; | ||
6576 | } | ||
6577 | |||
6482 | BUG_ON(wc->refs[level - 1] == 0); | 6578 | BUG_ON(wc->refs[level - 1] == 0); |
6483 | *lookup_info = 0; | 6579 | *lookup_info = 0; |
6484 | 6580 | ||
@@ -6547,7 +6643,7 @@ skip: | |||
6547 | 6643 | ||
6548 | ret = btrfs_free_extent(trans, root, bytenr, blocksize, parent, | 6644 | ret = btrfs_free_extent(trans, root, bytenr, blocksize, parent, |
6549 | root->root_key.objectid, level - 1, 0, 0); | 6645 | root->root_key.objectid, level - 1, 0, 0); |
6550 | BUG_ON(ret); | 6646 | BUG_ON(ret); /* -ENOMEM */ |
6551 | } | 6647 | } |
6552 | btrfs_tree_unlock(next); | 6648 | btrfs_tree_unlock(next); |
6553 | free_extent_buffer(next); | 6649 | free_extent_buffer(next); |
@@ -6605,7 +6701,10 @@ static noinline int walk_up_proc(struct btrfs_trans_handle *trans, | |||
6605 | eb->start, eb->len, | 6701 | eb->start, eb->len, |
6606 | &wc->refs[level], | 6702 | &wc->refs[level], |
6607 | &wc->flags[level]); | 6703 | &wc->flags[level]); |
6608 | BUG_ON(ret); | 6704 | if (ret < 0) { |
6705 | btrfs_tree_unlock_rw(eb, path->locks[level]); | ||
6706 | return ret; | ||
6707 | } | ||
6609 | BUG_ON(wc->refs[level] == 0); | 6708 | BUG_ON(wc->refs[level] == 0); |
6610 | if (wc->refs[level] == 1) { | 6709 | if (wc->refs[level] == 1) { |
6611 | btrfs_tree_unlock_rw(eb, path->locks[level]); | 6710 | btrfs_tree_unlock_rw(eb, path->locks[level]); |
@@ -6625,7 +6724,7 @@ static noinline int walk_up_proc(struct btrfs_trans_handle *trans, | |||
6625 | else | 6724 | else |
6626 | ret = btrfs_dec_ref(trans, root, eb, 0, | 6725 | ret = btrfs_dec_ref(trans, root, eb, 0, |
6627 | wc->for_reloc); | 6726 | wc->for_reloc); |
6628 | BUG_ON(ret); | 6727 | BUG_ON(ret); /* -ENOMEM */ |
6629 | } | 6728 | } |
6630 | /* make block locked assertion in clean_tree_block happy */ | 6729 | /* make block locked assertion in clean_tree_block happy */ |
6631 | if (!path->locks[level] && | 6730 | if (!path->locks[level] && |
@@ -6762,7 +6861,10 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | |||
6762 | } | 6861 | } |
6763 | 6862 | ||
6764 | trans = btrfs_start_transaction(tree_root, 0); | 6863 | trans = btrfs_start_transaction(tree_root, 0); |
6765 | BUG_ON(IS_ERR(trans)); | 6864 | if (IS_ERR(trans)) { |
6865 | err = PTR_ERR(trans); | ||
6866 | goto out_free; | ||
6867 | } | ||
6766 | 6868 | ||
6767 | if (block_rsv) | 6869 | if (block_rsv) |
6768 | trans->block_rsv = block_rsv; | 6870 | trans->block_rsv = block_rsv; |
@@ -6787,7 +6889,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | |||
6787 | path->lowest_level = 0; | 6889 | path->lowest_level = 0; |
6788 | if (ret < 0) { | 6890 | if (ret < 0) { |
6789 | err = ret; | 6891 | err = ret; |
6790 | goto out_free; | 6892 | goto out_end_trans; |
6791 | } | 6893 | } |
6792 | WARN_ON(ret > 0); | 6894 | WARN_ON(ret > 0); |
6793 | 6895 | ||
@@ -6807,7 +6909,10 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | |||
6807 | path->nodes[level]->len, | 6909 | path->nodes[level]->len, |
6808 | &wc->refs[level], | 6910 | &wc->refs[level], |
6809 | &wc->flags[level]); | 6911 | &wc->flags[level]); |
6810 | BUG_ON(ret); | 6912 | if (ret < 0) { |
6913 | err = ret; | ||
6914 | goto out_end_trans; | ||
6915 | } | ||
6811 | BUG_ON(wc->refs[level] == 0); | 6916 | BUG_ON(wc->refs[level] == 0); |
6812 | 6917 | ||
6813 | if (level == root_item->drop_level) | 6918 | if (level == root_item->drop_level) |
@@ -6858,26 +6963,40 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | |||
6858 | ret = btrfs_update_root(trans, tree_root, | 6963 | ret = btrfs_update_root(trans, tree_root, |
6859 | &root->root_key, | 6964 | &root->root_key, |
6860 | root_item); | 6965 | root_item); |
6861 | BUG_ON(ret); | 6966 | if (ret) { |
6967 | btrfs_abort_transaction(trans, tree_root, ret); | ||
6968 | err = ret; | ||
6969 | goto out_end_trans; | ||
6970 | } | ||
6862 | 6971 | ||
6863 | btrfs_end_transaction_throttle(trans, tree_root); | 6972 | btrfs_end_transaction_throttle(trans, tree_root); |
6864 | trans = btrfs_start_transaction(tree_root, 0); | 6973 | trans = btrfs_start_transaction(tree_root, 0); |
6865 | BUG_ON(IS_ERR(trans)); | 6974 | if (IS_ERR(trans)) { |
6975 | err = PTR_ERR(trans); | ||
6976 | goto out_free; | ||
6977 | } | ||
6866 | if (block_rsv) | 6978 | if (block_rsv) |
6867 | trans->block_rsv = block_rsv; | 6979 | trans->block_rsv = block_rsv; |
6868 | } | 6980 | } |
6869 | } | 6981 | } |
6870 | btrfs_release_path(path); | 6982 | btrfs_release_path(path); |
6871 | BUG_ON(err); | 6983 | if (err) |
6984 | goto out_end_trans; | ||
6872 | 6985 | ||
6873 | ret = btrfs_del_root(trans, tree_root, &root->root_key); | 6986 | ret = btrfs_del_root(trans, tree_root, &root->root_key); |
6874 | BUG_ON(ret); | 6987 | if (ret) { |
6988 | btrfs_abort_transaction(trans, tree_root, ret); | ||
6989 | goto out_end_trans; | ||
6990 | } | ||
6875 | 6991 | ||
6876 | if (root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID) { | 6992 | if (root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID) { |
6877 | ret = btrfs_find_last_root(tree_root, root->root_key.objectid, | 6993 | ret = btrfs_find_last_root(tree_root, root->root_key.objectid, |
6878 | NULL, NULL); | 6994 | NULL, NULL); |
6879 | BUG_ON(ret < 0); | 6995 | if (ret < 0) { |
6880 | if (ret > 0) { | 6996 | btrfs_abort_transaction(trans, tree_root, ret); |
6997 | err = ret; | ||
6998 | goto out_end_trans; | ||
6999 | } else if (ret > 0) { | ||
6881 | /* if we fail to delete the orphan item this time | 7000 | /* if we fail to delete the orphan item this time |
6882 | * around, it'll get picked up the next time. | 7001 | * around, it'll get picked up the next time. |
6883 | * | 7002 | * |
@@ -6895,8 +7014,9 @@ int btrfs_drop_snapshot(struct btrfs_root *root, | |||
6895 | free_extent_buffer(root->commit_root); | 7014 | free_extent_buffer(root->commit_root); |
6896 | kfree(root); | 7015 | kfree(root); |
6897 | } | 7016 | } |
6898 | out_free: | 7017 | out_end_trans: |
6899 | btrfs_end_transaction_throttle(trans, tree_root); | 7018 | btrfs_end_transaction_throttle(trans, tree_root); |
7019 | out_free: | ||
6900 | kfree(wc); | 7020 | kfree(wc); |
6901 | btrfs_free_path(path); | 7021 | btrfs_free_path(path); |
6902 | out: | 7022 | out: |
@@ -7099,12 +7219,16 @@ int btrfs_set_block_group_ro(struct btrfs_root *root, | |||
7099 | BUG_ON(cache->ro); | 7219 | BUG_ON(cache->ro); |
7100 | 7220 | ||
7101 | trans = btrfs_join_transaction(root); | 7221 | trans = btrfs_join_transaction(root); |
7102 | BUG_ON(IS_ERR(trans)); | 7222 | if (IS_ERR(trans)) |
7223 | return PTR_ERR(trans); | ||
7103 | 7224 | ||
7104 | alloc_flags = update_block_group_flags(root, cache->flags); | 7225 | alloc_flags = update_block_group_flags(root, cache->flags); |
7105 | if (alloc_flags != cache->flags) | 7226 | if (alloc_flags != cache->flags) { |
7106 | do_chunk_alloc(trans, root, 2 * 1024 * 1024, alloc_flags, | 7227 | ret = do_chunk_alloc(trans, root, 2 * 1024 * 1024, alloc_flags, |
7107 | CHUNK_ALLOC_FORCE); | 7228 | CHUNK_ALLOC_FORCE); |
7229 | if (ret < 0) | ||
7230 | goto out; | ||
7231 | } | ||
7108 | 7232 | ||
7109 | ret = set_block_group_ro(cache, 0); | 7233 | ret = set_block_group_ro(cache, 0); |
7110 | if (!ret) | 7234 | if (!ret) |
@@ -7567,7 +7691,7 @@ int btrfs_read_block_groups(struct btrfs_root *root) | |||
7567 | ret = update_space_info(info, cache->flags, found_key.offset, | 7691 | ret = update_space_info(info, cache->flags, found_key.offset, |
7568 | btrfs_block_group_used(&cache->item), | 7692 | btrfs_block_group_used(&cache->item), |
7569 | &space_info); | 7693 | &space_info); |
7570 | BUG_ON(ret); | 7694 | BUG_ON(ret); /* -ENOMEM */ |
7571 | cache->space_info = space_info; | 7695 | cache->space_info = space_info; |
7572 | spin_lock(&cache->space_info->lock); | 7696 | spin_lock(&cache->space_info->lock); |
7573 | cache->space_info->bytes_readonly += cache->bytes_super; | 7697 | cache->space_info->bytes_readonly += cache->bytes_super; |
@@ -7576,7 +7700,7 @@ int btrfs_read_block_groups(struct btrfs_root *root) | |||
7576 | __link_block_group(space_info, cache); | 7700 | __link_block_group(space_info, cache); |
7577 | 7701 | ||
7578 | ret = btrfs_add_block_group_cache(root->fs_info, cache); | 7702 | ret = btrfs_add_block_group_cache(root->fs_info, cache); |
7579 | BUG_ON(ret); | 7703 | BUG_ON(ret); /* Logic error */ |
7580 | 7704 | ||
7581 | set_avail_alloc_bits(root->fs_info, cache->flags); | 7705 | set_avail_alloc_bits(root->fs_info, cache->flags); |
7582 | if (btrfs_chunk_readonly(root, cache->key.objectid)) | 7706 | if (btrfs_chunk_readonly(root, cache->key.objectid)) |
@@ -7658,7 +7782,7 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans, | |||
7658 | 7782 | ||
7659 | ret = update_space_info(root->fs_info, cache->flags, size, bytes_used, | 7783 | ret = update_space_info(root->fs_info, cache->flags, size, bytes_used, |
7660 | &cache->space_info); | 7784 | &cache->space_info); |
7661 | BUG_ON(ret); | 7785 | BUG_ON(ret); /* -ENOMEM */ |
7662 | update_global_block_rsv(root->fs_info); | 7786 | update_global_block_rsv(root->fs_info); |
7663 | 7787 | ||
7664 | spin_lock(&cache->space_info->lock); | 7788 | spin_lock(&cache->space_info->lock); |
@@ -7668,11 +7792,14 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans, | |||
7668 | __link_block_group(cache->space_info, cache); | 7792 | __link_block_group(cache->space_info, cache); |
7669 | 7793 | ||
7670 | ret = btrfs_add_block_group_cache(root->fs_info, cache); | 7794 | ret = btrfs_add_block_group_cache(root->fs_info, cache); |
7671 | BUG_ON(ret); | 7795 | BUG_ON(ret); /* Logic error */ |
7672 | 7796 | ||
7673 | ret = btrfs_insert_item(trans, extent_root, &cache->key, &cache->item, | 7797 | ret = btrfs_insert_item(trans, extent_root, &cache->key, &cache->item, |
7674 | sizeof(cache->item)); | 7798 | sizeof(cache->item)); |
7675 | BUG_ON(ret); | 7799 | if (ret) { |
7800 | btrfs_abort_transaction(trans, extent_root, ret); | ||
7801 | return ret; | ||
7802 | } | ||
7676 | 7803 | ||
7677 | set_avail_alloc_bits(extent_root->fs_info, type); | 7804 | set_avail_alloc_bits(extent_root->fs_info, type); |
7678 | 7805 | ||
@@ -7753,7 +7880,10 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, | |||
7753 | inode = lookup_free_space_inode(tree_root, block_group, path); | 7880 | inode = lookup_free_space_inode(tree_root, block_group, path); |
7754 | if (!IS_ERR(inode)) { | 7881 | if (!IS_ERR(inode)) { |
7755 | ret = btrfs_orphan_add(trans, inode); | 7882 | ret = btrfs_orphan_add(trans, inode); |
7756 | BUG_ON(ret); | 7883 | if (ret) { |
7884 | btrfs_add_delayed_iput(inode); | ||
7885 | goto out; | ||
7886 | } | ||
7757 | clear_nlink(inode); | 7887 | clear_nlink(inode); |
7758 | /* One for the block groups ref */ | 7888 | /* One for the block groups ref */ |
7759 | spin_lock(&block_group->lock); | 7889 | spin_lock(&block_group->lock); |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index ffa7cc3370c7..4c3ce7a0a7a4 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -1244,7 +1244,7 @@ static int set_range_writeback(struct extent_io_tree *tree, u64 start, u64 end) | |||
1244 | 1244 | ||
1245 | while (index <= end_index) { | 1245 | while (index <= end_index) { |
1246 | page = find_get_page(tree->mapping, index); | 1246 | page = find_get_page(tree->mapping, index); |
1247 | BUG_ON(!page); | 1247 | BUG_ON(!page); /* Pages should be in the extent_io_tree */ |
1248 | set_page_writeback(page); | 1248 | set_page_writeback(page); |
1249 | page_cache_release(page); | 1249 | page_cache_release(page); |
1250 | index++; | 1250 | index++; |
@@ -1523,7 +1523,7 @@ again: | |||
1523 | goto out_failed; | 1523 | goto out_failed; |
1524 | } | 1524 | } |
1525 | } | 1525 | } |
1526 | BUG_ON(ret); | 1526 | BUG_ON(ret); /* Only valid values are 0 and -EAGAIN */ |
1527 | 1527 | ||
1528 | /* step three, lock the state bits for the whole range */ | 1528 | /* step three, lock the state bits for the whole range */ |
1529 | lock_extent_bits(tree, delalloc_start, delalloc_end, 0, &cached_state); | 1529 | lock_extent_bits(tree, delalloc_start, delalloc_end, 0, &cached_state); |
@@ -2200,7 +2200,6 @@ int end_extent_writepage(struct page *page, int err, u64 start, u64 end) | |||
2200 | /* Writeback already completed */ | 2200 | /* Writeback already completed */ |
2201 | if (ret == 0) | 2201 | if (ret == 0) |
2202 | return 1; | 2202 | return 1; |
2203 | BUG_ON(ret < 0); | ||
2204 | } | 2203 | } |
2205 | 2204 | ||
2206 | if (!uptodate) { | 2205 | if (!uptodate) { |
@@ -2353,7 +2352,6 @@ error_handled: | |||
2353 | if (ret == 0) | 2352 | if (ret == 0) |
2354 | goto error_handled; | 2353 | goto error_handled; |
2355 | } | 2354 | } |
2356 | BUG_ON(ret < 0); | ||
2357 | } | 2355 | } |
2358 | 2356 | ||
2359 | if (uptodate) { | 2357 | if (uptodate) { |
@@ -2405,6 +2403,10 @@ btrfs_bio_alloc(struct block_device *bdev, u64 first_sector, int nr_vecs, | |||
2405 | return bio; | 2403 | return bio; |
2406 | } | 2404 | } |
2407 | 2405 | ||
2406 | /* | ||
2407 | * Since writes are async, they will only return -ENOMEM. | ||
2408 | * Reads can return the full range of I/O error conditions. | ||
2409 | */ | ||
2408 | static int __must_check submit_one_bio(int rw, struct bio *bio, | 2410 | static int __must_check submit_one_bio(int rw, struct bio *bio, |
2409 | int mirror_num, unsigned long bio_flags) | 2411 | int mirror_num, unsigned long bio_flags) |
2410 | { | 2412 | { |
@@ -2477,7 +2479,8 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, | |||
2477 | bio_add_page(bio, page, page_size, offset) < page_size) { | 2479 | bio_add_page(bio, page, page_size, offset) < page_size) { |
2478 | ret = submit_one_bio(rw, bio, mirror_num, | 2480 | ret = submit_one_bio(rw, bio, mirror_num, |
2479 | prev_bio_flags); | 2481 | prev_bio_flags); |
2480 | BUG_ON(ret < 0); | 2482 | if (ret < 0) |
2483 | return ret; | ||
2481 | bio = NULL; | 2484 | bio = NULL; |
2482 | } else { | 2485 | } else { |
2483 | return 0; | 2486 | return 0; |
@@ -2498,10 +2501,8 @@ static int submit_extent_page(int rw, struct extent_io_tree *tree, | |||
2498 | 2501 | ||
2499 | if (bio_ret) | 2502 | if (bio_ret) |
2500 | *bio_ret = bio; | 2503 | *bio_ret = bio; |
2501 | else { | 2504 | else |
2502 | ret = submit_one_bio(rw, bio, mirror_num, bio_flags); | 2505 | ret = submit_one_bio(rw, bio, mirror_num, bio_flags); |
2503 | BUG_ON(ret < 0); | ||
2504 | } | ||
2505 | 2506 | ||
2506 | return ret; | 2507 | return ret; |
2507 | } | 2508 | } |
@@ -2525,6 +2526,7 @@ static void set_page_extent_head(struct page *page, unsigned long len) | |||
2525 | * basic readpage implementation. Locked extent state structs are inserted | 2526 | * basic readpage implementation. Locked extent state structs are inserted |
2526 | * into the tree that are removed when the IO is done (by the end_io | 2527 | * into the tree that are removed when the IO is done (by the end_io |
2527 | * handlers) | 2528 | * handlers) |
2529 | * XXX JDM: This needs looking at to ensure proper page locking | ||
2528 | */ | 2530 | */ |
2529 | static int __extent_read_full_page(struct extent_io_tree *tree, | 2531 | static int __extent_read_full_page(struct extent_io_tree *tree, |
2530 | struct page *page, | 2532 | struct page *page, |
@@ -2687,6 +2689,7 @@ static int __extent_read_full_page(struct extent_io_tree *tree, | |||
2687 | end_bio_extent_readpage, mirror_num, | 2689 | end_bio_extent_readpage, mirror_num, |
2688 | *bio_flags, | 2690 | *bio_flags, |
2689 | this_bio_flag); | 2691 | this_bio_flag); |
2692 | BUG_ON(ret == -ENOMEM); | ||
2690 | nr++; | 2693 | nr++; |
2691 | *bio_flags = this_bio_flag; | 2694 | *bio_flags = this_bio_flag; |
2692 | } | 2695 | } |
@@ -2713,10 +2716,8 @@ int extent_read_full_page(struct extent_io_tree *tree, struct page *page, | |||
2713 | 2716 | ||
2714 | ret = __extent_read_full_page(tree, page, get_extent, &bio, mirror_num, | 2717 | ret = __extent_read_full_page(tree, page, get_extent, &bio, mirror_num, |
2715 | &bio_flags); | 2718 | &bio_flags); |
2716 | if (bio) { | 2719 | if (bio) |
2717 | ret = submit_one_bio(READ, bio, mirror_num, bio_flags); | 2720 | ret = submit_one_bio(READ, bio, mirror_num, bio_flags); |
2718 | BUG_ON(ret < 0); | ||
2719 | } | ||
2720 | return ret; | 2721 | return ret; |
2721 | } | 2722 | } |
2722 | 2723 | ||
@@ -2830,7 +2831,11 @@ static int __extent_writepage(struct page *page, struct writeback_control *wbc, | |||
2830 | delalloc_end, | 2831 | delalloc_end, |
2831 | &page_started, | 2832 | &page_started, |
2832 | &nr_written); | 2833 | &nr_written); |
2833 | BUG_ON(ret); | 2834 | /* File system has been set read-only */ |
2835 | if (ret) { | ||
2836 | SetPageError(page); | ||
2837 | goto done; | ||
2838 | } | ||
2834 | /* | 2839 | /* |
2835 | * delalloc_end is already one less than the total | 2840 | * delalloc_end is already one less than the total |
2836 | * length, so we don't subtract one from | 2841 | * length, so we don't subtract one from |
@@ -3141,7 +3146,7 @@ static void flush_epd_write_bio(struct extent_page_data *epd) | |||
3141 | rw = WRITE_SYNC; | 3146 | rw = WRITE_SYNC; |
3142 | 3147 | ||
3143 | ret = submit_one_bio(rw, epd->bio, 0, 0); | 3148 | ret = submit_one_bio(rw, epd->bio, 0, 0); |
3144 | BUG_ON(ret < 0); | 3149 | BUG_ON(ret < 0); /* -ENOMEM */ |
3145 | epd->bio = NULL; | 3150 | epd->bio = NULL; |
3146 | } | 3151 | } |
3147 | } | 3152 | } |
@@ -3257,10 +3262,8 @@ int extent_readpages(struct extent_io_tree *tree, | |||
3257 | page_cache_release(page); | 3262 | page_cache_release(page); |
3258 | } | 3263 | } |
3259 | BUG_ON(!list_empty(pages)); | 3264 | BUG_ON(!list_empty(pages)); |
3260 | if (bio) { | 3265 | if (bio) |
3261 | int ret = submit_one_bio(READ, bio, 0, bio_flags); | 3266 | return submit_one_bio(READ, bio, 0, bio_flags); |
3262 | BUG_ON(ret < 0); | ||
3263 | } | ||
3264 | return 0; | 3267 | return 0; |
3265 | } | 3268 | } |
3266 | 3269 | ||
@@ -4090,7 +4093,8 @@ int read_extent_buffer_pages(struct extent_io_tree *tree, | |||
4090 | 4093 | ||
4091 | if (bio) { | 4094 | if (bio) { |
4092 | err = submit_one_bio(READ, bio, mirror_num, bio_flags); | 4095 | err = submit_one_bio(READ, bio, mirror_num, bio_flags); |
4093 | BUG_ON(err < 0); | 4096 | if (err) |
4097 | return err; | ||
4094 | } | 4098 | } |
4095 | 4099 | ||
4096 | if (ret || wait != WAIT_COMPLETE) | 4100 | if (ret || wait != WAIT_COMPLETE) |
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index 89af104c7569..a14dbca5974e 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c | |||
@@ -59,7 +59,7 @@ int btrfs_insert_file_extent(struct btrfs_trans_handle *trans, | |||
59 | sizeof(*item)); | 59 | sizeof(*item)); |
60 | if (ret < 0) | 60 | if (ret < 0) |
61 | goto out; | 61 | goto out; |
62 | BUG_ON(ret); | 62 | BUG_ON(ret); /* Can't happen */ |
63 | leaf = path->nodes[0]; | 63 | leaf = path->nodes[0]; |
64 | item = btrfs_item_ptr(leaf, path->slots[0], | 64 | item = btrfs_item_ptr(leaf, path->slots[0], |
65 | struct btrfs_file_extent_item); | 65 | struct btrfs_file_extent_item); |
@@ -431,7 +431,7 @@ int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode, | |||
431 | offset = page_offset(bvec->bv_page) + bvec->bv_offset; | 431 | offset = page_offset(bvec->bv_page) + bvec->bv_offset; |
432 | 432 | ||
433 | ordered = btrfs_lookup_ordered_extent(inode, offset); | 433 | ordered = btrfs_lookup_ordered_extent(inode, offset); |
434 | BUG_ON(!ordered); | 434 | BUG_ON(!ordered); /* Logic error */ |
435 | sums->bytenr = ordered->start; | 435 | sums->bytenr = ordered->start; |
436 | 436 | ||
437 | while (bio_index < bio->bi_vcnt) { | 437 | while (bio_index < bio->bi_vcnt) { |
@@ -450,11 +450,11 @@ int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode, | |||
450 | 450 | ||
451 | sums = kzalloc(btrfs_ordered_sum_size(root, bytes_left), | 451 | sums = kzalloc(btrfs_ordered_sum_size(root, bytes_left), |
452 | GFP_NOFS); | 452 | GFP_NOFS); |
453 | BUG_ON(!sums); | 453 | BUG_ON(!sums); /* -ENOMEM */ |
454 | sector_sum = sums->sums; | 454 | sector_sum = sums->sums; |
455 | sums->len = bytes_left; | 455 | sums->len = bytes_left; |
456 | ordered = btrfs_lookup_ordered_extent(inode, offset); | 456 | ordered = btrfs_lookup_ordered_extent(inode, offset); |
457 | BUG_ON(!ordered); | 457 | BUG_ON(!ordered); /* Logic error */ |
458 | sums->bytenr = ordered->start; | 458 | sums->bytenr = ordered->start; |
459 | } | 459 | } |
460 | 460 | ||
@@ -643,7 +643,10 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, | |||
643 | * item changed size or key | 643 | * item changed size or key |
644 | */ | 644 | */ |
645 | ret = btrfs_split_item(trans, root, path, &key, offset); | 645 | ret = btrfs_split_item(trans, root, path, &key, offset); |
646 | BUG_ON(ret && ret != -EAGAIN); | 646 | if (ret && ret != -EAGAIN) { |
647 | btrfs_abort_transaction(trans, root, ret); | ||
648 | goto out; | ||
649 | } | ||
647 | 650 | ||
648 | key.offset = end_byte - 1; | 651 | key.offset = end_byte - 1; |
649 | } else { | 652 | } else { |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 0eb80cc4ec81..d83260d7498f 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -452,7 +452,7 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
452 | split = alloc_extent_map(); | 452 | split = alloc_extent_map(); |
453 | if (!split2) | 453 | if (!split2) |
454 | split2 = alloc_extent_map(); | 454 | split2 = alloc_extent_map(); |
455 | BUG_ON(!split || !split2); | 455 | BUG_ON(!split || !split2); /* -ENOMEM */ |
456 | 456 | ||
457 | write_lock(&em_tree->lock); | 457 | write_lock(&em_tree->lock); |
458 | em = lookup_extent_mapping(em_tree, start, len); | 458 | em = lookup_extent_mapping(em_tree, start, len); |
@@ -494,7 +494,7 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
494 | split->flags = flags; | 494 | split->flags = flags; |
495 | split->compress_type = em->compress_type; | 495 | split->compress_type = em->compress_type; |
496 | ret = add_extent_mapping(em_tree, split); | 496 | ret = add_extent_mapping(em_tree, split); |
497 | BUG_ON(ret); | 497 | BUG_ON(ret); /* Logic error */ |
498 | free_extent_map(split); | 498 | free_extent_map(split); |
499 | split = split2; | 499 | split = split2; |
500 | split2 = NULL; | 500 | split2 = NULL; |
@@ -520,7 +520,7 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
520 | } | 520 | } |
521 | 521 | ||
522 | ret = add_extent_mapping(em_tree, split); | 522 | ret = add_extent_mapping(em_tree, split); |
523 | BUG_ON(ret); | 523 | BUG_ON(ret); /* Logic error */ |
524 | free_extent_map(split); | 524 | free_extent_map(split); |
525 | split = NULL; | 525 | split = NULL; |
526 | } | 526 | } |
@@ -679,7 +679,7 @@ next_slot: | |||
679 | root->root_key.objectid, | 679 | root->root_key.objectid, |
680 | new_key.objectid, | 680 | new_key.objectid, |
681 | start - extent_offset, 0); | 681 | start - extent_offset, 0); |
682 | BUG_ON(ret); | 682 | BUG_ON(ret); /* -ENOMEM */ |
683 | *hint_byte = disk_bytenr; | 683 | *hint_byte = disk_bytenr; |
684 | } | 684 | } |
685 | key.offset = start; | 685 | key.offset = start; |
@@ -754,7 +754,7 @@ next_slot: | |||
754 | root->root_key.objectid, | 754 | root->root_key.objectid, |
755 | key.objectid, key.offset - | 755 | key.objectid, key.offset - |
756 | extent_offset, 0); | 756 | extent_offset, 0); |
757 | BUG_ON(ret); | 757 | BUG_ON(ret); /* -ENOMEM */ |
758 | inode_sub_bytes(inode, | 758 | inode_sub_bytes(inode, |
759 | extent_end - key.offset); | 759 | extent_end - key.offset); |
760 | *hint_byte = disk_bytenr; | 760 | *hint_byte = disk_bytenr; |
@@ -770,7 +770,10 @@ next_slot: | |||
770 | 770 | ||
771 | ret = btrfs_del_items(trans, root, path, del_slot, | 771 | ret = btrfs_del_items(trans, root, path, del_slot, |
772 | del_nr); | 772 | del_nr); |
773 | BUG_ON(ret); | 773 | if (ret) { |
774 | btrfs_abort_transaction(trans, root, ret); | ||
775 | goto out; | ||
776 | } | ||
774 | 777 | ||
775 | del_nr = 0; | 778 | del_nr = 0; |
776 | del_slot = 0; | 779 | del_slot = 0; |
@@ -782,11 +785,13 @@ next_slot: | |||
782 | BUG_ON(1); | 785 | BUG_ON(1); |
783 | } | 786 | } |
784 | 787 | ||
785 | if (del_nr > 0) { | 788 | if (!ret && del_nr > 0) { |
786 | ret = btrfs_del_items(trans, root, path, del_slot, del_nr); | 789 | ret = btrfs_del_items(trans, root, path, del_slot, del_nr); |
787 | BUG_ON(ret); | 790 | if (ret) |
791 | btrfs_abort_transaction(trans, root, ret); | ||
788 | } | 792 | } |
789 | 793 | ||
794 | out: | ||
790 | btrfs_free_path(path); | 795 | btrfs_free_path(path); |
791 | return ret; | 796 | return ret; |
792 | } | 797 | } |
@@ -944,7 +949,10 @@ again: | |||
944 | btrfs_release_path(path); | 949 | btrfs_release_path(path); |
945 | goto again; | 950 | goto again; |
946 | } | 951 | } |
947 | BUG_ON(ret < 0); | 952 | if (ret < 0) { |
953 | btrfs_abort_transaction(trans, root, ret); | ||
954 | goto out; | ||
955 | } | ||
948 | 956 | ||
949 | leaf = path->nodes[0]; | 957 | leaf = path->nodes[0]; |
950 | fi = btrfs_item_ptr(leaf, path->slots[0] - 1, | 958 | fi = btrfs_item_ptr(leaf, path->slots[0] - 1, |
@@ -963,7 +971,7 @@ again: | |||
963 | ret = btrfs_inc_extent_ref(trans, root, bytenr, num_bytes, 0, | 971 | ret = btrfs_inc_extent_ref(trans, root, bytenr, num_bytes, 0, |
964 | root->root_key.objectid, | 972 | root->root_key.objectid, |
965 | ino, orig_offset, 0); | 973 | ino, orig_offset, 0); |
966 | BUG_ON(ret); | 974 | BUG_ON(ret); /* -ENOMEM */ |
967 | 975 | ||
968 | if (split == start) { | 976 | if (split == start) { |
969 | key.offset = start; | 977 | key.offset = start; |
@@ -990,7 +998,7 @@ again: | |||
990 | ret = btrfs_free_extent(trans, root, bytenr, num_bytes, | 998 | ret = btrfs_free_extent(trans, root, bytenr, num_bytes, |
991 | 0, root->root_key.objectid, | 999 | 0, root->root_key.objectid, |
992 | ino, orig_offset, 0); | 1000 | ino, orig_offset, 0); |
993 | BUG_ON(ret); | 1001 | BUG_ON(ret); /* -ENOMEM */ |
994 | } | 1002 | } |
995 | other_start = 0; | 1003 | other_start = 0; |
996 | other_end = start; | 1004 | other_end = start; |
@@ -1007,7 +1015,7 @@ again: | |||
1007 | ret = btrfs_free_extent(trans, root, bytenr, num_bytes, | 1015 | ret = btrfs_free_extent(trans, root, bytenr, num_bytes, |
1008 | 0, root->root_key.objectid, | 1016 | 0, root->root_key.objectid, |
1009 | ino, orig_offset, 0); | 1017 | ino, orig_offset, 0); |
1010 | BUG_ON(ret); | 1018 | BUG_ON(ret); /* -ENOMEM */ |
1011 | } | 1019 | } |
1012 | if (del_nr == 0) { | 1020 | if (del_nr == 0) { |
1013 | fi = btrfs_item_ptr(leaf, path->slots[0], | 1021 | fi = btrfs_item_ptr(leaf, path->slots[0], |
@@ -1025,7 +1033,10 @@ again: | |||
1025 | btrfs_mark_buffer_dirty(leaf); | 1033 | btrfs_mark_buffer_dirty(leaf); |
1026 | 1034 | ||
1027 | ret = btrfs_del_items(trans, root, path, del_slot, del_nr); | 1035 | ret = btrfs_del_items(trans, root, path, del_slot, del_nr); |
1028 | BUG_ON(ret); | 1036 | if (ret < 0) { |
1037 | btrfs_abort_transaction(trans, root, ret); | ||
1038 | goto out; | ||
1039 | } | ||
1029 | } | 1040 | } |
1030 | out: | 1041 | out: |
1031 | btrfs_free_path(path); | 1042 | btrfs_free_path(path); |
@@ -1666,7 +1677,13 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
1666 | 1677 | ||
1667 | em = btrfs_get_extent(inode, NULL, 0, cur_offset, | 1678 | em = btrfs_get_extent(inode, NULL, 0, cur_offset, |
1668 | alloc_end - cur_offset, 0); | 1679 | alloc_end - cur_offset, 0); |
1669 | BUG_ON(IS_ERR_OR_NULL(em)); | 1680 | if (IS_ERR_OR_NULL(em)) { |
1681 | if (!em) | ||
1682 | ret = -ENOMEM; | ||
1683 | else | ||
1684 | ret = PTR_ERR(em); | ||
1685 | break; | ||
1686 | } | ||
1670 | last_byte = min(extent_map_end(em), alloc_end); | 1687 | last_byte = min(extent_map_end(em), alloc_end); |
1671 | actual_end = min_t(u64, extent_map_end(em), offset + len); | 1688 | actual_end = min_t(u64, extent_map_end(em), offset + len); |
1672 | last_byte = (last_byte + mask) & ~mask; | 1689 | last_byte = (last_byte + mask) & ~mask; |
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index ecbcc8711a03..054707ed5791 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c | |||
@@ -230,11 +230,13 @@ int btrfs_truncate_free_space_cache(struct btrfs_root *root, | |||
230 | 230 | ||
231 | if (ret) { | 231 | if (ret) { |
232 | trans->block_rsv = rsv; | 232 | trans->block_rsv = rsv; |
233 | WARN_ON(1); | 233 | btrfs_abort_transaction(trans, root, ret); |
234 | return ret; | 234 | return ret; |
235 | } | 235 | } |
236 | 236 | ||
237 | ret = btrfs_update_inode(trans, root, inode); | 237 | ret = btrfs_update_inode(trans, root, inode); |
238 | if (ret) | ||
239 | btrfs_abort_transaction(trans, root, ret); | ||
238 | trans->block_rsv = rsv; | 240 | trans->block_rsv = rsv; |
239 | 241 | ||
240 | return ret; | 242 | return ret; |
@@ -1948,14 +1950,14 @@ again: | |||
1948 | */ | 1950 | */ |
1949 | ret = btrfs_add_free_space(block_group, old_start, | 1951 | ret = btrfs_add_free_space(block_group, old_start, |
1950 | offset - old_start); | 1952 | offset - old_start); |
1951 | WARN_ON(ret); | 1953 | WARN_ON(ret); /* -ENOMEM */ |
1952 | goto out; | 1954 | goto out; |
1953 | } | 1955 | } |
1954 | 1956 | ||
1955 | ret = remove_from_bitmap(ctl, info, &offset, &bytes); | 1957 | ret = remove_from_bitmap(ctl, info, &offset, &bytes); |
1956 | if (ret == -EAGAIN) | 1958 | if (ret == -EAGAIN) |
1957 | goto again; | 1959 | goto again; |
1958 | BUG_ON(ret); | 1960 | BUG_ON(ret); /* logic error */ |
1959 | out_lock: | 1961 | out_lock: |
1960 | spin_unlock(&ctl->tree_lock); | 1962 | spin_unlock(&ctl->tree_lock); |
1961 | out: | 1963 | out: |
@@ -2346,7 +2348,7 @@ again: | |||
2346 | rb_erase(&entry->offset_index, &ctl->free_space_offset); | 2348 | rb_erase(&entry->offset_index, &ctl->free_space_offset); |
2347 | ret = tree_insert_offset(&cluster->root, entry->offset, | 2349 | ret = tree_insert_offset(&cluster->root, entry->offset, |
2348 | &entry->offset_index, 1); | 2350 | &entry->offset_index, 1); |
2349 | BUG_ON(ret); | 2351 | BUG_ON(ret); /* -EEXIST; Logic error */ |
2350 | 2352 | ||
2351 | trace_btrfs_setup_cluster(block_group, cluster, | 2353 | trace_btrfs_setup_cluster(block_group, cluster, |
2352 | total_found * block_group->sectorsize, 1); | 2354 | total_found * block_group->sectorsize, 1); |
@@ -2439,7 +2441,7 @@ setup_cluster_no_bitmap(struct btrfs_block_group_cache *block_group, | |||
2439 | ret = tree_insert_offset(&cluster->root, entry->offset, | 2441 | ret = tree_insert_offset(&cluster->root, entry->offset, |
2440 | &entry->offset_index, 0); | 2442 | &entry->offset_index, 0); |
2441 | total_size += entry->bytes; | 2443 | total_size += entry->bytes; |
2442 | BUG_ON(ret); | 2444 | BUG_ON(ret); /* -EEXIST; Logic error */ |
2443 | } while (node && entry != last); | 2445 | } while (node && entry != last); |
2444 | 2446 | ||
2445 | cluster->max_size = max_extent; | 2447 | cluster->max_size = max_extent; |
@@ -2830,6 +2832,7 @@ u64 btrfs_find_ino_for_alloc(struct btrfs_root *fs_root) | |||
2830 | int ret; | 2832 | int ret; |
2831 | 2833 | ||
2832 | ret = search_bitmap(ctl, entry, &offset, &count); | 2834 | ret = search_bitmap(ctl, entry, &offset, &count); |
2835 | /* Logic error; Should be empty if it can't find anything */ | ||
2833 | BUG_ON(ret); | 2836 | BUG_ON(ret); |
2834 | 2837 | ||
2835 | ino = offset; | 2838 | ino = offset; |
diff --git a/fs/btrfs/inode-item.c b/fs/btrfs/inode-item.c index c0792409bb6a..7ec58bd7c50d 100644 --- a/fs/btrfs/inode-item.c +++ b/fs/btrfs/inode-item.c | |||
@@ -135,6 +135,7 @@ out: | |||
135 | return ret; | 135 | return ret; |
136 | } | 136 | } |
137 | 137 | ||
138 | /* Will return 0, -ENOMEM, -EMLINK, or -EEXIST or anything from the CoW path */ | ||
138 | int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans, | 139 | int btrfs_insert_inode_ref(struct btrfs_trans_handle *trans, |
139 | struct btrfs_root *root, | 140 | struct btrfs_root *root, |
140 | const char *name, int name_len, | 141 | const char *name, int name_len, |
diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c index ee15d88b33d2..7ca46e6e11ae 100644 --- a/fs/btrfs/inode-map.c +++ b/fs/btrfs/inode-map.c | |||
@@ -178,7 +178,7 @@ static void start_caching(struct btrfs_root *root) | |||
178 | 178 | ||
179 | tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu\n", | 179 | tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu\n", |
180 | root->root_key.objectid); | 180 | root->root_key.objectid); |
181 | BUG_ON(IS_ERR(tsk)); | 181 | BUG_ON(IS_ERR(tsk)); /* -ENOMEM */ |
182 | } | 182 | } |
183 | 183 | ||
184 | int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) | 184 | int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) |
@@ -271,7 +271,7 @@ void btrfs_unpin_free_ino(struct btrfs_root *root) | |||
271 | break; | 271 | break; |
272 | 272 | ||
273 | info = rb_entry(n, struct btrfs_free_space, offset_index); | 273 | info = rb_entry(n, struct btrfs_free_space, offset_index); |
274 | BUG_ON(info->bitmap); | 274 | BUG_ON(info->bitmap); /* Logic error */ |
275 | 275 | ||
276 | if (info->offset > root->cache_progress) | 276 | if (info->offset > root->cache_progress) |
277 | goto free; | 277 | goto free; |
@@ -443,13 +443,13 @@ int btrfs_save_ino_cache(struct btrfs_root *root, | |||
443 | trans->bytes_reserved, 1); | 443 | trans->bytes_reserved, 1); |
444 | again: | 444 | again: |
445 | inode = lookup_free_ino_inode(root, path); | 445 | inode = lookup_free_ino_inode(root, path); |
446 | if (IS_ERR(inode) && PTR_ERR(inode) != -ENOENT) { | 446 | if (IS_ERR(inode) && (PTR_ERR(inode) != -ENOENT || retry)) { |
447 | ret = PTR_ERR(inode); | 447 | ret = PTR_ERR(inode); |
448 | goto out_release; | 448 | goto out_release; |
449 | } | 449 | } |
450 | 450 | ||
451 | if (IS_ERR(inode)) { | 451 | if (IS_ERR(inode)) { |
452 | BUG_ON(retry); | 452 | BUG_ON(retry); /* Logic error */ |
453 | retry = true; | 453 | retry = true; |
454 | 454 | ||
455 | ret = create_free_ino_inode(root, trans, path); | 455 | ret = create_free_ino_inode(root, trans, path); |
@@ -460,12 +460,17 @@ again: | |||
460 | 460 | ||
461 | BTRFS_I(inode)->generation = 0; | 461 | BTRFS_I(inode)->generation = 0; |
462 | ret = btrfs_update_inode(trans, root, inode); | 462 | ret = btrfs_update_inode(trans, root, inode); |
463 | WARN_ON(ret); | 463 | if (ret) { |
464 | btrfs_abort_transaction(trans, root, ret); | ||
465 | goto out_put; | ||
466 | } | ||
464 | 467 | ||
465 | if (i_size_read(inode) > 0) { | 468 | if (i_size_read(inode) > 0) { |
466 | ret = btrfs_truncate_free_space_cache(root, trans, path, inode); | 469 | ret = btrfs_truncate_free_space_cache(root, trans, path, inode); |
467 | if (ret) | 470 | if (ret) { |
471 | btrfs_abort_transaction(trans, root, ret); | ||
468 | goto out_put; | 472 | goto out_put; |
473 | } | ||
469 | } | 474 | } |
470 | 475 | ||
471 | spin_lock(&root->cache_lock); | 476 | spin_lock(&root->cache_lock); |
@@ -532,7 +537,7 @@ static int btrfs_find_highest_objectid(struct btrfs_root *root, u64 *objectid) | |||
532 | ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0); | 537 | ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0); |
533 | if (ret < 0) | 538 | if (ret < 0) |
534 | goto error; | 539 | goto error; |
535 | BUG_ON(ret == 0); | 540 | BUG_ON(ret == 0); /* Corruption */ |
536 | if (path->slots[0] > 0) { | 541 | if (path->slots[0] > 0) { |
537 | slot = path->slots[0] - 1; | 542 | slot = path->slots[0] - 1; |
538 | l = path->nodes[0]; | 543 | l = path->nodes[0]; |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 41132339e2ea..d6420cca9c8d 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; |
212 | fail: | 211 | fail: |
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: | |||
433 | cont: | 436 | cont: |
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 | ||
549 | out: | 556 | out: |
550 | return 0; | 557 | return ret; |
551 | 558 | ||
552 | free_pages_out: | 559 | free_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 | |||
568 | cleanup_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; | 754 | out: |
755 | return ret; | ||
756 | out_free: | ||
757 | kfree(async_extent); | ||
758 | goto out; | ||
725 | } | 759 | } |
726 | 760 | ||
727 | static u64 get_extent_allocation_hint(struct inode *inode, u64 start, | 761 | static 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 | } |
901 | out: | ||
902 | ret = 0; | 954 | ret = 0; |
955 | out: | ||
903 | btrfs_end_transaction(trans, root); | 956 | btrfs_end_transaction(trans, root); |
904 | 957 | ||
905 | return ret; | 958 | return ret; |
959 | out_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 | ||
1337 | error: | ||
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); | 1801 | out: |
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; |
1813 | out: | 1911 | out: |
@@ -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; |
1927 | out_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 | ||
1831 | static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, | 1934 | static 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? */ | ||
1910 | void btrfs_add_delayed_iput(struct inode *inode) | 2015 | void 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); | |
3095 | out: | ||
2955 | btrfs_free_path(path); | 3096 | btrfs_free_path(path); |
2956 | return 0; | 3097 | return ret; |
2957 | } | 3098 | } |
2958 | 3099 | ||
2959 | static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) | 3100 | static 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 | } |
3376 | error: | ||
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 | ||
4598 | fail_dir_item: | 4756 | fail_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); |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index de25e4255aeb..205809200714 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -425,13 +425,18 @@ static noinline int create_subvol(struct btrfs_root *root, | |||
425 | 425 | ||
426 | key.offset = (u64)-1; | 426 | key.offset = (u64)-1; |
427 | new_root = btrfs_read_fs_root_no_name(root->fs_info, &key); | 427 | new_root = btrfs_read_fs_root_no_name(root->fs_info, &key); |
428 | BUG_ON(IS_ERR(new_root)); | 428 | if (IS_ERR(new_root)) { |
429 | btrfs_abort_transaction(trans, root, PTR_ERR(new_root)); | ||
430 | ret = PTR_ERR(new_root); | ||
431 | goto fail; | ||
432 | } | ||
429 | 433 | ||
430 | btrfs_record_root_in_trans(trans, new_root); | 434 | btrfs_record_root_in_trans(trans, new_root); |
431 | 435 | ||
432 | ret = btrfs_create_subvol_root(trans, new_root, new_dirid); | 436 | ret = btrfs_create_subvol_root(trans, new_root, new_dirid); |
433 | if (ret) { | 437 | if (ret) { |
434 | /* We potentially lose an unused inode item here */ | 438 | /* We potentially lose an unused inode item here */ |
439 | btrfs_abort_transaction(trans, root, ret); | ||
435 | goto fail; | 440 | goto fail; |
436 | } | 441 | } |
437 | 442 | ||
@@ -439,13 +444,18 @@ static noinline int create_subvol(struct btrfs_root *root, | |||
439 | * insert the directory item | 444 | * insert the directory item |
440 | */ | 445 | */ |
441 | ret = btrfs_set_inode_index(dir, &index); | 446 | ret = btrfs_set_inode_index(dir, &index); |
442 | BUG_ON(ret); | 447 | if (ret) { |
448 | btrfs_abort_transaction(trans, root, ret); | ||
449 | goto fail; | ||
450 | } | ||
443 | 451 | ||
444 | ret = btrfs_insert_dir_item(trans, root, | 452 | ret = btrfs_insert_dir_item(trans, root, |
445 | name, namelen, dir, &key, | 453 | name, namelen, dir, &key, |
446 | BTRFS_FT_DIR, index); | 454 | BTRFS_FT_DIR, index); |
447 | if (ret) | 455 | if (ret) { |
456 | btrfs_abort_transaction(trans, root, ret); | ||
448 | goto fail; | 457 | goto fail; |
458 | } | ||
449 | 459 | ||
450 | btrfs_i_size_write(dir, dir->i_size + namelen * 2); | 460 | btrfs_i_size_write(dir, dir->i_size + namelen * 2); |
451 | ret = btrfs_update_inode(trans, root, dir); | 461 | ret = btrfs_update_inode(trans, root, dir); |
@@ -1970,7 +1980,11 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file, | |||
1970 | dest->root_key.objectid, | 1980 | dest->root_key.objectid, |
1971 | dentry->d_name.name, | 1981 | dentry->d_name.name, |
1972 | dentry->d_name.len); | 1982 | dentry->d_name.len); |
1973 | BUG_ON(ret); | 1983 | if (ret) { |
1984 | err = ret; | ||
1985 | btrfs_abort_transaction(trans, root, ret); | ||
1986 | goto out_end_trans; | ||
1987 | } | ||
1974 | 1988 | ||
1975 | btrfs_record_root_in_trans(trans, dest); | 1989 | btrfs_record_root_in_trans(trans, dest); |
1976 | 1990 | ||
@@ -1983,11 +1997,16 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file, | |||
1983 | ret = btrfs_insert_orphan_item(trans, | 1997 | ret = btrfs_insert_orphan_item(trans, |
1984 | root->fs_info->tree_root, | 1998 | root->fs_info->tree_root, |
1985 | dest->root_key.objectid); | 1999 | dest->root_key.objectid); |
1986 | BUG_ON(ret); | 2000 | if (ret) { |
2001 | btrfs_abort_transaction(trans, root, ret); | ||
2002 | err = ret; | ||
2003 | goto out_end_trans; | ||
2004 | } | ||
1987 | } | 2005 | } |
1988 | 2006 | out_end_trans: | |
1989 | ret = btrfs_end_transaction(trans, root); | 2007 | ret = btrfs_end_transaction(trans, root); |
1990 | BUG_ON(ret); | 2008 | if (ret && !err) |
2009 | err = ret; | ||
1991 | inode->i_flags |= S_DEAD; | 2010 | inode->i_flags |= S_DEAD; |
1992 | out_up_write: | 2011 | out_up_write: |
1993 | up_write(&root->fs_info->subvol_sem); | 2012 | up_write(&root->fs_info->subvol_sem); |
@@ -2451,11 +2470,21 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | |||
2451 | new_key.offset, | 2470 | new_key.offset, |
2452 | new_key.offset + datal, | 2471 | new_key.offset + datal, |
2453 | &hint_byte, 1); | 2472 | &hint_byte, 1); |
2454 | BUG_ON(ret); | 2473 | if (ret) { |
2474 | btrfs_abort_transaction(trans, root, | ||
2475 | ret); | ||
2476 | btrfs_end_transaction(trans, root); | ||
2477 | goto out; | ||
2478 | } | ||
2455 | 2479 | ||
2456 | ret = btrfs_insert_empty_item(trans, root, path, | 2480 | ret = btrfs_insert_empty_item(trans, root, path, |
2457 | &new_key, size); | 2481 | &new_key, size); |
2458 | BUG_ON(ret); | 2482 | if (ret) { |
2483 | btrfs_abort_transaction(trans, root, | ||
2484 | ret); | ||
2485 | btrfs_end_transaction(trans, root); | ||
2486 | goto out; | ||
2487 | } | ||
2459 | 2488 | ||
2460 | leaf = path->nodes[0]; | 2489 | leaf = path->nodes[0]; |
2461 | slot = path->slots[0]; | 2490 | slot = path->slots[0]; |
@@ -2482,7 +2511,15 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | |||
2482 | btrfs_ino(inode), | 2511 | btrfs_ino(inode), |
2483 | new_key.offset - datao, | 2512 | new_key.offset - datao, |
2484 | 0); | 2513 | 0); |
2485 | BUG_ON(ret); | 2514 | if (ret) { |
2515 | btrfs_abort_transaction(trans, | ||
2516 | root, | ||
2517 | ret); | ||
2518 | btrfs_end_transaction(trans, | ||
2519 | root); | ||
2520 | goto out; | ||
2521 | |||
2522 | } | ||
2486 | } | 2523 | } |
2487 | } else if (type == BTRFS_FILE_EXTENT_INLINE) { | 2524 | } else if (type == BTRFS_FILE_EXTENT_INLINE) { |
2488 | u64 skip = 0; | 2525 | u64 skip = 0; |
@@ -2507,11 +2544,21 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | |||
2507 | new_key.offset, | 2544 | new_key.offset, |
2508 | new_key.offset + datal, | 2545 | new_key.offset + datal, |
2509 | &hint_byte, 1); | 2546 | &hint_byte, 1); |
2510 | BUG_ON(ret); | 2547 | if (ret) { |
2548 | btrfs_abort_transaction(trans, root, | ||
2549 | ret); | ||
2550 | btrfs_end_transaction(trans, root); | ||
2551 | goto out; | ||
2552 | } | ||
2511 | 2553 | ||
2512 | ret = btrfs_insert_empty_item(trans, root, path, | 2554 | ret = btrfs_insert_empty_item(trans, root, path, |
2513 | &new_key, size); | 2555 | &new_key, size); |
2514 | BUG_ON(ret); | 2556 | if (ret) { |
2557 | btrfs_abort_transaction(trans, root, | ||
2558 | ret); | ||
2559 | btrfs_end_transaction(trans, root); | ||
2560 | goto out; | ||
2561 | } | ||
2515 | 2562 | ||
2516 | if (skip) { | 2563 | if (skip) { |
2517 | u32 start = | 2564 | u32 start = |
@@ -2545,8 +2592,12 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | |||
2545 | btrfs_i_size_write(inode, endoff); | 2592 | btrfs_i_size_write(inode, endoff); |
2546 | 2593 | ||
2547 | ret = btrfs_update_inode(trans, root, inode); | 2594 | ret = btrfs_update_inode(trans, root, inode); |
2548 | BUG_ON(ret); | 2595 | if (ret) { |
2549 | btrfs_end_transaction(trans, root); | 2596 | btrfs_abort_transaction(trans, root, ret); |
2597 | btrfs_end_transaction(trans, root); | ||
2598 | goto out; | ||
2599 | } | ||
2600 | ret = btrfs_end_transaction(trans, root); | ||
2550 | } | 2601 | } |
2551 | next: | 2602 | next: |
2552 | btrfs_release_path(path); | 2603 | btrfs_release_path(path); |
diff --git a/fs/btrfs/orphan.c b/fs/btrfs/orphan.c index f8be250963a0..24cad1695af7 100644 --- a/fs/btrfs/orphan.c +++ b/fs/btrfs/orphan.c | |||
@@ -58,7 +58,7 @@ int btrfs_del_orphan_item(struct btrfs_trans_handle *trans, | |||
58 | ret = btrfs_search_slot(trans, root, &key, path, -1, 1); | 58 | ret = btrfs_search_slot(trans, root, &key, path, -1, 1); |
59 | if (ret < 0) | 59 | if (ret < 0) |
60 | goto out; | 60 | goto out; |
61 | if (ret) { | 61 | if (ret) { /* JDM: Really? */ |
62 | ret = -ENOENT; | 62 | ret = -ENOENT; |
63 | goto out; | 63 | goto out; |
64 | } | 64 | } |
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index cba7a0bf3667..017281dbb2a7 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
@@ -4102,10 +4102,11 @@ out: | |||
4102 | static noinline_for_stack int mark_garbage_root(struct btrfs_root *root) | 4102 | static noinline_for_stack int mark_garbage_root(struct btrfs_root *root) |
4103 | { | 4103 | { |
4104 | struct btrfs_trans_handle *trans; | 4104 | struct btrfs_trans_handle *trans; |
4105 | int ret; | 4105 | int ret, err; |
4106 | 4106 | ||
4107 | trans = btrfs_start_transaction(root->fs_info->tree_root, 0); | 4107 | trans = btrfs_start_transaction(root->fs_info->tree_root, 0); |
4108 | BUG_ON(IS_ERR(trans)); | 4108 | if (IS_ERR(trans)) |
4109 | return PTR_ERR(trans); | ||
4109 | 4110 | ||
4110 | memset(&root->root_item.drop_progress, 0, | 4111 | memset(&root->root_item.drop_progress, 0, |
4111 | sizeof(root->root_item.drop_progress)); | 4112 | sizeof(root->root_item.drop_progress)); |
@@ -4113,11 +4114,11 @@ static noinline_for_stack int mark_garbage_root(struct btrfs_root *root) | |||
4113 | btrfs_set_root_refs(&root->root_item, 0); | 4114 | btrfs_set_root_refs(&root->root_item, 0); |
4114 | ret = btrfs_update_root(trans, root->fs_info->tree_root, | 4115 | ret = btrfs_update_root(trans, root->fs_info->tree_root, |
4115 | &root->root_key, &root->root_item); | 4116 | &root->root_key, &root->root_item); |
4116 | BUG_ON(ret); | ||
4117 | 4117 | ||
4118 | ret = btrfs_end_transaction(trans, root->fs_info->tree_root); | 4118 | err = btrfs_end_transaction(trans, root->fs_info->tree_root); |
4119 | BUG_ON(ret); | 4119 | if (err) |
4120 | return 0; | 4120 | return err; |
4121 | return ret; | ||
4121 | } | 4122 | } |
4122 | 4123 | ||
4123 | /* | 4124 | /* |
@@ -4185,7 +4186,11 @@ int btrfs_recover_relocation(struct btrfs_root *root) | |||
4185 | err = ret; | 4186 | err = ret; |
4186 | goto out; | 4187 | goto out; |
4187 | } | 4188 | } |
4188 | mark_garbage_root(reloc_root); | 4189 | ret = mark_garbage_root(reloc_root); |
4190 | if (ret < 0) { | ||
4191 | err = ret; | ||
4192 | goto out; | ||
4193 | } | ||
4189 | } | 4194 | } |
4190 | } | 4195 | } |
4191 | 4196 | ||
@@ -4231,14 +4236,19 @@ int btrfs_recover_relocation(struct btrfs_root *root) | |||
4231 | 4236 | ||
4232 | fs_root = read_fs_root(root->fs_info, | 4237 | fs_root = read_fs_root(root->fs_info, |
4233 | reloc_root->root_key.offset); | 4238 | reloc_root->root_key.offset); |
4234 | BUG_ON(IS_ERR(fs_root)); | 4239 | if (IS_ERR(fs_root)) { |
4240 | err = PTR_ERR(fs_root); | ||
4241 | goto out_free; | ||
4242 | } | ||
4235 | 4243 | ||
4236 | err = __add_reloc_root(reloc_root); | 4244 | err = __add_reloc_root(reloc_root); |
4237 | BUG_ON(err < 0); | 4245 | BUG_ON(err < 0); /* -ENOMEM or logic error */ |
4238 | fs_root->reloc_root = reloc_root; | 4246 | fs_root->reloc_root = reloc_root; |
4239 | } | 4247 | } |
4240 | 4248 | ||
4241 | btrfs_commit_transaction(trans, rc->extent_root); | 4249 | err = btrfs_commit_transaction(trans, rc->extent_root); |
4250 | if (err) | ||
4251 | goto out_free; | ||
4242 | 4252 | ||
4243 | merge_reloc_roots(rc); | 4253 | merge_reloc_roots(rc); |
4244 | 4254 | ||
@@ -4248,7 +4258,7 @@ int btrfs_recover_relocation(struct btrfs_root *root) | |||
4248 | if (IS_ERR(trans)) | 4258 | if (IS_ERR(trans)) |
4249 | err = PTR_ERR(trans); | 4259 | err = PTR_ERR(trans); |
4250 | else | 4260 | else |
4251 | btrfs_commit_transaction(trans, rc->extent_root); | 4261 | err = btrfs_commit_transaction(trans, rc->extent_root); |
4252 | out_free: | 4262 | out_free: |
4253 | kfree(rc); | 4263 | kfree(rc); |
4254 | out: | 4264 | out: |
@@ -4297,6 +4307,8 @@ int btrfs_reloc_clone_csums(struct inode *inode, u64 file_pos, u64 len) | |||
4297 | disk_bytenr = file_pos + BTRFS_I(inode)->index_cnt; | 4307 | disk_bytenr = file_pos + BTRFS_I(inode)->index_cnt; |
4298 | ret = btrfs_lookup_csums_range(root->fs_info->csum_root, disk_bytenr, | 4308 | ret = btrfs_lookup_csums_range(root->fs_info->csum_root, disk_bytenr, |
4299 | disk_bytenr + len - 1, &list, 0); | 4309 | disk_bytenr + len - 1, &list, 0); |
4310 | if (ret) | ||
4311 | goto out; | ||
4300 | 4312 | ||
4301 | while (!list_empty(&list)) { | 4313 | while (!list_empty(&list)) { |
4302 | sums = list_entry(list.next, struct btrfs_ordered_sum, list); | 4314 | sums = list_entry(list.next, struct btrfs_ordered_sum, list); |
@@ -4314,6 +4326,7 @@ int btrfs_reloc_clone_csums(struct inode *inode, u64 file_pos, u64 len) | |||
4314 | 4326 | ||
4315 | btrfs_add_ordered_sum(inode, ordered, sums); | 4327 | btrfs_add_ordered_sum(inode, ordered, sums); |
4316 | } | 4328 | } |
4329 | out: | ||
4317 | btrfs_put_ordered_extent(ordered); | 4330 | btrfs_put_ordered_extent(ordered); |
4318 | return ret; | 4331 | return ret; |
4319 | } | 4332 | } |
diff --git a/fs/btrfs/root-tree.c b/fs/btrfs/root-tree.c index 1486cf9de1da..24fb8ce4e071 100644 --- a/fs/btrfs/root-tree.c +++ b/fs/btrfs/root-tree.c | |||
@@ -97,8 +97,10 @@ int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root | |||
97 | return -ENOMEM; | 97 | return -ENOMEM; |
98 | 98 | ||
99 | ret = btrfs_search_slot(trans, root, key, path, 0, 1); | 99 | ret = btrfs_search_slot(trans, root, key, path, 0, 1); |
100 | if (ret < 0) | 100 | if (ret < 0) { |
101 | btrfs_abort_transaction(trans, root, ret); | ||
101 | goto out; | 102 | goto out; |
103 | } | ||
102 | 104 | ||
103 | if (ret != 0) { | 105 | if (ret != 0) { |
104 | btrfs_print_leaf(root, path->nodes[0]); | 106 | btrfs_print_leaf(root, path->nodes[0]); |
@@ -383,6 +385,8 @@ int btrfs_find_root_ref(struct btrfs_root *tree_root, | |||
383 | * | 385 | * |
384 | * For a back ref the root_id is the id of the subvol or snapshot and | 386 | * For a back ref the root_id is the id of the subvol or snapshot and |
385 | * ref_id is the id of the tree referencing it. | 387 | * ref_id is the id of the tree referencing it. |
388 | * | ||
389 | * Will return 0, -ENOMEM, or anything from the CoW path | ||
386 | */ | 390 | */ |
387 | int btrfs_add_root_ref(struct btrfs_trans_handle *trans, | 391 | int btrfs_add_root_ref(struct btrfs_trans_handle *trans, |
388 | struct btrfs_root *tree_root, | 392 | struct btrfs_root *tree_root, |
@@ -406,7 +410,11 @@ int btrfs_add_root_ref(struct btrfs_trans_handle *trans, | |||
406 | again: | 410 | again: |
407 | ret = btrfs_insert_empty_item(trans, tree_root, path, &key, | 411 | ret = btrfs_insert_empty_item(trans, tree_root, path, &key, |
408 | sizeof(*ref) + name_len); | 412 | sizeof(*ref) + name_len); |
409 | BUG_ON(ret); | 413 | if (ret) { |
414 | btrfs_abort_transaction(trans, tree_root, ret); | ||
415 | btrfs_free_path(path); | ||
416 | return ret; | ||
417 | } | ||
410 | 418 | ||
411 | leaf = path->nodes[0]; | 419 | leaf = path->nodes[0]; |
412 | ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_ref); | 420 | ref = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_root_ref); |
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 794cbb52f308..0209d8a9ae39 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c | |||
@@ -1505,6 +1505,9 @@ static noinline_for_stack int scrub_supers(struct scrub_dev *sdev) | |||
1505 | struct btrfs_device *device = sdev->dev; | 1505 | struct btrfs_device *device = sdev->dev; |
1506 | struct btrfs_root *root = device->dev_root; | 1506 | struct btrfs_root *root = device->dev_root; |
1507 | 1507 | ||
1508 | if (root->fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) | ||
1509 | return -EIO; | ||
1510 | |||
1508 | gen = root->fs_info->last_trans_committed; | 1511 | gen = root->fs_info->last_trans_committed; |
1509 | 1512 | ||
1510 | for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) { | 1513 | for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) { |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 0517bd70b04c..9db64165123a 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
@@ -216,7 +216,7 @@ void __btrfs_abort_transaction(struct btrfs_trans_handle *trans, | |||
216 | struct btrfs_root *root, const char *function, | 216 | struct btrfs_root *root, const char *function, |
217 | unsigned int line, int errno) | 217 | unsigned int line, int errno) |
218 | { | 218 | { |
219 | WARN_ON_ONCE(1); | 219 | WARN_ONCE(1, KERN_DEBUG "btrfs: Transaction aborted"); |
220 | trans->aborted = errno; | 220 | trans->aborted = errno; |
221 | /* Nothing used. The other threads that have joined this | 221 | /* Nothing used. The other threads that have joined this |
222 | * transaction may be able to continue. */ | 222 | * transaction may be able to continue. */ |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 5a4999aa8fef..63f835aa9788 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
@@ -949,18 +949,19 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, | |||
949 | dentry->d_name.name, dentry->d_name.len, | 949 | dentry->d_name.name, dentry->d_name.len, |
950 | parent_inode, &key, | 950 | parent_inode, &key, |
951 | BTRFS_FT_DIR, index); | 951 | BTRFS_FT_DIR, index); |
952 | if (ret) { | 952 | if (ret == -EEXIST) { |
953 | pending->error = -EEXIST; | 953 | pending->error = -EEXIST; |
954 | dput(parent); | 954 | dput(parent); |
955 | goto fail; | 955 | goto fail; |
956 | } else if (ret) | 956 | } else if (ret) { |
957 | goto abort_trans; | 957 | goto abort_trans_dput; |
958 | } | ||
958 | 959 | ||
959 | btrfs_i_size_write(parent_inode, parent_inode->i_size + | 960 | btrfs_i_size_write(parent_inode, parent_inode->i_size + |
960 | dentry->d_name.len * 2); | 961 | dentry->d_name.len * 2); |
961 | ret = btrfs_update_inode(trans, parent_root, parent_inode); | 962 | ret = btrfs_update_inode(trans, parent_root, parent_inode); |
962 | if (ret) | 963 | if (ret) |
963 | goto abort_trans; | 964 | goto abort_trans_dput; |
964 | 965 | ||
965 | /* | 966 | /* |
966 | * pull in the delayed directory update | 967 | * pull in the delayed directory update |
@@ -969,8 +970,10 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, | |||
969 | * snapshot | 970 | * snapshot |
970 | */ | 971 | */ |
971 | ret = btrfs_run_delayed_items(trans, root); | 972 | ret = btrfs_run_delayed_items(trans, root); |
972 | if (ret) /* Transaction aborted */ | 973 | if (ret) { /* Transaction aborted */ |
974 | dput(parent); | ||
973 | goto fail; | 975 | goto fail; |
976 | } | ||
974 | 977 | ||
975 | record_root_in_trans(trans, root); | 978 | record_root_in_trans(trans, root); |
976 | btrfs_set_root_last_snapshot(&root->root_item, trans->transid); | 979 | btrfs_set_root_last_snapshot(&root->root_item, trans->transid); |
@@ -986,17 +989,20 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, | |||
986 | 989 | ||
987 | old = btrfs_lock_root_node(root); | 990 | old = btrfs_lock_root_node(root); |
988 | ret = btrfs_cow_block(trans, root, old, NULL, 0, &old); | 991 | ret = btrfs_cow_block(trans, root, old, NULL, 0, &old); |
989 | if (ret) | 992 | if (ret) { |
990 | goto abort_trans; | 993 | btrfs_tree_unlock(old); |
994 | free_extent_buffer(old); | ||
995 | goto abort_trans_dput; | ||
996 | } | ||
991 | 997 | ||
992 | btrfs_set_lock_blocking(old); | 998 | btrfs_set_lock_blocking(old); |
993 | 999 | ||
994 | ret = btrfs_copy_root(trans, root, old, &tmp, objectid); | 1000 | ret = btrfs_copy_root(trans, root, old, &tmp, objectid); |
995 | if (ret) | 1001 | /* clean up in any case */ |
996 | goto abort_trans; | ||
997 | |||
998 | btrfs_tree_unlock(old); | 1002 | btrfs_tree_unlock(old); |
999 | free_extent_buffer(old); | 1003 | free_extent_buffer(old); |
1004 | if (ret) | ||
1005 | goto abort_trans_dput; | ||
1000 | 1006 | ||
1001 | /* see comments in should_cow_block() */ | 1007 | /* see comments in should_cow_block() */ |
1002 | root->force_cow = 1; | 1008 | root->force_cow = 1; |
@@ -1009,7 +1015,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, | |||
1009 | btrfs_tree_unlock(tmp); | 1015 | btrfs_tree_unlock(tmp); |
1010 | free_extent_buffer(tmp); | 1016 | free_extent_buffer(tmp); |
1011 | if (ret) | 1017 | if (ret) |
1012 | goto abort_trans; | 1018 | goto abort_trans_dput; |
1013 | 1019 | ||
1014 | /* | 1020 | /* |
1015 | * insert root back/forward references | 1021 | * insert root back/forward references |
@@ -1018,14 +1024,16 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, | |||
1018 | parent_root->root_key.objectid, | 1024 | parent_root->root_key.objectid, |
1019 | btrfs_ino(parent_inode), index, | 1025 | btrfs_ino(parent_inode), index, |
1020 | dentry->d_name.name, dentry->d_name.len); | 1026 | dentry->d_name.name, dentry->d_name.len); |
1027 | dput(parent); | ||
1021 | if (ret) | 1028 | if (ret) |
1022 | goto fail; | 1029 | goto fail; |
1023 | dput(parent); | ||
1024 | 1030 | ||
1025 | key.offset = (u64)-1; | 1031 | key.offset = (u64)-1; |
1026 | pending->snap = btrfs_read_fs_root_no_name(root->fs_info, &key); | 1032 | pending->snap = btrfs_read_fs_root_no_name(root->fs_info, &key); |
1027 | if (IS_ERR(pending->snap)) | 1033 | if (IS_ERR(pending->snap)) { |
1034 | ret = PTR_ERR(pending->snap); | ||
1028 | goto abort_trans; | 1035 | goto abort_trans; |
1036 | } | ||
1029 | 1037 | ||
1030 | ret = btrfs_reloc_post_snapshot(trans, pending); | 1038 | ret = btrfs_reloc_post_snapshot(trans, pending); |
1031 | if (ret) | 1039 | if (ret) |
@@ -1037,6 +1045,8 @@ fail: | |||
1037 | btrfs_block_rsv_release(root, &pending->block_rsv, (u64)-1); | 1045 | btrfs_block_rsv_release(root, &pending->block_rsv, (u64)-1); |
1038 | return ret; | 1046 | return ret; |
1039 | 1047 | ||
1048 | abort_trans_dput: | ||
1049 | dput(parent); | ||
1040 | abort_trans: | 1050 | abort_trans: |
1041 | btrfs_abort_transaction(trans, root, ret); | 1051 | btrfs_abort_transaction(trans, root, ret); |
1042 | goto fail; | 1052 | goto fail; |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 37b52b8c6727..d017283ae6f5 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -1761,7 +1761,7 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans, | |||
1761 | BTRFS_TREE_LOG_OBJECTID); | 1761 | BTRFS_TREE_LOG_OBJECTID); |
1762 | ret = btrfs_free_and_pin_reserved_extent(root, | 1762 | ret = btrfs_free_and_pin_reserved_extent(root, |
1763 | bytenr, blocksize); | 1763 | bytenr, blocksize); |
1764 | BUG_ON(ret); | 1764 | BUG_ON(ret); /* -ENOMEM or logic errors */ |
1765 | } | 1765 | } |
1766 | free_extent_buffer(next); | 1766 | free_extent_buffer(next); |
1767 | continue; | 1767 | continue; |
@@ -1869,20 +1869,26 @@ static int walk_log_tree(struct btrfs_trans_handle *trans, | |||
1869 | wret = walk_down_log_tree(trans, log, path, &level, wc); | 1869 | wret = walk_down_log_tree(trans, log, path, &level, wc); |
1870 | if (wret > 0) | 1870 | if (wret > 0) |
1871 | break; | 1871 | break; |
1872 | if (wret < 0) | 1872 | if (wret < 0) { |
1873 | ret = wret; | 1873 | ret = wret; |
1874 | goto out; | ||
1875 | } | ||
1874 | 1876 | ||
1875 | wret = walk_up_log_tree(trans, log, path, &level, wc); | 1877 | wret = walk_up_log_tree(trans, log, path, &level, wc); |
1876 | if (wret > 0) | 1878 | if (wret > 0) |
1877 | break; | 1879 | break; |
1878 | if (wret < 0) | 1880 | if (wret < 0) { |
1879 | ret = wret; | 1881 | ret = wret; |
1882 | goto out; | ||
1883 | } | ||
1880 | } | 1884 | } |
1881 | 1885 | ||
1882 | /* was the root node processed? if not, catch it here */ | 1886 | /* was the root node processed? if not, catch it here */ |
1883 | if (path->nodes[orig_level]) { | 1887 | if (path->nodes[orig_level]) { |
1884 | wc->process_func(log, path->nodes[orig_level], wc, | 1888 | ret = wc->process_func(log, path->nodes[orig_level], wc, |
1885 | btrfs_header_generation(path->nodes[orig_level])); | 1889 | btrfs_header_generation(path->nodes[orig_level])); |
1890 | if (ret) | ||
1891 | goto out; | ||
1886 | if (wc->free) { | 1892 | if (wc->free) { |
1887 | struct extent_buffer *next; | 1893 | struct extent_buffer *next; |
1888 | 1894 | ||
@@ -1898,10 +1904,11 @@ static int walk_log_tree(struct btrfs_trans_handle *trans, | |||
1898 | BTRFS_TREE_LOG_OBJECTID); | 1904 | BTRFS_TREE_LOG_OBJECTID); |
1899 | ret = btrfs_free_and_pin_reserved_extent(log, next->start, | 1905 | ret = btrfs_free_and_pin_reserved_extent(log, next->start, |
1900 | next->len); | 1906 | next->len); |
1901 | BUG_ON(ret); | 1907 | BUG_ON(ret); /* -ENOMEM or logic errors */ |
1902 | } | 1908 | } |
1903 | } | 1909 | } |
1904 | 1910 | ||
1911 | out: | ||
1905 | for (i = 0; i <= orig_level; i++) { | 1912 | for (i = 0; i <= orig_level; i++) { |
1906 | if (path->nodes[i]) { | 1913 | if (path->nodes[i]) { |
1907 | free_extent_buffer(path->nodes[i]); | 1914 | free_extent_buffer(path->nodes[i]); |
@@ -2043,7 +2050,11 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, | |||
2043 | * wait for them until later. | 2050 | * wait for them until later. |
2044 | */ | 2051 | */ |
2045 | ret = btrfs_write_marked_extents(log, &log->dirty_log_pages, mark); | 2052 | ret = btrfs_write_marked_extents(log, &log->dirty_log_pages, mark); |
2046 | BUG_ON(ret); | 2053 | if (ret) { |
2054 | btrfs_abort_transaction(trans, root, ret); | ||
2055 | mutex_unlock(&root->log_mutex); | ||
2056 | goto out; | ||
2057 | } | ||
2047 | 2058 | ||
2048 | btrfs_set_root_node(&log->root_item, log->node); | 2059 | btrfs_set_root_node(&log->root_item, log->node); |
2049 | 2060 | ||
@@ -2074,7 +2085,11 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, | |||
2074 | } | 2085 | } |
2075 | 2086 | ||
2076 | if (ret) { | 2087 | if (ret) { |
2077 | BUG_ON(ret != -ENOSPC); | 2088 | if (ret != -ENOSPC) { |
2089 | btrfs_abort_transaction(trans, root, ret); | ||
2090 | mutex_unlock(&log_root_tree->log_mutex); | ||
2091 | goto out; | ||
2092 | } | ||
2078 | root->fs_info->last_trans_log_full_commit = trans->transid; | 2093 | root->fs_info->last_trans_log_full_commit = trans->transid; |
2079 | btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark); | 2094 | btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark); |
2080 | mutex_unlock(&log_root_tree->log_mutex); | 2095 | mutex_unlock(&log_root_tree->log_mutex); |
@@ -2114,7 +2129,11 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, | |||
2114 | ret = btrfs_write_and_wait_marked_extents(log_root_tree, | 2129 | ret = btrfs_write_and_wait_marked_extents(log_root_tree, |
2115 | &log_root_tree->dirty_log_pages, | 2130 | &log_root_tree->dirty_log_pages, |
2116 | EXTENT_DIRTY | EXTENT_NEW); | 2131 | EXTENT_DIRTY | EXTENT_NEW); |
2117 | BUG_ON(ret); | 2132 | if (ret) { |
2133 | btrfs_abort_transaction(trans, root, ret); | ||
2134 | mutex_unlock(&log_root_tree->log_mutex); | ||
2135 | goto out_wake_log_root; | ||
2136 | } | ||
2118 | btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark); | 2137 | btrfs_wait_marked_extents(log, &log->dirty_log_pages, mark); |
2119 | 2138 | ||
2120 | btrfs_set_super_log_root(root->fs_info->super_for_commit, | 2139 | btrfs_set_super_log_root(root->fs_info->super_for_commit, |
@@ -2323,7 +2342,9 @@ out_unlock: | |||
2323 | if (ret == -ENOSPC) { | 2342 | if (ret == -ENOSPC) { |
2324 | root->fs_info->last_trans_log_full_commit = trans->transid; | 2343 | root->fs_info->last_trans_log_full_commit = trans->transid; |
2325 | ret = 0; | 2344 | ret = 0; |
2326 | } | 2345 | } else if (ret < 0) |
2346 | btrfs_abort_transaction(trans, root, ret); | ||
2347 | |||
2327 | btrfs_end_log_trans(root); | 2348 | btrfs_end_log_trans(root); |
2328 | 2349 | ||
2329 | return err; | 2350 | return err; |
@@ -2354,7 +2375,8 @@ int btrfs_del_inode_ref_in_log(struct btrfs_trans_handle *trans, | |||
2354 | if (ret == -ENOSPC) { | 2375 | if (ret == -ENOSPC) { |
2355 | root->fs_info->last_trans_log_full_commit = trans->transid; | 2376 | root->fs_info->last_trans_log_full_commit = trans->transid; |
2356 | ret = 0; | 2377 | ret = 0; |
2357 | } | 2378 | } else if (ret < 0 && ret != -ENOENT) |
2379 | btrfs_abort_transaction(trans, root, ret); | ||
2358 | btrfs_end_log_trans(root); | 2380 | btrfs_end_log_trans(root); |
2359 | 2381 | ||
2360 | return ret; | 2382 | return ret; |
@@ -3166,13 +3188,20 @@ int btrfs_recover_log_trees(struct btrfs_root *log_root_tree) | |||
3166 | fs_info->log_root_recovering = 1; | 3188 | fs_info->log_root_recovering = 1; |
3167 | 3189 | ||
3168 | trans = btrfs_start_transaction(fs_info->tree_root, 0); | 3190 | trans = btrfs_start_transaction(fs_info->tree_root, 0); |
3169 | BUG_ON(IS_ERR(trans)); | 3191 | if (IS_ERR(trans)) { |
3192 | ret = PTR_ERR(trans); | ||
3193 | goto error; | ||
3194 | } | ||
3170 | 3195 | ||
3171 | wc.trans = trans; | 3196 | wc.trans = trans; |
3172 | wc.pin = 1; | 3197 | wc.pin = 1; |
3173 | 3198 | ||
3174 | ret = walk_log_tree(trans, log_root_tree, &wc); | 3199 | ret = walk_log_tree(trans, log_root_tree, &wc); |
3175 | BUG_ON(ret); | 3200 | if (ret) { |
3201 | btrfs_error(fs_info, ret, "Failed to pin buffers while " | ||
3202 | "recovering log root tree."); | ||
3203 | goto error; | ||
3204 | } | ||
3176 | 3205 | ||
3177 | again: | 3206 | again: |
3178 | key.objectid = BTRFS_TREE_LOG_OBJECTID; | 3207 | key.objectid = BTRFS_TREE_LOG_OBJECTID; |
@@ -3181,8 +3210,12 @@ again: | |||
3181 | 3210 | ||
3182 | while (1) { | 3211 | while (1) { |
3183 | ret = btrfs_search_slot(NULL, log_root_tree, &key, path, 0, 0); | 3212 | ret = btrfs_search_slot(NULL, log_root_tree, &key, path, 0, 0); |
3184 | if (ret < 0) | 3213 | |
3185 | break; | 3214 | if (ret < 0) { |
3215 | btrfs_error(fs_info, ret, | ||
3216 | "Couldn't find tree log root."); | ||
3217 | goto error; | ||
3218 | } | ||
3186 | if (ret > 0) { | 3219 | if (ret > 0) { |
3187 | if (path->slots[0] == 0) | 3220 | if (path->slots[0] == 0) |
3188 | break; | 3221 | break; |
@@ -3196,14 +3229,24 @@ again: | |||
3196 | 3229 | ||
3197 | log = btrfs_read_fs_root_no_radix(log_root_tree, | 3230 | log = btrfs_read_fs_root_no_radix(log_root_tree, |
3198 | &found_key); | 3231 | &found_key); |
3199 | BUG_ON(IS_ERR(log)); | 3232 | if (IS_ERR(log)) { |
3233 | ret = PTR_ERR(log); | ||
3234 | btrfs_error(fs_info, ret, | ||
3235 | "Couldn't read tree log root."); | ||
3236 | goto error; | ||
3237 | } | ||
3200 | 3238 | ||
3201 | tmp_key.objectid = found_key.offset; | 3239 | tmp_key.objectid = found_key.offset; |
3202 | tmp_key.type = BTRFS_ROOT_ITEM_KEY; | 3240 | tmp_key.type = BTRFS_ROOT_ITEM_KEY; |
3203 | tmp_key.offset = (u64)-1; | 3241 | tmp_key.offset = (u64)-1; |
3204 | 3242 | ||
3205 | wc.replay_dest = btrfs_read_fs_root_no_name(fs_info, &tmp_key); | 3243 | wc.replay_dest = btrfs_read_fs_root_no_name(fs_info, &tmp_key); |
3206 | BUG_ON(IS_ERR_OR_NULL(wc.replay_dest)); | 3244 | if (IS_ERR(wc.replay_dest)) { |
3245 | ret = PTR_ERR(wc.replay_dest); | ||
3246 | btrfs_error(fs_info, ret, "Couldn't read target root " | ||
3247 | "for tree log recovery."); | ||
3248 | goto error; | ||
3249 | } | ||
3207 | 3250 | ||
3208 | wc.replay_dest->log_root = log; | 3251 | wc.replay_dest->log_root = log; |
3209 | btrfs_record_root_in_trans(trans, wc.replay_dest); | 3252 | btrfs_record_root_in_trans(trans, wc.replay_dest); |
@@ -3251,6 +3294,10 @@ again: | |||
3251 | 3294 | ||
3252 | kfree(log_root_tree); | 3295 | kfree(log_root_tree); |
3253 | return 0; | 3296 | return 0; |
3297 | |||
3298 | error: | ||
3299 | btrfs_free_path(path); | ||
3300 | return ret; | ||
3254 | } | 3301 | } |
3255 | 3302 | ||
3256 | /* | 3303 | /* |
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 394bf15ea18c..57305e88ea82 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -549,10 +549,10 @@ static int __btrfs_close_devices(struct btrfs_fs_devices *fs_devices) | |||
549 | fs_devices->num_can_discard--; | 549 | fs_devices->num_can_discard--; |
550 | 550 | ||
551 | new_device = kmalloc(sizeof(*new_device), GFP_NOFS); | 551 | new_device = kmalloc(sizeof(*new_device), GFP_NOFS); |
552 | BUG_ON(!new_device); | 552 | BUG_ON(!new_device); /* -ENOMEM */ |
553 | memcpy(new_device, device, sizeof(*new_device)); | 553 | memcpy(new_device, device, sizeof(*new_device)); |
554 | new_device->name = kstrdup(device->name, GFP_NOFS); | 554 | new_device->name = kstrdup(device->name, GFP_NOFS); |
555 | BUG_ON(device->name && !new_device->name); | 555 | BUG_ON(device->name && !new_device->name); /* -ENOMEM */ |
556 | new_device->bdev = NULL; | 556 | new_device->bdev = NULL; |
557 | new_device->writeable = 0; | 557 | new_device->writeable = 0; |
558 | new_device->in_fs_metadata = 0; | 558 | new_device->in_fs_metadata = 0; |
@@ -1036,8 +1036,10 @@ again: | |||
1036 | leaf = path->nodes[0]; | 1036 | leaf = path->nodes[0]; |
1037 | extent = btrfs_item_ptr(leaf, path->slots[0], | 1037 | extent = btrfs_item_ptr(leaf, path->slots[0], |
1038 | struct btrfs_dev_extent); | 1038 | struct btrfs_dev_extent); |
1039 | } else { | ||
1040 | btrfs_error(root->fs_info, ret, "Slot search failed"); | ||
1041 | goto out; | ||
1039 | } | 1042 | } |
1040 | BUG_ON(ret); | ||
1041 | 1043 | ||
1042 | if (device->bytes_used > 0) { | 1044 | if (device->bytes_used > 0) { |
1043 | u64 len = btrfs_dev_extent_length(leaf, extent); | 1045 | u64 len = btrfs_dev_extent_length(leaf, extent); |
@@ -1047,7 +1049,10 @@ again: | |||
1047 | spin_unlock(&root->fs_info->free_chunk_lock); | 1049 | spin_unlock(&root->fs_info->free_chunk_lock); |
1048 | } | 1050 | } |
1049 | ret = btrfs_del_item(trans, root, path); | 1051 | ret = btrfs_del_item(trans, root, path); |
1050 | 1052 | if (ret) { | |
1053 | btrfs_error(root->fs_info, ret, | ||
1054 | "Failed to remove dev extent item"); | ||
1055 | } | ||
1051 | out: | 1056 | out: |
1052 | btrfs_free_path(path); | 1057 | btrfs_free_path(path); |
1053 | return ret; | 1058 | return ret; |
@@ -1117,7 +1122,7 @@ static noinline int find_next_chunk(struct btrfs_root *root, | |||
1117 | if (ret < 0) | 1122 | if (ret < 0) |
1118 | goto error; | 1123 | goto error; |
1119 | 1124 | ||
1120 | BUG_ON(ret == 0); | 1125 | BUG_ON(ret == 0); /* Corruption */ |
1121 | 1126 | ||
1122 | ret = btrfs_previous_item(root, path, 0, BTRFS_CHUNK_ITEM_KEY); | 1127 | ret = btrfs_previous_item(root, path, 0, BTRFS_CHUNK_ITEM_KEY); |
1123 | if (ret) { | 1128 | if (ret) { |
@@ -1161,7 +1166,7 @@ static noinline int find_next_devid(struct btrfs_root *root, u64 *objectid) | |||
1161 | if (ret < 0) | 1166 | if (ret < 0) |
1162 | goto error; | 1167 | goto error; |
1163 | 1168 | ||
1164 | BUG_ON(ret == 0); | 1169 | BUG_ON(ret == 0); /* Corruption */ |
1165 | 1170 | ||
1166 | ret = btrfs_previous_item(root, path, BTRFS_DEV_ITEMS_OBJECTID, | 1171 | ret = btrfs_previous_item(root, path, BTRFS_DEV_ITEMS_OBJECTID, |
1167 | BTRFS_DEV_ITEM_KEY); | 1172 | BTRFS_DEV_ITEM_KEY); |
@@ -1595,7 +1600,7 @@ next_slot: | |||
1595 | (unsigned long)btrfs_device_fsid(dev_item), | 1600 | (unsigned long)btrfs_device_fsid(dev_item), |
1596 | BTRFS_UUID_SIZE); | 1601 | BTRFS_UUID_SIZE); |
1597 | device = btrfs_find_device(root, devid, dev_uuid, fs_uuid); | 1602 | device = btrfs_find_device(root, devid, dev_uuid, fs_uuid); |
1598 | BUG_ON(!device); | 1603 | BUG_ON(!device); /* Logic error */ |
1599 | 1604 | ||
1600 | if (device->fs_devices->seeding) { | 1605 | if (device->fs_devices->seeding) { |
1601 | btrfs_set_device_generation(leaf, dev_item, | 1606 | btrfs_set_device_generation(leaf, dev_item, |
@@ -1705,7 +1710,7 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path) | |||
1705 | if (seeding_dev) { | 1710 | if (seeding_dev) { |
1706 | sb->s_flags &= ~MS_RDONLY; | 1711 | sb->s_flags &= ~MS_RDONLY; |
1707 | ret = btrfs_prepare_sprout(root); | 1712 | ret = btrfs_prepare_sprout(root); |
1708 | BUG_ON(ret); | 1713 | BUG_ON(ret); /* -ENOMEM */ |
1709 | } | 1714 | } |
1710 | 1715 | ||
1711 | device->fs_devices = root->fs_info->fs_devices; | 1716 | device->fs_devices = root->fs_info->fs_devices; |
@@ -1743,11 +1748,15 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path) | |||
1743 | 1748 | ||
1744 | if (seeding_dev) { | 1749 | if (seeding_dev) { |
1745 | ret = init_first_rw_device(trans, root, device); | 1750 | ret = init_first_rw_device(trans, root, device); |
1746 | BUG_ON(ret); | 1751 | if (ret) |
1752 | goto error_trans; | ||
1747 | ret = btrfs_finish_sprout(trans, root); | 1753 | ret = btrfs_finish_sprout(trans, root); |
1748 | BUG_ON(ret); | 1754 | if (ret) |
1755 | goto error_trans; | ||
1749 | } else { | 1756 | } else { |
1750 | ret = btrfs_add_device(trans, root, device); | 1757 | ret = btrfs_add_device(trans, root, device); |
1758 | if (ret) | ||
1759 | goto error_trans; | ||
1751 | } | 1760 | } |
1752 | 1761 | ||
1753 | /* | 1762 | /* |
@@ -1757,17 +1766,31 @@ int btrfs_init_new_device(struct btrfs_root *root, char *device_path) | |||
1757 | btrfs_clear_space_info_full(root->fs_info); | 1766 | btrfs_clear_space_info_full(root->fs_info); |
1758 | 1767 | ||
1759 | unlock_chunks(root); | 1768 | unlock_chunks(root); |
1760 | btrfs_commit_transaction(trans, root); | 1769 | ret = btrfs_commit_transaction(trans, root); |
1761 | 1770 | ||
1762 | if (seeding_dev) { | 1771 | if (seeding_dev) { |
1763 | mutex_unlock(&uuid_mutex); | 1772 | mutex_unlock(&uuid_mutex); |
1764 | up_write(&sb->s_umount); | 1773 | up_write(&sb->s_umount); |
1765 | 1774 | ||
1775 | if (ret) /* transaction commit */ | ||
1776 | return ret; | ||
1777 | |||
1766 | ret = btrfs_relocate_sys_chunks(root); | 1778 | ret = btrfs_relocate_sys_chunks(root); |
1767 | BUG_ON(ret); | 1779 | if (ret < 0) |
1780 | btrfs_error(root->fs_info, ret, | ||
1781 | "Failed to relocate sys chunks after " | ||
1782 | "device initialization. This can be fixed " | ||
1783 | "using the \"btrfs balance\" command."); | ||
1768 | } | 1784 | } |
1769 | 1785 | ||
1770 | return ret; | 1786 | return ret; |
1787 | |||
1788 | error_trans: | ||
1789 | unlock_chunks(root); | ||
1790 | btrfs_abort_transaction(trans, root, ret); | ||
1791 | btrfs_end_transaction(trans, root); | ||
1792 | kfree(device->name); | ||
1793 | kfree(device); | ||
1771 | error: | 1794 | error: |
1772 | blkdev_put(bdev, FMODE_EXCL); | 1795 | blkdev_put(bdev, FMODE_EXCL); |
1773 | if (seeding_dev) { | 1796 | if (seeding_dev) { |
@@ -1875,10 +1898,20 @@ static int btrfs_free_chunk(struct btrfs_trans_handle *trans, | |||
1875 | key.type = BTRFS_CHUNK_ITEM_KEY; | 1898 | key.type = BTRFS_CHUNK_ITEM_KEY; |
1876 | 1899 | ||
1877 | ret = btrfs_search_slot(trans, root, &key, path, -1, 1); | 1900 | ret = btrfs_search_slot(trans, root, &key, path, -1, 1); |
1878 | BUG_ON(ret); | 1901 | if (ret < 0) |
1902 | goto out; | ||
1903 | else if (ret > 0) { /* Logic error or corruption */ | ||
1904 | btrfs_error(root->fs_info, -ENOENT, | ||
1905 | "Failed lookup while freeing chunk."); | ||
1906 | ret = -ENOENT; | ||
1907 | goto out; | ||
1908 | } | ||
1879 | 1909 | ||
1880 | ret = btrfs_del_item(trans, root, path); | 1910 | ret = btrfs_del_item(trans, root, path); |
1881 | 1911 | if (ret < 0) | |
1912 | btrfs_error(root->fs_info, ret, | ||
1913 | "Failed to delete chunk item."); | ||
1914 | out: | ||
1882 | btrfs_free_path(path); | 1915 | btrfs_free_path(path); |
1883 | return ret; | 1916 | return ret; |
1884 | } | 1917 | } |
@@ -2040,7 +2073,7 @@ again: | |||
2040 | ret = btrfs_search_slot(NULL, chunk_root, &key, path, 0, 0); | 2073 | ret = btrfs_search_slot(NULL, chunk_root, &key, path, 0, 0); |
2041 | if (ret < 0) | 2074 | if (ret < 0) |
2042 | goto error; | 2075 | goto error; |
2043 | BUG_ON(ret == 0); | 2076 | BUG_ON(ret == 0); /* Corruption */ |
2044 | 2077 | ||
2045 | ret = btrfs_previous_item(chunk_root, path, key.objectid, | 2078 | ret = btrfs_previous_item(chunk_root, path, key.objectid, |
2046 | key.type); | 2079 | key.type); |
@@ -3334,7 +3367,8 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, | |||
3334 | ret = btrfs_make_block_group(trans, extent_root, 0, type, | 3367 | ret = btrfs_make_block_group(trans, extent_root, 0, type, |
3335 | BTRFS_FIRST_CHUNK_TREE_OBJECTID, | 3368 | BTRFS_FIRST_CHUNK_TREE_OBJECTID, |
3336 | start, num_bytes); | 3369 | start, num_bytes); |
3337 | BUG_ON(ret); | 3370 | if (ret) |
3371 | goto error; | ||
3338 | 3372 | ||
3339 | for (i = 0; i < map->num_stripes; ++i) { | 3373 | for (i = 0; i < map->num_stripes; ++i) { |
3340 | struct btrfs_device *device; | 3374 | struct btrfs_device *device; |
@@ -3347,7 +3381,10 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, | |||
3347 | info->chunk_root->root_key.objectid, | 3381 | info->chunk_root->root_key.objectid, |
3348 | BTRFS_FIRST_CHUNK_TREE_OBJECTID, | 3382 | BTRFS_FIRST_CHUNK_TREE_OBJECTID, |
3349 | start, dev_offset, stripe_size); | 3383 | start, dev_offset, stripe_size); |
3350 | BUG_ON(ret); | 3384 | if (ret) { |
3385 | btrfs_abort_transaction(trans, extent_root, ret); | ||
3386 | goto error; | ||
3387 | } | ||
3351 | } | 3388 | } |
3352 | 3389 | ||
3353 | kfree(devices_info); | 3390 | kfree(devices_info); |
@@ -3465,7 +3502,8 @@ int btrfs_alloc_chunk(struct btrfs_trans_handle *trans, | |||
3465 | 3502 | ||
3466 | ret = __finish_chunk_alloc(trans, extent_root, map, chunk_offset, | 3503 | ret = __finish_chunk_alloc(trans, extent_root, map, chunk_offset, |
3467 | chunk_size, stripe_size); | 3504 | chunk_size, stripe_size); |
3468 | BUG_ON(ret); | 3505 | if (ret) |
3506 | return ret; | ||
3469 | return 0; | 3507 | return 0; |
3470 | } | 3508 | } |
3471 | 3509 | ||
@@ -3497,7 +3535,8 @@ static noinline int init_first_rw_device(struct btrfs_trans_handle *trans, | |||
3497 | 3535 | ||
3498 | ret = __btrfs_alloc_chunk(trans, extent_root, &map, &chunk_size, | 3536 | ret = __btrfs_alloc_chunk(trans, extent_root, &map, &chunk_size, |
3499 | &stripe_size, chunk_offset, alloc_profile); | 3537 | &stripe_size, chunk_offset, alloc_profile); |
3500 | BUG_ON(ret); | 3538 | if (ret) |
3539 | return ret; | ||
3501 | 3540 | ||
3502 | sys_chunk_offset = chunk_offset + chunk_size; | 3541 | sys_chunk_offset = chunk_offset + chunk_size; |
3503 | 3542 | ||
@@ -3508,10 +3547,12 @@ static noinline int init_first_rw_device(struct btrfs_trans_handle *trans, | |||
3508 | ret = __btrfs_alloc_chunk(trans, extent_root, &sys_map, | 3547 | ret = __btrfs_alloc_chunk(trans, extent_root, &sys_map, |
3509 | &sys_chunk_size, &sys_stripe_size, | 3548 | &sys_chunk_size, &sys_stripe_size, |
3510 | sys_chunk_offset, alloc_profile); | 3549 | sys_chunk_offset, alloc_profile); |
3511 | BUG_ON(ret); | 3550 | if (ret) |
3551 | goto abort; | ||
3512 | 3552 | ||
3513 | ret = btrfs_add_device(trans, fs_info->chunk_root, device); | 3553 | ret = btrfs_add_device(trans, fs_info->chunk_root, device); |
3514 | BUG_ON(ret); | 3554 | if (ret) |
3555 | goto abort; | ||
3515 | 3556 | ||
3516 | /* | 3557 | /* |
3517 | * Modifying chunk tree needs allocating new blocks from both | 3558 | * Modifying chunk tree needs allocating new blocks from both |
@@ -3521,13 +3562,20 @@ static noinline int init_first_rw_device(struct btrfs_trans_handle *trans, | |||
3521 | */ | 3562 | */ |
3522 | ret = __finish_chunk_alloc(trans, extent_root, map, chunk_offset, | 3563 | ret = __finish_chunk_alloc(trans, extent_root, map, chunk_offset, |
3523 | chunk_size, stripe_size); | 3564 | chunk_size, stripe_size); |
3524 | BUG_ON(ret); | 3565 | if (ret) |
3566 | goto abort; | ||
3525 | 3567 | ||
3526 | ret = __finish_chunk_alloc(trans, extent_root, sys_map, | 3568 | ret = __finish_chunk_alloc(trans, extent_root, sys_map, |
3527 | sys_chunk_offset, sys_chunk_size, | 3569 | sys_chunk_offset, sys_chunk_size, |
3528 | sys_stripe_size); | 3570 | sys_stripe_size); |
3529 | BUG_ON(ret); | 3571 | if (ret) |
3572 | goto abort; | ||
3573 | |||
3530 | return 0; | 3574 | return 0; |
3575 | |||
3576 | abort: | ||
3577 | btrfs_abort_transaction(trans, root, ret); | ||
3578 | return ret; | ||
3531 | } | 3579 | } |
3532 | 3580 | ||
3533 | int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset) | 3581 | int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset) |
@@ -3878,7 +3926,7 @@ int btrfs_rmap_block(struct btrfs_mapping_tree *map_tree, | |||
3878 | do_div(length, map->num_stripes); | 3926 | do_div(length, map->num_stripes); |
3879 | 3927 | ||
3880 | buf = kzalloc(sizeof(u64) * map->num_stripes, GFP_NOFS); | 3928 | buf = kzalloc(sizeof(u64) * map->num_stripes, GFP_NOFS); |
3881 | BUG_ON(!buf); | 3929 | BUG_ON(!buf); /* -ENOMEM */ |
3882 | 3930 | ||
3883 | for (i = 0; i < map->num_stripes; i++) { | 3931 | for (i = 0; i < map->num_stripes; i++) { |
3884 | if (devid && map->stripes[i].dev->devid != devid) | 3932 | if (devid && map->stripes[i].dev->devid != devid) |
@@ -4039,7 +4087,8 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, | |||
4039 | 4087 | ||
4040 | ret = btrfs_map_block(map_tree, rw, logical, &map_length, &bbio, | 4088 | ret = btrfs_map_block(map_tree, rw, logical, &map_length, &bbio, |
4041 | mirror_num); | 4089 | mirror_num); |
4042 | BUG_ON(ret); | 4090 | if (ret) /* -ENOMEM */ |
4091 | return ret; | ||
4043 | 4092 | ||
4044 | total_devs = bbio->num_stripes; | 4093 | total_devs = bbio->num_stripes; |
4045 | if (map_length < length) { | 4094 | if (map_length < length) { |
@@ -4058,7 +4107,7 @@ int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio, | |||
4058 | while (dev_nr < total_devs) { | 4107 | while (dev_nr < total_devs) { |
4059 | if (dev_nr < total_devs - 1) { | 4108 | if (dev_nr < total_devs - 1) { |
4060 | bio = bio_clone(first_bio, GFP_NOFS); | 4109 | bio = bio_clone(first_bio, GFP_NOFS); |
4061 | BUG_ON(!bio); | 4110 | BUG_ON(!bio); /* -ENOMEM */ |
4062 | } else { | 4111 | } else { |
4063 | bio = first_bio; | 4112 | bio = first_bio; |
4064 | } | 4113 | } |
@@ -4212,7 +4261,7 @@ static int read_one_chunk(struct btrfs_root *root, struct btrfs_key *key, | |||
4212 | write_lock(&map_tree->map_tree.lock); | 4261 | write_lock(&map_tree->map_tree.lock); |
4213 | ret = add_extent_mapping(&map_tree->map_tree, em); | 4262 | ret = add_extent_mapping(&map_tree->map_tree, em); |
4214 | write_unlock(&map_tree->map_tree.lock); | 4263 | write_unlock(&map_tree->map_tree.lock); |
4215 | BUG_ON(ret); | 4264 | BUG_ON(ret); /* Tree corruption */ |
4216 | free_extent_map(em); | 4265 | free_extent_map(em); |
4217 | 4266 | ||
4218 | return 0; | 4267 | return 0; |