diff options
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r-- | fs/btrfs/file.c | 45 |
1 files changed, 31 insertions, 14 deletions
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; |