diff options
Diffstat (limited to 'fs/btrfs/file.c')
| -rw-r--r-- | fs/btrfs/file.c | 160 |
1 files changed, 99 insertions, 61 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 0165b8672f09..e1ffb1e22898 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -591,7 +591,6 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
| 591 | clear_bit(EXTENT_FLAG_PINNED, &em->flags); | 591 | clear_bit(EXTENT_FLAG_PINNED, &em->flags); |
| 592 | clear_bit(EXTENT_FLAG_LOGGING, &flags); | 592 | clear_bit(EXTENT_FLAG_LOGGING, &flags); |
| 593 | modified = !list_empty(&em->list); | 593 | modified = !list_empty(&em->list); |
| 594 | remove_extent_mapping(em_tree, em); | ||
| 595 | if (no_splits) | 594 | if (no_splits) |
| 596 | goto next; | 595 | goto next; |
| 597 | 596 | ||
| @@ -622,8 +621,7 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
| 622 | split->bdev = em->bdev; | 621 | split->bdev = em->bdev; |
| 623 | split->flags = flags; | 622 | split->flags = flags; |
| 624 | split->compress_type = em->compress_type; | 623 | split->compress_type = em->compress_type; |
| 625 | ret = add_extent_mapping(em_tree, split, modified); | 624 | replace_extent_mapping(em_tree, em, split, modified); |
| 626 | BUG_ON(ret); /* Logic error */ | ||
| 627 | free_extent_map(split); | 625 | free_extent_map(split); |
| 628 | split = split2; | 626 | split = split2; |
| 629 | split2 = NULL; | 627 | split2 = NULL; |
| @@ -661,12 +659,20 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
| 661 | split->orig_block_len = 0; | 659 | split->orig_block_len = 0; |
| 662 | } | 660 | } |
| 663 | 661 | ||
| 664 | ret = add_extent_mapping(em_tree, split, modified); | 662 | if (extent_map_in_tree(em)) { |
| 665 | BUG_ON(ret); /* Logic error */ | 663 | replace_extent_mapping(em_tree, em, split, |
| 664 | modified); | ||
| 665 | } else { | ||
| 666 | ret = add_extent_mapping(em_tree, split, | ||
| 667 | modified); | ||
| 668 | ASSERT(ret == 0); /* Logic error */ | ||
| 669 | } | ||
| 666 | free_extent_map(split); | 670 | free_extent_map(split); |
| 667 | split = NULL; | 671 | split = NULL; |
| 668 | } | 672 | } |
| 669 | next: | 673 | next: |
| 674 | if (extent_map_in_tree(em)) | ||
| 675 | remove_extent_mapping(em_tree, em); | ||
| 670 | write_unlock(&em_tree->lock); | 676 | write_unlock(&em_tree->lock); |
| 671 | 677 | ||
| 672 | /* once for us */ | 678 | /* once for us */ |
| @@ -720,7 +726,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans, | |||
| 720 | if (drop_cache) | 726 | if (drop_cache) |
| 721 | btrfs_drop_extent_cache(inode, start, end - 1, 0); | 727 | btrfs_drop_extent_cache(inode, start, end - 1, 0); |
| 722 | 728 | ||
| 723 | if (start >= BTRFS_I(inode)->disk_i_size) | 729 | if (start >= BTRFS_I(inode)->disk_i_size && !replace_extent) |
| 724 | modify_tree = 0; | 730 | modify_tree = 0; |
| 725 | 731 | ||
| 726 | while (1) { | 732 | while (1) { |
| @@ -798,7 +804,10 @@ next_slot: | |||
| 798 | */ | 804 | */ |
| 799 | if (start > key.offset && end < extent_end) { | 805 | if (start > key.offset && end < extent_end) { |
| 800 | BUG_ON(del_nr > 0); | 806 | BUG_ON(del_nr > 0); |
| 801 | BUG_ON(extent_type == BTRFS_FILE_EXTENT_INLINE); | 807 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { |
| 808 | ret = -EINVAL; | ||
| 809 | break; | ||
| 810 | } | ||
| 802 | 811 | ||
| 803 | memcpy(&new_key, &key, sizeof(new_key)); | 812 | memcpy(&new_key, &key, sizeof(new_key)); |
| 804 | new_key.offset = start; | 813 | new_key.offset = start; |
| @@ -841,7 +850,10 @@ next_slot: | |||
| 841 | * | -------- extent -------- | | 850 | * | -------- extent -------- | |
| 842 | */ | 851 | */ |
| 843 | if (start <= key.offset && end < extent_end) { | 852 | if (start <= key.offset && end < extent_end) { |
| 844 | BUG_ON(extent_type == BTRFS_FILE_EXTENT_INLINE); | 853 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { |
| 854 | ret = -EINVAL; | ||
| 855 | break; | ||
| 856 | } | ||
| 845 | 857 | ||
| 846 | memcpy(&new_key, &key, sizeof(new_key)); | 858 | memcpy(&new_key, &key, sizeof(new_key)); |
| 847 | new_key.offset = end; | 859 | new_key.offset = end; |
| @@ -864,7 +876,10 @@ next_slot: | |||
| 864 | */ | 876 | */ |
| 865 | if (start > key.offset && end >= extent_end) { | 877 | if (start > key.offset && end >= extent_end) { |
| 866 | BUG_ON(del_nr > 0); | 878 | BUG_ON(del_nr > 0); |
| 867 | BUG_ON(extent_type == BTRFS_FILE_EXTENT_INLINE); | 879 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { |
| 880 | ret = -EINVAL; | ||
| 881 | break; | ||
| 882 | } | ||
| 868 | 883 | ||
| 869 | btrfs_set_file_extent_num_bytes(leaf, fi, | 884 | btrfs_set_file_extent_num_bytes(leaf, fi, |
| 870 | start - key.offset); | 885 | start - key.offset); |
| @@ -938,34 +953,42 @@ next_slot: | |||
| 938 | * Set path->slots[0] to first slot, so that after the delete | 953 | * Set path->slots[0] to first slot, so that after the delete |
| 939 | * if items are move off from our leaf to its immediate left or | 954 | * if items are move off from our leaf to its immediate left or |
| 940 | * right neighbor leafs, we end up with a correct and adjusted | 955 | * right neighbor leafs, we end up with a correct and adjusted |
| 941 | * path->slots[0] for our insertion. | 956 | * path->slots[0] for our insertion (if replace_extent != 0). |
| 942 | */ | 957 | */ |
| 943 | path->slots[0] = del_slot; | 958 | path->slots[0] = del_slot; |
| 944 | ret = btrfs_del_items(trans, root, path, del_slot, del_nr); | 959 | ret = btrfs_del_items(trans, root, path, del_slot, del_nr); |
| 945 | if (ret) | 960 | if (ret) |
| 946 | btrfs_abort_transaction(trans, root, ret); | 961 | btrfs_abort_transaction(trans, root, ret); |
| 962 | } | ||
| 947 | 963 | ||
| 948 | leaf = path->nodes[0]; | 964 | leaf = path->nodes[0]; |
| 949 | /* | 965 | /* |
| 950 | * leaf eb has flag EXTENT_BUFFER_STALE if it was deleted (that | 966 | * If btrfs_del_items() was called, it might have deleted a leaf, in |
| 951 | * is, its contents got pushed to its neighbors), in which case | 967 | * which case it unlocked our path, so check path->locks[0] matches a |
| 952 | * it means path->locks[0] == 0 | 968 | * write lock. |
| 953 | */ | 969 | */ |
| 954 | if (!ret && replace_extent && leafs_visited == 1 && | 970 | if (!ret && replace_extent && leafs_visited == 1 && |
| 955 | path->locks[0] && | 971 | (path->locks[0] == BTRFS_WRITE_LOCK_BLOCKING || |
| 956 | btrfs_leaf_free_space(root, leaf) >= | 972 | path->locks[0] == BTRFS_WRITE_LOCK) && |
| 957 | sizeof(struct btrfs_item) + extent_item_size) { | 973 | btrfs_leaf_free_space(root, leaf) >= |
| 958 | 974 | sizeof(struct btrfs_item) + extent_item_size) { | |
| 959 | key.objectid = ino; | 975 | |
| 960 | key.type = BTRFS_EXTENT_DATA_KEY; | 976 | key.objectid = ino; |
| 961 | key.offset = start; | 977 | key.type = BTRFS_EXTENT_DATA_KEY; |
| 962 | setup_items_for_insert(root, path, &key, | 978 | key.offset = start; |
| 963 | &extent_item_size, | 979 | if (!del_nr && path->slots[0] < btrfs_header_nritems(leaf)) { |
| 964 | extent_item_size, | 980 | struct btrfs_key slot_key; |
| 965 | sizeof(struct btrfs_item) + | 981 | |
| 966 | extent_item_size, 1); | 982 | btrfs_item_key_to_cpu(leaf, &slot_key, path->slots[0]); |
| 967 | *key_inserted = 1; | 983 | if (btrfs_comp_cpu_keys(&key, &slot_key) > 0) |
| 984 | path->slots[0]++; | ||
| 968 | } | 985 | } |
| 986 | setup_items_for_insert(root, path, &key, | ||
| 987 | &extent_item_size, | ||
| 988 | extent_item_size, | ||
| 989 | sizeof(struct btrfs_item) + | ||
| 990 | extent_item_size, 1); | ||
| 991 | *key_inserted = 1; | ||
| 969 | } | 992 | } |
| 970 | 993 | ||
| 971 | if (!replace_extent || !(*key_inserted)) | 994 | if (!replace_extent || !(*key_inserted)) |
| @@ -1346,11 +1369,11 @@ lock_and_cleanup_extent_if_need(struct inode *inode, struct page **pages, | |||
| 1346 | struct btrfs_ordered_extent *ordered; | 1369 | struct btrfs_ordered_extent *ordered; |
| 1347 | lock_extent_bits(&BTRFS_I(inode)->io_tree, | 1370 | lock_extent_bits(&BTRFS_I(inode)->io_tree, |
| 1348 | start_pos, last_pos, 0, cached_state); | 1371 | start_pos, last_pos, 0, cached_state); |
| 1349 | ordered = btrfs_lookup_first_ordered_extent(inode, last_pos); | 1372 | ordered = btrfs_lookup_ordered_range(inode, start_pos, |
| 1373 | last_pos - start_pos + 1); | ||
| 1350 | if (ordered && | 1374 | if (ordered && |
| 1351 | ordered->file_offset + ordered->len > start_pos && | 1375 | ordered->file_offset + ordered->len > start_pos && |
| 1352 | ordered->file_offset <= last_pos) { | 1376 | ordered->file_offset <= last_pos) { |
| 1353 | btrfs_put_ordered_extent(ordered); | ||
| 1354 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, | 1377 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, |
| 1355 | start_pos, last_pos, | 1378 | start_pos, last_pos, |
| 1356 | cached_state, GFP_NOFS); | 1379 | cached_state, GFP_NOFS); |
| @@ -1358,12 +1381,9 @@ lock_and_cleanup_extent_if_need(struct inode *inode, struct page **pages, | |||
| 1358 | unlock_page(pages[i]); | 1381 | unlock_page(pages[i]); |
| 1359 | page_cache_release(pages[i]); | 1382 | page_cache_release(pages[i]); |
| 1360 | } | 1383 | } |
| 1361 | ret = btrfs_wait_ordered_range(inode, start_pos, | 1384 | btrfs_start_ordered_extent(inode, ordered, 1); |
| 1362 | last_pos - start_pos + 1); | 1385 | btrfs_put_ordered_extent(ordered); |
| 1363 | if (ret) | 1386 | return -EAGAIN; |
| 1364 | return ret; | ||
| 1365 | else | ||
| 1366 | return -EAGAIN; | ||
| 1367 | } | 1387 | } |
| 1368 | if (ordered) | 1388 | if (ordered) |
| 1369 | btrfs_put_ordered_extent(ordered); | 1389 | btrfs_put_ordered_extent(ordered); |
| @@ -1396,8 +1416,12 @@ static noinline int check_can_nocow(struct inode *inode, loff_t pos, | |||
| 1396 | u64 num_bytes; | 1416 | u64 num_bytes; |
| 1397 | int ret; | 1417 | int ret; |
| 1398 | 1418 | ||
| 1419 | ret = btrfs_start_nocow_write(root); | ||
| 1420 | if (!ret) | ||
| 1421 | return -ENOSPC; | ||
| 1422 | |||
| 1399 | lockstart = round_down(pos, root->sectorsize); | 1423 | lockstart = round_down(pos, root->sectorsize); |
| 1400 | lockend = lockstart + round_up(*write_bytes, root->sectorsize) - 1; | 1424 | lockend = round_up(pos + *write_bytes, root->sectorsize) - 1; |
| 1401 | 1425 | ||
| 1402 | while (1) { | 1426 | while (1) { |
| 1403 | lock_extent(&BTRFS_I(inode)->io_tree, lockstart, lockend); | 1427 | lock_extent(&BTRFS_I(inode)->io_tree, lockstart, lockend); |
| @@ -1415,12 +1439,10 @@ static noinline int check_can_nocow(struct inode *inode, loff_t pos, | |||
| 1415 | ret = can_nocow_extent(inode, lockstart, &num_bytes, NULL, NULL, NULL); | 1439 | ret = can_nocow_extent(inode, lockstart, &num_bytes, NULL, NULL, NULL); |
| 1416 | if (ret <= 0) { | 1440 | if (ret <= 0) { |
| 1417 | ret = 0; | 1441 | ret = 0; |
| 1442 | btrfs_end_nocow_write(root); | ||
| 1418 | } else { | 1443 | } else { |
| 1419 | clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, lockend, | 1444 | *write_bytes = min_t(size_t, *write_bytes , |
| 1420 | EXTENT_DIRTY | EXTENT_DELALLOC | | 1445 | num_bytes - pos + lockstart); |
| 1421 | EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG, 0, 0, | ||
| 1422 | NULL, GFP_NOFS); | ||
| 1423 | *write_bytes = min_t(size_t, *write_bytes, num_bytes); | ||
| 1424 | } | 1446 | } |
| 1425 | 1447 | ||
| 1426 | unlock_extent(&BTRFS_I(inode)->io_tree, lockstart, lockend); | 1448 | unlock_extent(&BTRFS_I(inode)->io_tree, lockstart, lockend); |
| @@ -1510,6 +1532,8 @@ static noinline ssize_t __btrfs_buffered_write(struct file *file, | |||
| 1510 | if (!only_release_metadata) | 1532 | if (!only_release_metadata) |
| 1511 | btrfs_free_reserved_data_space(inode, | 1533 | btrfs_free_reserved_data_space(inode, |
| 1512 | reserve_bytes); | 1534 | reserve_bytes); |
| 1535 | else | ||
| 1536 | btrfs_end_nocow_write(root); | ||
| 1513 | break; | 1537 | break; |
| 1514 | } | 1538 | } |
| 1515 | 1539 | ||
| @@ -1598,6 +1622,9 @@ again: | |||
| 1598 | } | 1622 | } |
| 1599 | 1623 | ||
| 1600 | release_bytes = 0; | 1624 | release_bytes = 0; |
| 1625 | if (only_release_metadata) | ||
| 1626 | btrfs_end_nocow_write(root); | ||
| 1627 | |||
| 1601 | if (only_release_metadata && copied > 0) { | 1628 | if (only_release_metadata && copied > 0) { |
| 1602 | u64 lockstart = round_down(pos, root->sectorsize); | 1629 | u64 lockstart = round_down(pos, root->sectorsize); |
| 1603 | u64 lockend = lockstart + | 1630 | u64 lockend = lockstart + |
| @@ -1624,10 +1651,12 @@ again: | |||
| 1624 | kfree(pages); | 1651 | kfree(pages); |
| 1625 | 1652 | ||
| 1626 | if (release_bytes) { | 1653 | if (release_bytes) { |
| 1627 | if (only_release_metadata) | 1654 | if (only_release_metadata) { |
| 1655 | btrfs_end_nocow_write(root); | ||
| 1628 | btrfs_delalloc_release_metadata(inode, release_bytes); | 1656 | btrfs_delalloc_release_metadata(inode, release_bytes); |
| 1629 | else | 1657 | } else { |
| 1630 | btrfs_delalloc_release_space(inode, release_bytes); | 1658 | btrfs_delalloc_release_space(inode, release_bytes); |
| 1659 | } | ||
| 1631 | } | 1660 | } |
| 1632 | 1661 | ||
| 1633 | return num_written ? num_written : ret; | 1662 | return num_written ? num_written : ret; |
| @@ -1797,7 +1826,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
| 1797 | BTRFS_I(inode)->last_sub_trans = root->log_transid; | 1826 | BTRFS_I(inode)->last_sub_trans = root->log_transid; |
| 1798 | if (num_written > 0) { | 1827 | if (num_written > 0) { |
| 1799 | err = generic_write_sync(file, pos, num_written); | 1828 | err = generic_write_sync(file, pos, num_written); |
| 1800 | if (err < 0 && num_written > 0) | 1829 | if (err < 0) |
| 1801 | num_written = err; | 1830 | num_written = err; |
| 1802 | } | 1831 | } |
| 1803 | 1832 | ||
| @@ -1856,8 +1885,9 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
| 1856 | struct dentry *dentry = file->f_path.dentry; | 1885 | struct dentry *dentry = file->f_path.dentry; |
| 1857 | struct inode *inode = dentry->d_inode; | 1886 | struct inode *inode = dentry->d_inode; |
| 1858 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1887 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 1859 | int ret = 0; | ||
| 1860 | struct btrfs_trans_handle *trans; | 1888 | struct btrfs_trans_handle *trans; |
| 1889 | struct btrfs_log_ctx ctx; | ||
| 1890 | int ret = 0; | ||
| 1861 | bool full_sync = 0; | 1891 | bool full_sync = 0; |
| 1862 | 1892 | ||
| 1863 | trace_btrfs_sync_file(file, datasync); | 1893 | trace_btrfs_sync_file(file, datasync); |
| @@ -1951,7 +1981,9 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
| 1951 | } | 1981 | } |
| 1952 | trans->sync = true; | 1982 | trans->sync = true; |
| 1953 | 1983 | ||
| 1954 | ret = btrfs_log_dentry_safe(trans, root, dentry); | 1984 | btrfs_init_log_ctx(&ctx); |
| 1985 | |||
| 1986 | ret = btrfs_log_dentry_safe(trans, root, dentry, &ctx); | ||
| 1955 | if (ret < 0) { | 1987 | if (ret < 0) { |
| 1956 | /* Fallthrough and commit/free transaction. */ | 1988 | /* Fallthrough and commit/free transaction. */ |
| 1957 | ret = 1; | 1989 | ret = 1; |
| @@ -1971,7 +2003,7 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
| 1971 | 2003 | ||
| 1972 | if (ret != BTRFS_NO_LOG_SYNC) { | 2004 | if (ret != BTRFS_NO_LOG_SYNC) { |
| 1973 | if (!ret) { | 2005 | if (!ret) { |
| 1974 | ret = btrfs_sync_log(trans, root); | 2006 | ret = btrfs_sync_log(trans, root, &ctx); |
| 1975 | if (!ret) { | 2007 | if (!ret) { |
| 1976 | ret = btrfs_end_transaction(trans, root); | 2008 | ret = btrfs_end_transaction(trans, root); |
| 1977 | goto out; | 2009 | goto out; |
| @@ -2157,6 +2189,7 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len) | |||
| 2157 | bool same_page = ((offset >> PAGE_CACHE_SHIFT) == | 2189 | bool same_page = ((offset >> PAGE_CACHE_SHIFT) == |
| 2158 | ((offset + len - 1) >> PAGE_CACHE_SHIFT)); | 2190 | ((offset + len - 1) >> PAGE_CACHE_SHIFT)); |
| 2159 | bool no_holes = btrfs_fs_incompat(root->fs_info, NO_HOLES); | 2191 | bool no_holes = btrfs_fs_incompat(root->fs_info, NO_HOLES); |
| 2192 | u64 ino_size = round_up(inode->i_size, PAGE_CACHE_SIZE); | ||
| 2160 | 2193 | ||
| 2161 | ret = btrfs_wait_ordered_range(inode, offset, len); | 2194 | ret = btrfs_wait_ordered_range(inode, offset, len); |
| 2162 | if (ret) | 2195 | if (ret) |
| @@ -2172,14 +2205,14 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len) | |||
| 2172 | * entire page. | 2205 | * entire page. |
| 2173 | */ | 2206 | */ |
| 2174 | if (same_page && len < PAGE_CACHE_SIZE) { | 2207 | if (same_page && len < PAGE_CACHE_SIZE) { |
| 2175 | if (offset < round_up(inode->i_size, PAGE_CACHE_SIZE)) | 2208 | if (offset < ino_size) |
| 2176 | ret = btrfs_truncate_page(inode, offset, len, 0); | 2209 | ret = btrfs_truncate_page(inode, offset, len, 0); |
| 2177 | mutex_unlock(&inode->i_mutex); | 2210 | mutex_unlock(&inode->i_mutex); |
| 2178 | return ret; | 2211 | return ret; |
| 2179 | } | 2212 | } |
| 2180 | 2213 | ||
| 2181 | /* zero back part of the first page */ | 2214 | /* zero back part of the first page */ |
| 2182 | if (offset < round_up(inode->i_size, PAGE_CACHE_SIZE)) { | 2215 | if (offset < ino_size) { |
| 2183 | ret = btrfs_truncate_page(inode, offset, 0, 0); | 2216 | ret = btrfs_truncate_page(inode, offset, 0, 0); |
| 2184 | if (ret) { | 2217 | if (ret) { |
| 2185 | mutex_unlock(&inode->i_mutex); | 2218 | mutex_unlock(&inode->i_mutex); |
| @@ -2188,7 +2221,7 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len) | |||
| 2188 | } | 2221 | } |
| 2189 | 2222 | ||
| 2190 | /* zero the front end of the last page */ | 2223 | /* zero the front end of the last page */ |
| 2191 | if (offset + len < round_up(inode->i_size, PAGE_CACHE_SIZE)) { | 2224 | if (offset + len < ino_size) { |
| 2192 | ret = btrfs_truncate_page(inode, offset + len, 0, 1); | 2225 | ret = btrfs_truncate_page(inode, offset + len, 0, 1); |
| 2193 | if (ret) { | 2226 | if (ret) { |
| 2194 | mutex_unlock(&inode->i_mutex); | 2227 | mutex_unlock(&inode->i_mutex); |
| @@ -2277,10 +2310,13 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len) | |||
| 2277 | 2310 | ||
| 2278 | trans->block_rsv = &root->fs_info->trans_block_rsv; | 2311 | trans->block_rsv = &root->fs_info->trans_block_rsv; |
| 2279 | 2312 | ||
| 2280 | ret = fill_holes(trans, inode, path, cur_offset, drop_end); | 2313 | if (cur_offset < ino_size) { |
| 2281 | if (ret) { | 2314 | ret = fill_holes(trans, inode, path, cur_offset, |
| 2282 | err = ret; | 2315 | drop_end); |
| 2283 | break; | 2316 | if (ret) { |
| 2317 | err = ret; | ||
| 2318 | break; | ||
| 2319 | } | ||
| 2284 | } | 2320 | } |
| 2285 | 2321 | ||
| 2286 | cur_offset = drop_end; | 2322 | cur_offset = drop_end; |
| @@ -2313,10 +2349,12 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len) | |||
| 2313 | } | 2349 | } |
| 2314 | 2350 | ||
| 2315 | trans->block_rsv = &root->fs_info->trans_block_rsv; | 2351 | trans->block_rsv = &root->fs_info->trans_block_rsv; |
| 2316 | ret = fill_holes(trans, inode, path, cur_offset, drop_end); | 2352 | if (cur_offset < ino_size) { |
| 2317 | if (ret) { | 2353 | ret = fill_holes(trans, inode, path, cur_offset, drop_end); |
| 2318 | err = ret; | 2354 | if (ret) { |
| 2319 | goto out_trans; | 2355 | err = ret; |
| 2356 | goto out_trans; | ||
| 2357 | } | ||
| 2320 | } | 2358 | } |
| 2321 | 2359 | ||
| 2322 | out_trans: | 2360 | out_trans: |
