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: |