diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 484 |
1 files changed, 294 insertions, 190 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 95542a1b3dfc..67ed24ae86bb 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -71,6 +71,7 @@ static const struct file_operations btrfs_dir_file_operations; | |||
71 | static struct extent_io_ops btrfs_extent_io_ops; | 71 | static struct extent_io_ops btrfs_extent_io_ops; |
72 | 72 | ||
73 | static struct kmem_cache *btrfs_inode_cachep; | 73 | static struct kmem_cache *btrfs_inode_cachep; |
74 | static struct kmem_cache *btrfs_delalloc_work_cachep; | ||
74 | struct kmem_cache *btrfs_trans_handle_cachep; | 75 | struct kmem_cache *btrfs_trans_handle_cachep; |
75 | struct kmem_cache *btrfs_transaction_cachep; | 76 | struct kmem_cache *btrfs_transaction_cachep; |
76 | struct kmem_cache *btrfs_path_cachep; | 77 | struct kmem_cache *btrfs_path_cachep; |
@@ -94,6 +95,10 @@ static noinline int cow_file_range(struct inode *inode, | |||
94 | struct page *locked_page, | 95 | struct page *locked_page, |
95 | u64 start, u64 end, int *page_started, | 96 | u64 start, u64 end, int *page_started, |
96 | unsigned long *nr_written, int unlock); | 97 | unsigned long *nr_written, int unlock); |
98 | static struct extent_map *create_pinned_em(struct inode *inode, u64 start, | ||
99 | u64 len, u64 orig_start, | ||
100 | u64 block_start, u64 block_len, | ||
101 | u64 orig_block_len, int type); | ||
97 | 102 | ||
98 | static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, | 103 | static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, |
99 | struct inode *inode, struct inode *dir, | 104 | struct inode *inode, struct inode *dir, |
@@ -698,14 +703,19 @@ retry: | |||
698 | 703 | ||
699 | em->block_start = ins.objectid; | 704 | em->block_start = ins.objectid; |
700 | em->block_len = ins.offset; | 705 | em->block_len = ins.offset; |
706 | em->orig_block_len = ins.offset; | ||
701 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 707 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
702 | em->compress_type = async_extent->compress_type; | 708 | em->compress_type = async_extent->compress_type; |
703 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 709 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
704 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 710 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
711 | em->generation = -1; | ||
705 | 712 | ||
706 | while (1) { | 713 | while (1) { |
707 | write_lock(&em_tree->lock); | 714 | write_lock(&em_tree->lock); |
708 | ret = add_extent_mapping(em_tree, em); | 715 | ret = add_extent_mapping(em_tree, em); |
716 | if (!ret) | ||
717 | list_move(&em->list, | ||
718 | &em_tree->modified_extents); | ||
709 | write_unlock(&em_tree->lock); | 719 | write_unlock(&em_tree->lock); |
710 | if (ret != -EEXIST) { | 720 | if (ret != -EEXIST) { |
711 | free_extent_map(em); | 721 | free_extent_map(em); |
@@ -803,14 +813,14 @@ static u64 get_extent_allocation_hint(struct inode *inode, u64 start, | |||
803 | * required to start IO on it. It may be clean and already done with | 813 | * required to start IO on it. It may be clean and already done with |
804 | * IO when we return. | 814 | * IO when we return. |
805 | */ | 815 | */ |
806 | static noinline int cow_file_range(struct inode *inode, | 816 | static noinline int __cow_file_range(struct btrfs_trans_handle *trans, |
807 | struct page *locked_page, | 817 | struct inode *inode, |
808 | u64 start, u64 end, int *page_started, | 818 | struct btrfs_root *root, |
809 | unsigned long *nr_written, | 819 | struct page *locked_page, |
810 | int unlock) | 820 | u64 start, u64 end, int *page_started, |
821 | unsigned long *nr_written, | ||
822 | int unlock) | ||
811 | { | 823 | { |
812 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
813 | struct btrfs_trans_handle *trans; | ||
814 | u64 alloc_hint = 0; | 824 | u64 alloc_hint = 0; |
815 | u64 num_bytes; | 825 | u64 num_bytes; |
816 | unsigned long ram_size; | 826 | unsigned long ram_size; |
@@ -823,25 +833,10 @@ static noinline int cow_file_range(struct inode *inode, | |||
823 | int ret = 0; | 833 | int ret = 0; |
824 | 834 | ||
825 | BUG_ON(btrfs_is_free_space_inode(inode)); | 835 | BUG_ON(btrfs_is_free_space_inode(inode)); |
826 | trans = btrfs_join_transaction(root); | ||
827 | if (IS_ERR(trans)) { | ||
828 | extent_clear_unlock_delalloc(inode, | ||
829 | &BTRFS_I(inode)->io_tree, | ||
830 | start, end, locked_page, | ||
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 | } | ||
839 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | ||
840 | 836 | ||
841 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); | 837 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); |
842 | num_bytes = max(blocksize, num_bytes); | 838 | num_bytes = max(blocksize, num_bytes); |
843 | disk_num_bytes = num_bytes; | 839 | disk_num_bytes = num_bytes; |
844 | ret = 0; | ||
845 | 840 | ||
846 | /* if this is a small write inside eof, kick off defrag */ | 841 | /* if this is a small write inside eof, kick off defrag */ |
847 | if (num_bytes < 64 * 1024 && | 842 | if (num_bytes < 64 * 1024 && |
@@ -900,12 +895,17 @@ static noinline int cow_file_range(struct inode *inode, | |||
900 | 895 | ||
901 | em->block_start = ins.objectid; | 896 | em->block_start = ins.objectid; |
902 | em->block_len = ins.offset; | 897 | em->block_len = ins.offset; |
898 | em->orig_block_len = ins.offset; | ||
903 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 899 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
904 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 900 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
901 | em->generation = -1; | ||
905 | 902 | ||
906 | while (1) { | 903 | while (1) { |
907 | write_lock(&em_tree->lock); | 904 | write_lock(&em_tree->lock); |
908 | ret = add_extent_mapping(em_tree, em); | 905 | ret = add_extent_mapping(em_tree, em); |
906 | if (!ret) | ||
907 | list_move(&em->list, | ||
908 | &em_tree->modified_extents); | ||
909 | write_unlock(&em_tree->lock); | 909 | write_unlock(&em_tree->lock); |
910 | if (ret != -EEXIST) { | 910 | if (ret != -EEXIST) { |
911 | free_extent_map(em); | 911 | free_extent_map(em); |
@@ -952,11 +952,9 @@ static noinline int cow_file_range(struct inode *inode, | |||
952 | alloc_hint = ins.objectid + ins.offset; | 952 | alloc_hint = ins.objectid + ins.offset; |
953 | start += cur_alloc_size; | 953 | start += cur_alloc_size; |
954 | } | 954 | } |
955 | ret = 0; | ||
956 | out: | 955 | out: |
957 | btrfs_end_transaction(trans, root); | ||
958 | |||
959 | return ret; | 956 | return ret; |
957 | |||
960 | out_unlock: | 958 | out_unlock: |
961 | extent_clear_unlock_delalloc(inode, | 959 | extent_clear_unlock_delalloc(inode, |
962 | &BTRFS_I(inode)->io_tree, | 960 | &BTRFS_I(inode)->io_tree, |
@@ -971,6 +969,39 @@ out_unlock: | |||
971 | goto out; | 969 | goto out; |
972 | } | 970 | } |
973 | 971 | ||
972 | static noinline int cow_file_range(struct inode *inode, | ||
973 | struct page *locked_page, | ||
974 | u64 start, u64 end, int *page_started, | ||
975 | unsigned long *nr_written, | ||
976 | int unlock) | ||
977 | { | ||
978 | struct btrfs_trans_handle *trans; | ||
979 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
980 | int ret; | ||
981 | |||
982 | trans = btrfs_join_transaction(root); | ||
983 | if (IS_ERR(trans)) { | ||
984 | extent_clear_unlock_delalloc(inode, | ||
985 | &BTRFS_I(inode)->io_tree, | ||
986 | start, end, locked_page, | ||
987 | EXTENT_CLEAR_UNLOCK_PAGE | | ||
988 | EXTENT_CLEAR_UNLOCK | | ||
989 | EXTENT_CLEAR_DELALLOC | | ||
990 | EXTENT_CLEAR_DIRTY | | ||
991 | EXTENT_SET_WRITEBACK | | ||
992 | EXTENT_END_WRITEBACK); | ||
993 | return PTR_ERR(trans); | ||
994 | } | ||
995 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | ||
996 | |||
997 | ret = __cow_file_range(trans, inode, root, locked_page, start, end, | ||
998 | page_started, nr_written, unlock); | ||
999 | |||
1000 | btrfs_end_transaction(trans, root); | ||
1001 | |||
1002 | return ret; | ||
1003 | } | ||
1004 | |||
974 | /* | 1005 | /* |
975 | * work queue call back to started compression on a file and pages | 1006 | * work queue call back to started compression on a file and pages |
976 | */ | 1007 | */ |
@@ -1126,6 +1157,7 @@ static noinline int run_delalloc_nocow(struct inode *inode, | |||
1126 | u64 extent_offset; | 1157 | u64 extent_offset; |
1127 | u64 disk_bytenr; | 1158 | u64 disk_bytenr; |
1128 | u64 num_bytes; | 1159 | u64 num_bytes; |
1160 | u64 disk_num_bytes; | ||
1129 | int extent_type; | 1161 | int extent_type; |
1130 | int ret, err; | 1162 | int ret, err; |
1131 | int type; | 1163 | int type; |
@@ -1228,6 +1260,8 @@ next_slot: | |||
1228 | extent_offset = btrfs_file_extent_offset(leaf, fi); | 1260 | extent_offset = btrfs_file_extent_offset(leaf, fi); |
1229 | extent_end = found_key.offset + | 1261 | extent_end = found_key.offset + |
1230 | btrfs_file_extent_num_bytes(leaf, fi); | 1262 | btrfs_file_extent_num_bytes(leaf, fi); |
1263 | disk_num_bytes = | ||
1264 | btrfs_file_extent_disk_num_bytes(leaf, fi); | ||
1231 | if (extent_end <= start) { | 1265 | if (extent_end <= start) { |
1232 | path->slots[0]++; | 1266 | path->slots[0]++; |
1233 | goto next_slot; | 1267 | goto next_slot; |
@@ -1281,9 +1315,9 @@ out_check: | |||
1281 | 1315 | ||
1282 | btrfs_release_path(path); | 1316 | btrfs_release_path(path); |
1283 | if (cow_start != (u64)-1) { | 1317 | if (cow_start != (u64)-1) { |
1284 | ret = cow_file_range(inode, locked_page, cow_start, | 1318 | ret = __cow_file_range(trans, inode, root, locked_page, |
1285 | found_key.offset - 1, page_started, | 1319 | cow_start, found_key.offset - 1, |
1286 | nr_written, 1); | 1320 | page_started, nr_written, 1); |
1287 | if (ret) { | 1321 | if (ret) { |
1288 | btrfs_abort_transaction(trans, root, ret); | 1322 | btrfs_abort_transaction(trans, root, ret); |
1289 | goto error; | 1323 | goto error; |
@@ -1298,16 +1332,21 @@ out_check: | |||
1298 | em = alloc_extent_map(); | 1332 | em = alloc_extent_map(); |
1299 | BUG_ON(!em); /* -ENOMEM */ | 1333 | BUG_ON(!em); /* -ENOMEM */ |
1300 | em->start = cur_offset; | 1334 | em->start = cur_offset; |
1301 | em->orig_start = em->start; | 1335 | em->orig_start = found_key.offset - extent_offset; |
1302 | em->len = num_bytes; | 1336 | em->len = num_bytes; |
1303 | em->block_len = num_bytes; | 1337 | em->block_len = num_bytes; |
1304 | em->block_start = disk_bytenr; | 1338 | em->block_start = disk_bytenr; |
1339 | em->orig_block_len = disk_num_bytes; | ||
1305 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 1340 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
1306 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 1341 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
1307 | set_bit(EXTENT_FLAG_PREALLOC, &em->flags); | 1342 | set_bit(EXTENT_FLAG_FILLING, &em->flags); |
1343 | em->generation = -1; | ||
1308 | while (1) { | 1344 | while (1) { |
1309 | write_lock(&em_tree->lock); | 1345 | write_lock(&em_tree->lock); |
1310 | ret = add_extent_mapping(em_tree, em); | 1346 | ret = add_extent_mapping(em_tree, em); |
1347 | if (!ret) | ||
1348 | list_move(&em->list, | ||
1349 | &em_tree->modified_extents); | ||
1311 | write_unlock(&em_tree->lock); | 1350 | write_unlock(&em_tree->lock); |
1312 | if (ret != -EEXIST) { | 1351 | if (ret != -EEXIST) { |
1313 | free_extent_map(em); | 1352 | free_extent_map(em); |
@@ -1352,8 +1391,9 @@ out_check: | |||
1352 | } | 1391 | } |
1353 | 1392 | ||
1354 | if (cow_start != (u64)-1) { | 1393 | if (cow_start != (u64)-1) { |
1355 | ret = cow_file_range(inode, locked_page, cow_start, end, | 1394 | ret = __cow_file_range(trans, inode, root, locked_page, |
1356 | page_started, nr_written, 1); | 1395 | cow_start, end, |
1396 | page_started, nr_written, 1); | ||
1357 | if (ret) { | 1397 | if (ret) { |
1358 | btrfs_abort_transaction(trans, root, ret); | 1398 | btrfs_abort_transaction(trans, root, ret); |
1359 | goto error; | 1399 | goto error; |
@@ -1531,7 +1571,6 @@ int btrfs_merge_bio_hook(struct page *page, unsigned long offset, | |||
1531 | unsigned long bio_flags) | 1571 | unsigned long bio_flags) |
1532 | { | 1572 | { |
1533 | struct btrfs_root *root = BTRFS_I(page->mapping->host)->root; | 1573 | struct btrfs_root *root = BTRFS_I(page->mapping->host)->root; |
1534 | struct btrfs_mapping_tree *map_tree; | ||
1535 | u64 logical = (u64)bio->bi_sector << 9; | 1574 | u64 logical = (u64)bio->bi_sector << 9; |
1536 | u64 length = 0; | 1575 | u64 length = 0; |
1537 | u64 map_length; | 1576 | u64 map_length; |
@@ -1541,11 +1580,10 @@ int btrfs_merge_bio_hook(struct page *page, unsigned long offset, | |||
1541 | return 0; | 1580 | return 0; |
1542 | 1581 | ||
1543 | length = bio->bi_size; | 1582 | length = bio->bi_size; |
1544 | map_tree = &root->fs_info->mapping_tree; | ||
1545 | map_length = length; | 1583 | map_length = length; |
1546 | ret = btrfs_map_block(map_tree, READ, logical, | 1584 | ret = btrfs_map_block(root->fs_info, READ, logical, |
1547 | &map_length, NULL, 0); | 1585 | &map_length, NULL, 0); |
1548 | /* Will always return 0 or 1 with map_multi == NULL */ | 1586 | /* Will always return 0 with map_multi == NULL */ |
1549 | BUG_ON(ret < 0); | 1587 | BUG_ON(ret < 0); |
1550 | if (map_length < length + size) | 1588 | if (map_length < length + size) |
1551 | return 1; | 1589 | return 1; |
@@ -1586,7 +1624,12 @@ static int __btrfs_submit_bio_done(struct inode *inode, int rw, struct bio *bio, | |||
1586 | u64 bio_offset) | 1624 | u64 bio_offset) |
1587 | { | 1625 | { |
1588 | struct btrfs_root *root = BTRFS_I(inode)->root; | 1626 | struct btrfs_root *root = BTRFS_I(inode)->root; |
1589 | return btrfs_map_bio(root, rw, bio, mirror_num, 1); | 1627 | int ret; |
1628 | |||
1629 | ret = btrfs_map_bio(root, rw, bio, mirror_num, 1); | ||
1630 | if (ret) | ||
1631 | bio_endio(bio, ret); | ||
1632 | return ret; | ||
1590 | } | 1633 | } |
1591 | 1634 | ||
1592 | /* | 1635 | /* |
@@ -1601,6 +1644,7 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, | |||
1601 | int ret = 0; | 1644 | int ret = 0; |
1602 | int skip_sum; | 1645 | int skip_sum; |
1603 | int metadata = 0; | 1646 | int metadata = 0; |
1647 | int async = !atomic_read(&BTRFS_I(inode)->sync_writers); | ||
1604 | 1648 | ||
1605 | skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; | 1649 | skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM; |
1606 | 1650 | ||
@@ -1610,31 +1654,43 @@ static int btrfs_submit_bio_hook(struct inode *inode, int rw, struct bio *bio, | |||
1610 | if (!(rw & REQ_WRITE)) { | 1654 | if (!(rw & REQ_WRITE)) { |
1611 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, metadata); | 1655 | ret = btrfs_bio_wq_end_io(root->fs_info, bio, metadata); |
1612 | if (ret) | 1656 | if (ret) |
1613 | return ret; | 1657 | goto out; |
1614 | 1658 | ||
1615 | if (bio_flags & EXTENT_BIO_COMPRESSED) { | 1659 | if (bio_flags & EXTENT_BIO_COMPRESSED) { |
1616 | return btrfs_submit_compressed_read(inode, bio, | 1660 | ret = btrfs_submit_compressed_read(inode, bio, |
1617 | mirror_num, bio_flags); | 1661 | mirror_num, |
1662 | bio_flags); | ||
1663 | goto out; | ||
1618 | } else if (!skip_sum) { | 1664 | } else if (!skip_sum) { |
1619 | ret = btrfs_lookup_bio_sums(root, inode, bio, NULL); | 1665 | ret = btrfs_lookup_bio_sums(root, inode, bio, NULL); |
1620 | if (ret) | 1666 | if (ret) |
1621 | return ret; | 1667 | goto out; |
1622 | } | 1668 | } |
1623 | goto mapit; | 1669 | goto mapit; |
1624 | } else if (!skip_sum) { | 1670 | } else if (async && !skip_sum) { |
1625 | /* csum items have already been cloned */ | 1671 | /* csum items have already been cloned */ |
1626 | if (root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID) | 1672 | if (root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID) |
1627 | goto mapit; | 1673 | goto mapit; |
1628 | /* we're doing a write, do the async checksumming */ | 1674 | /* we're doing a write, do the async checksumming */ |
1629 | return btrfs_wq_submit_bio(BTRFS_I(inode)->root->fs_info, | 1675 | ret = btrfs_wq_submit_bio(BTRFS_I(inode)->root->fs_info, |
1630 | inode, rw, bio, mirror_num, | 1676 | inode, rw, bio, mirror_num, |
1631 | bio_flags, bio_offset, | 1677 | bio_flags, bio_offset, |
1632 | __btrfs_submit_bio_start, | 1678 | __btrfs_submit_bio_start, |
1633 | __btrfs_submit_bio_done); | 1679 | __btrfs_submit_bio_done); |
1680 | goto out; | ||
1681 | } else if (!skip_sum) { | ||
1682 | ret = btrfs_csum_one_bio(root, inode, bio, 0, 0); | ||
1683 | if (ret) | ||
1684 | goto out; | ||
1634 | } | 1685 | } |
1635 | 1686 | ||
1636 | mapit: | 1687 | mapit: |
1637 | return btrfs_map_bio(root, rw, bio, mirror_num, 0); | 1688 | ret = btrfs_map_bio(root, rw, bio, mirror_num, 0); |
1689 | |||
1690 | out: | ||
1691 | if (ret < 0) | ||
1692 | bio_endio(bio, ret); | ||
1693 | return ret; | ||
1638 | } | 1694 | } |
1639 | 1695 | ||
1640 | /* | 1696 | /* |
@@ -1657,8 +1713,7 @@ static noinline int add_pending_csums(struct btrfs_trans_handle *trans, | |||
1657 | int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end, | 1713 | int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end, |
1658 | struct extent_state **cached_state) | 1714 | struct extent_state **cached_state) |
1659 | { | 1715 | { |
1660 | if ((end & (PAGE_CACHE_SIZE - 1)) == 0) | 1716 | WARN_ON((end & (PAGE_CACHE_SIZE - 1)) == 0); |
1661 | WARN_ON(1); | ||
1662 | return set_extent_delalloc(&BTRFS_I(inode)->io_tree, start, end, | 1717 | return set_extent_delalloc(&BTRFS_I(inode)->io_tree, start, end, |
1663 | cached_state, GFP_NOFS); | 1718 | cached_state, GFP_NOFS); |
1664 | } | 1719 | } |
@@ -1867,22 +1922,20 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent) | |||
1867 | 1922 | ||
1868 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { | 1923 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { |
1869 | BUG_ON(!list_empty(&ordered_extent->list)); /* Logic error */ | 1924 | BUG_ON(!list_empty(&ordered_extent->list)); /* Logic error */ |
1870 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); | 1925 | btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
1871 | if (!ret) { | 1926 | if (nolock) |
1872 | if (nolock) | 1927 | trans = btrfs_join_transaction_nolock(root); |
1873 | trans = btrfs_join_transaction_nolock(root); | 1928 | else |
1874 | else | 1929 | trans = btrfs_join_transaction(root); |
1875 | trans = btrfs_join_transaction(root); | 1930 | if (IS_ERR(trans)) { |
1876 | if (IS_ERR(trans)) { | 1931 | ret = PTR_ERR(trans); |
1877 | ret = PTR_ERR(trans); | 1932 | trans = NULL; |
1878 | trans = NULL; | 1933 | goto out; |
1879 | goto out; | ||
1880 | } | ||
1881 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | ||
1882 | ret = btrfs_update_inode_fallback(trans, root, inode); | ||
1883 | if (ret) /* -ENOMEM or corruption */ | ||
1884 | btrfs_abort_transaction(trans, root, ret); | ||
1885 | } | 1934 | } |
1935 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | ||
1936 | ret = btrfs_update_inode_fallback(trans, root, inode); | ||
1937 | if (ret) /* -ENOMEM or corruption */ | ||
1938 | btrfs_abort_transaction(trans, root, ret); | ||
1886 | goto out; | 1939 | goto out; |
1887 | } | 1940 | } |
1888 | 1941 | ||
@@ -1931,15 +1984,11 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent) | |||
1931 | add_pending_csums(trans, inode, ordered_extent->file_offset, | 1984 | add_pending_csums(trans, inode, ordered_extent->file_offset, |
1932 | &ordered_extent->list); | 1985 | &ordered_extent->list); |
1933 | 1986 | ||
1934 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); | 1987 | btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
1935 | if (!ret || !test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) { | 1988 | ret = btrfs_update_inode_fallback(trans, root, inode); |
1936 | ret = btrfs_update_inode_fallback(trans, root, inode); | 1989 | if (ret) { /* -ENOMEM or corruption */ |
1937 | if (ret) { /* -ENOMEM or corruption */ | 1990 | btrfs_abort_transaction(trans, root, ret); |
1938 | btrfs_abort_transaction(trans, root, ret); | 1991 | goto out_unlock; |
1939 | goto out_unlock; | ||
1940 | } | ||
1941 | } else { | ||
1942 | btrfs_set_inode_last_trans(trans, inode); | ||
1943 | } | 1992 | } |
1944 | ret = 0; | 1993 | ret = 0; |
1945 | out_unlock: | 1994 | out_unlock: |
@@ -3074,7 +3123,6 @@ static int btrfs_unlink(struct inode *dir, struct dentry *dentry) | |||
3074 | struct btrfs_trans_handle *trans; | 3123 | struct btrfs_trans_handle *trans; |
3075 | struct inode *inode = dentry->d_inode; | 3124 | struct inode *inode = dentry->d_inode; |
3076 | int ret; | 3125 | int ret; |
3077 | unsigned long nr = 0; | ||
3078 | 3126 | ||
3079 | trans = __unlink_start_trans(dir, dentry); | 3127 | trans = __unlink_start_trans(dir, dentry); |
3080 | if (IS_ERR(trans)) | 3128 | if (IS_ERR(trans)) |
@@ -3094,9 +3142,8 @@ static int btrfs_unlink(struct inode *dir, struct dentry *dentry) | |||
3094 | } | 3142 | } |
3095 | 3143 | ||
3096 | out: | 3144 | out: |
3097 | nr = trans->blocks_used; | ||
3098 | __unlink_end_trans(trans, root); | 3145 | __unlink_end_trans(trans, root); |
3099 | btrfs_btree_balance_dirty(root, nr); | 3146 | btrfs_btree_balance_dirty(root); |
3100 | return ret; | 3147 | return ret; |
3101 | } | 3148 | } |
3102 | 3149 | ||
@@ -3186,7 +3233,6 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
3186 | int err = 0; | 3233 | int err = 0; |
3187 | struct btrfs_root *root = BTRFS_I(dir)->root; | 3234 | struct btrfs_root *root = BTRFS_I(dir)->root; |
3188 | struct btrfs_trans_handle *trans; | 3235 | struct btrfs_trans_handle *trans; |
3189 | unsigned long nr = 0; | ||
3190 | 3236 | ||
3191 | if (inode->i_size > BTRFS_EMPTY_DIR_SIZE) | 3237 | if (inode->i_size > BTRFS_EMPTY_DIR_SIZE) |
3192 | return -ENOTEMPTY; | 3238 | return -ENOTEMPTY; |
@@ -3215,9 +3261,8 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
3215 | if (!err) | 3261 | if (!err) |
3216 | btrfs_i_size_write(inode, 0); | 3262 | btrfs_i_size_write(inode, 0); |
3217 | out: | 3263 | out: |
3218 | nr = trans->blocks_used; | ||
3219 | __unlink_end_trans(trans, root); | 3264 | __unlink_end_trans(trans, root); |
3220 | btrfs_btree_balance_dirty(root, nr); | 3265 | btrfs_btree_balance_dirty(root); |
3221 | 3266 | ||
3222 | return err; | 3267 | return err; |
3223 | } | 3268 | } |
@@ -3497,11 +3542,11 @@ int btrfs_truncate_page(struct inode *inode, loff_t from, loff_t len, | |||
3497 | if (ret) | 3542 | if (ret) |
3498 | goto out; | 3543 | goto out; |
3499 | 3544 | ||
3500 | ret = -ENOMEM; | ||
3501 | again: | 3545 | again: |
3502 | page = find_or_create_page(mapping, index, mask); | 3546 | page = find_or_create_page(mapping, index, mask); |
3503 | if (!page) { | 3547 | if (!page) { |
3504 | btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE); | 3548 | btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE); |
3549 | ret = -ENOMEM; | ||
3505 | goto out; | 3550 | goto out; |
3506 | } | 3551 | } |
3507 | 3552 | ||
@@ -3550,7 +3595,6 @@ again: | |||
3550 | goto out_unlock; | 3595 | goto out_unlock; |
3551 | } | 3596 | } |
3552 | 3597 | ||
3553 | ret = 0; | ||
3554 | if (offset != PAGE_CACHE_SIZE) { | 3598 | if (offset != PAGE_CACHE_SIZE) { |
3555 | if (!len) | 3599 | if (!len) |
3556 | len = PAGE_CACHE_SIZE - offset; | 3600 | len = PAGE_CACHE_SIZE - offset; |
@@ -3668,6 +3712,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | |||
3668 | 3712 | ||
3669 | hole_em->block_start = EXTENT_MAP_HOLE; | 3713 | hole_em->block_start = EXTENT_MAP_HOLE; |
3670 | hole_em->block_len = 0; | 3714 | hole_em->block_len = 0; |
3715 | hole_em->orig_block_len = 0; | ||
3671 | hole_em->bdev = root->fs_info->fs_devices->latest_bdev; | 3716 | hole_em->bdev = root->fs_info->fs_devices->latest_bdev; |
3672 | hole_em->compress_type = BTRFS_COMPRESS_NONE; | 3717 | hole_em->compress_type = BTRFS_COMPRESS_NONE; |
3673 | hole_em->generation = trans->transid; | 3718 | hole_em->generation = trans->transid; |
@@ -3783,7 +3828,6 @@ void btrfs_evict_inode(struct inode *inode) | |||
3783 | struct btrfs_root *root = BTRFS_I(inode)->root; | 3828 | struct btrfs_root *root = BTRFS_I(inode)->root; |
3784 | struct btrfs_block_rsv *rsv, *global_rsv; | 3829 | struct btrfs_block_rsv *rsv, *global_rsv; |
3785 | u64 min_size = btrfs_calc_trunc_metadata_size(root, 1); | 3830 | u64 min_size = btrfs_calc_trunc_metadata_size(root, 1); |
3786 | unsigned long nr; | ||
3787 | int ret; | 3831 | int ret; |
3788 | 3832 | ||
3789 | trace_btrfs_inode_evict(inode); | 3833 | trace_btrfs_inode_evict(inode); |
@@ -3829,7 +3873,8 @@ void btrfs_evict_inode(struct inode *inode) | |||
3829 | * inode item when doing the truncate. | 3873 | * inode item when doing the truncate. |
3830 | */ | 3874 | */ |
3831 | while (1) { | 3875 | while (1) { |
3832 | ret = btrfs_block_rsv_refill_noflush(root, rsv, min_size); | 3876 | ret = btrfs_block_rsv_refill(root, rsv, min_size, |
3877 | BTRFS_RESERVE_FLUSH_LIMIT); | ||
3833 | 3878 | ||
3834 | /* | 3879 | /* |
3835 | * Try and steal from the global reserve since we will | 3880 | * Try and steal from the global reserve since we will |
@@ -3847,7 +3892,7 @@ void btrfs_evict_inode(struct inode *inode) | |||
3847 | goto no_delete; | 3892 | goto no_delete; |
3848 | } | 3893 | } |
3849 | 3894 | ||
3850 | trans = btrfs_start_transaction_noflush(root, 1); | 3895 | trans = btrfs_start_transaction_lflush(root, 1); |
3851 | if (IS_ERR(trans)) { | 3896 | if (IS_ERR(trans)) { |
3852 | btrfs_orphan_del(NULL, inode); | 3897 | btrfs_orphan_del(NULL, inode); |
3853 | btrfs_free_block_rsv(root, rsv); | 3898 | btrfs_free_block_rsv(root, rsv); |
@@ -3864,10 +3909,9 @@ void btrfs_evict_inode(struct inode *inode) | |||
3864 | ret = btrfs_update_inode(trans, root, inode); | 3909 | ret = btrfs_update_inode(trans, root, inode); |
3865 | BUG_ON(ret); | 3910 | BUG_ON(ret); |
3866 | 3911 | ||
3867 | nr = trans->blocks_used; | ||
3868 | btrfs_end_transaction(trans, root); | 3912 | btrfs_end_transaction(trans, root); |
3869 | trans = NULL; | 3913 | trans = NULL; |
3870 | btrfs_btree_balance_dirty(root, nr); | 3914 | btrfs_btree_balance_dirty(root); |
3871 | } | 3915 | } |
3872 | 3916 | ||
3873 | btrfs_free_block_rsv(root, rsv); | 3917 | btrfs_free_block_rsv(root, rsv); |
@@ -3883,9 +3927,8 @@ void btrfs_evict_inode(struct inode *inode) | |||
3883 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)) | 3927 | root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)) |
3884 | btrfs_return_ino(root, btrfs_ino(inode)); | 3928 | btrfs_return_ino(root, btrfs_ino(inode)); |
3885 | 3929 | ||
3886 | nr = trans->blocks_used; | ||
3887 | btrfs_end_transaction(trans, root); | 3930 | btrfs_end_transaction(trans, root); |
3888 | btrfs_btree_balance_dirty(root, nr); | 3931 | btrfs_btree_balance_dirty(root); |
3889 | no_delete: | 3932 | no_delete: |
3890 | clear_inode(inode); | 3933 | clear_inode(inode); |
3891 | return; | 3934 | return; |
@@ -4775,8 +4818,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4775 | if (S_ISREG(mode)) { | 4818 | if (S_ISREG(mode)) { |
4776 | if (btrfs_test_opt(root, NODATASUM)) | 4819 | if (btrfs_test_opt(root, NODATASUM)) |
4777 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; | 4820 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; |
4778 | if (btrfs_test_opt(root, NODATACOW) || | 4821 | if (btrfs_test_opt(root, NODATACOW)) |
4779 | (BTRFS_I(dir)->flags & BTRFS_INODE_NODATACOW)) | ||
4780 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; | 4822 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; |
4781 | } | 4823 | } |
4782 | 4824 | ||
@@ -4842,7 +4884,7 @@ int btrfs_add_link(struct btrfs_trans_handle *trans, | |||
4842 | ret = btrfs_insert_dir_item(trans, root, name, name_len, | 4884 | ret = btrfs_insert_dir_item(trans, root, name, name_len, |
4843 | parent_inode, &key, | 4885 | parent_inode, &key, |
4844 | btrfs_inode_type(inode), index); | 4886 | btrfs_inode_type(inode), index); |
4845 | if (ret == -EEXIST) | 4887 | if (ret == -EEXIST || ret == -EOVERFLOW) |
4846 | goto fail_dir_item; | 4888 | goto fail_dir_item; |
4847 | else if (ret) { | 4889 | else if (ret) { |
4848 | btrfs_abort_transaction(trans, root, ret); | 4890 | btrfs_abort_transaction(trans, root, ret); |
@@ -4897,7 +4939,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4897 | int err; | 4939 | int err; |
4898 | int drop_inode = 0; | 4940 | int drop_inode = 0; |
4899 | u64 objectid; | 4941 | u64 objectid; |
4900 | unsigned long nr = 0; | ||
4901 | u64 index = 0; | 4942 | u64 index = 0; |
4902 | 4943 | ||
4903 | if (!new_valid_dev(rdev)) | 4944 | if (!new_valid_dev(rdev)) |
@@ -4930,6 +4971,12 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4930 | goto out_unlock; | 4971 | goto out_unlock; |
4931 | } | 4972 | } |
4932 | 4973 | ||
4974 | err = btrfs_update_inode(trans, root, inode); | ||
4975 | if (err) { | ||
4976 | drop_inode = 1; | ||
4977 | goto out_unlock; | ||
4978 | } | ||
4979 | |||
4933 | /* | 4980 | /* |
4934 | * If the active LSM wants to access the inode during | 4981 | * If the active LSM wants to access the inode during |
4935 | * d_instantiate it needs these. Smack checks to see | 4982 | * d_instantiate it needs these. Smack checks to see |
@@ -4947,9 +4994,8 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4947 | d_instantiate(dentry, inode); | 4994 | d_instantiate(dentry, inode); |
4948 | } | 4995 | } |
4949 | out_unlock: | 4996 | out_unlock: |
4950 | nr = trans->blocks_used; | ||
4951 | btrfs_end_transaction(trans, root); | 4997 | btrfs_end_transaction(trans, root); |
4952 | btrfs_btree_balance_dirty(root, nr); | 4998 | btrfs_btree_balance_dirty(root); |
4953 | if (drop_inode) { | 4999 | if (drop_inode) { |
4954 | inode_dec_link_count(inode); | 5000 | inode_dec_link_count(inode); |
4955 | iput(inode); | 5001 | iput(inode); |
@@ -4963,9 +5009,8 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4963 | struct btrfs_trans_handle *trans; | 5009 | struct btrfs_trans_handle *trans; |
4964 | struct btrfs_root *root = BTRFS_I(dir)->root; | 5010 | struct btrfs_root *root = BTRFS_I(dir)->root; |
4965 | struct inode *inode = NULL; | 5011 | struct inode *inode = NULL; |
4966 | int drop_inode = 0; | 5012 | int drop_inode_on_err = 0; |
4967 | int err; | 5013 | int err; |
4968 | unsigned long nr = 0; | ||
4969 | u64 objectid; | 5014 | u64 objectid; |
4970 | u64 index = 0; | 5015 | u64 index = 0; |
4971 | 5016 | ||
@@ -4989,12 +5034,15 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4989 | err = PTR_ERR(inode); | 5034 | err = PTR_ERR(inode); |
4990 | goto out_unlock; | 5035 | goto out_unlock; |
4991 | } | 5036 | } |
5037 | drop_inode_on_err = 1; | ||
4992 | 5038 | ||
4993 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); | 5039 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
4994 | if (err) { | 5040 | if (err) |
4995 | drop_inode = 1; | 5041 | goto out_unlock; |
5042 | |||
5043 | err = btrfs_update_inode(trans, root, inode); | ||
5044 | if (err) | ||
4996 | goto out_unlock; | 5045 | goto out_unlock; |
4997 | } | ||
4998 | 5046 | ||
4999 | /* | 5047 | /* |
5000 | * If the active LSM wants to access the inode during | 5048 | * If the active LSM wants to access the inode during |
@@ -5007,21 +5055,20 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
5007 | 5055 | ||
5008 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 5056 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
5009 | if (err) | 5057 | if (err) |
5010 | drop_inode = 1; | 5058 | goto out_unlock; |
5011 | else { | 5059 | |
5012 | inode->i_mapping->a_ops = &btrfs_aops; | 5060 | inode->i_mapping->a_ops = &btrfs_aops; |
5013 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; | 5061 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; |
5014 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | 5062 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; |
5015 | d_instantiate(dentry, inode); | 5063 | d_instantiate(dentry, inode); |
5016 | } | 5064 | |
5017 | out_unlock: | 5065 | out_unlock: |
5018 | nr = trans->blocks_used; | ||
5019 | btrfs_end_transaction(trans, root); | 5066 | btrfs_end_transaction(trans, root); |
5020 | if (drop_inode) { | 5067 | if (err && drop_inode_on_err) { |
5021 | inode_dec_link_count(inode); | 5068 | inode_dec_link_count(inode); |
5022 | iput(inode); | 5069 | iput(inode); |
5023 | } | 5070 | } |
5024 | btrfs_btree_balance_dirty(root, nr); | 5071 | btrfs_btree_balance_dirty(root); |
5025 | return err; | 5072 | return err; |
5026 | } | 5073 | } |
5027 | 5074 | ||
@@ -5032,7 +5079,6 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
5032 | struct btrfs_root *root = BTRFS_I(dir)->root; | 5079 | struct btrfs_root *root = BTRFS_I(dir)->root; |
5033 | struct inode *inode = old_dentry->d_inode; | 5080 | struct inode *inode = old_dentry->d_inode; |
5034 | u64 index; | 5081 | u64 index; |
5035 | unsigned long nr = 0; | ||
5036 | int err; | 5082 | int err; |
5037 | int drop_inode = 0; | 5083 | int drop_inode = 0; |
5038 | 5084 | ||
@@ -5062,6 +5108,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
5062 | inode_inc_iversion(inode); | 5108 | inode_inc_iversion(inode); |
5063 | inode->i_ctime = CURRENT_TIME; | 5109 | inode->i_ctime = CURRENT_TIME; |
5064 | ihold(inode); | 5110 | ihold(inode); |
5111 | set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags); | ||
5065 | 5112 | ||
5066 | err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); | 5113 | err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); |
5067 | 5114 | ||
@@ -5076,14 +5123,13 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
5076 | btrfs_log_new_name(trans, inode, NULL, parent); | 5123 | btrfs_log_new_name(trans, inode, NULL, parent); |
5077 | } | 5124 | } |
5078 | 5125 | ||
5079 | nr = trans->blocks_used; | ||
5080 | btrfs_end_transaction(trans, root); | 5126 | btrfs_end_transaction(trans, root); |
5081 | fail: | 5127 | fail: |
5082 | if (drop_inode) { | 5128 | if (drop_inode) { |
5083 | inode_dec_link_count(inode); | 5129 | inode_dec_link_count(inode); |
5084 | iput(inode); | 5130 | iput(inode); |
5085 | } | 5131 | } |
5086 | btrfs_btree_balance_dirty(root, nr); | 5132 | btrfs_btree_balance_dirty(root); |
5087 | return err; | 5133 | return err; |
5088 | } | 5134 | } |
5089 | 5135 | ||
@@ -5096,7 +5142,6 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
5096 | int drop_on_err = 0; | 5142 | int drop_on_err = 0; |
5097 | u64 objectid = 0; | 5143 | u64 objectid = 0; |
5098 | u64 index = 0; | 5144 | u64 index = 0; |
5099 | unsigned long nr = 1; | ||
5100 | 5145 | ||
5101 | /* | 5146 | /* |
5102 | * 2 items for inode and ref | 5147 | * 2 items for inode and ref |
@@ -5142,11 +5187,10 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
5142 | drop_on_err = 0; | 5187 | drop_on_err = 0; |
5143 | 5188 | ||
5144 | out_fail: | 5189 | out_fail: |
5145 | nr = trans->blocks_used; | ||
5146 | btrfs_end_transaction(trans, root); | 5190 | btrfs_end_transaction(trans, root); |
5147 | if (drop_on_err) | 5191 | if (drop_on_err) |
5148 | iput(inode); | 5192 | iput(inode); |
5149 | btrfs_btree_balance_dirty(root, nr); | 5193 | btrfs_btree_balance_dirty(root); |
5150 | return err; | 5194 | return err; |
5151 | } | 5195 | } |
5152 | 5196 | ||
@@ -5340,6 +5384,7 @@ again: | |||
5340 | if (start + len <= found_key.offset) | 5384 | if (start + len <= found_key.offset) |
5341 | goto not_found; | 5385 | goto not_found; |
5342 | em->start = start; | 5386 | em->start = start; |
5387 | em->orig_start = start; | ||
5343 | em->len = found_key.offset - start; | 5388 | em->len = found_key.offset - start; |
5344 | goto not_found_em; | 5389 | goto not_found_em; |
5345 | } | 5390 | } |
@@ -5350,6 +5395,8 @@ again: | |||
5350 | em->len = extent_end - extent_start; | 5395 | em->len = extent_end - extent_start; |
5351 | em->orig_start = extent_start - | 5396 | em->orig_start = extent_start - |
5352 | btrfs_file_extent_offset(leaf, item); | 5397 | btrfs_file_extent_offset(leaf, item); |
5398 | em->orig_block_len = btrfs_file_extent_disk_num_bytes(leaf, | ||
5399 | item); | ||
5353 | bytenr = btrfs_file_extent_disk_bytenr(leaf, item); | 5400 | bytenr = btrfs_file_extent_disk_bytenr(leaf, item); |
5354 | if (bytenr == 0) { | 5401 | if (bytenr == 0) { |
5355 | em->block_start = EXTENT_MAP_HOLE; | 5402 | em->block_start = EXTENT_MAP_HOLE; |
@@ -5359,8 +5406,7 @@ again: | |||
5359 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 5406 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
5360 | em->compress_type = compress_type; | 5407 | em->compress_type = compress_type; |
5361 | em->block_start = bytenr; | 5408 | em->block_start = bytenr; |
5362 | em->block_len = btrfs_file_extent_disk_num_bytes(leaf, | 5409 | em->block_len = em->orig_block_len; |
5363 | item); | ||
5364 | } else { | 5410 | } else { |
5365 | bytenr += btrfs_file_extent_offset(leaf, item); | 5411 | bytenr += btrfs_file_extent_offset(leaf, item); |
5366 | em->block_start = bytenr; | 5412 | em->block_start = bytenr; |
@@ -5390,7 +5436,8 @@ again: | |||
5390 | em->start = extent_start + extent_offset; | 5436 | em->start = extent_start + extent_offset; |
5391 | em->len = (copy_size + root->sectorsize - 1) & | 5437 | em->len = (copy_size + root->sectorsize - 1) & |
5392 | ~((u64)root->sectorsize - 1); | 5438 | ~((u64)root->sectorsize - 1); |
5393 | em->orig_start = EXTENT_MAP_INLINE; | 5439 | em->orig_block_len = em->len; |
5440 | em->orig_start = em->start; | ||
5394 | if (compress_type) { | 5441 | if (compress_type) { |
5395 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 5442 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
5396 | em->compress_type = compress_type; | 5443 | em->compress_type = compress_type; |
@@ -5439,11 +5486,11 @@ again: | |||
5439 | extent_map_end(em) - 1, NULL, GFP_NOFS); | 5486 | extent_map_end(em) - 1, NULL, GFP_NOFS); |
5440 | goto insert; | 5487 | goto insert; |
5441 | } else { | 5488 | } else { |
5442 | printk(KERN_ERR "btrfs unknown found_type %d\n", found_type); | 5489 | WARN(1, KERN_ERR "btrfs unknown found_type %d\n", found_type); |
5443 | WARN_ON(1); | ||
5444 | } | 5490 | } |
5445 | not_found: | 5491 | not_found: |
5446 | em->start = start; | 5492 | em->start = start; |
5493 | em->orig_start = start; | ||
5447 | em->len = len; | 5494 | em->len = len; |
5448 | not_found_em: | 5495 | not_found_em: |
5449 | em->block_start = EXTENT_MAP_HOLE; | 5496 | em->block_start = EXTENT_MAP_HOLE; |
@@ -5645,38 +5692,19 @@ out: | |||
5645 | } | 5692 | } |
5646 | 5693 | ||
5647 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | 5694 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, |
5648 | struct extent_map *em, | ||
5649 | u64 start, u64 len) | 5695 | u64 start, u64 len) |
5650 | { | 5696 | { |
5651 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5697 | struct btrfs_root *root = BTRFS_I(inode)->root; |
5652 | struct btrfs_trans_handle *trans; | 5698 | struct btrfs_trans_handle *trans; |
5653 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 5699 | struct extent_map *em; |
5654 | struct btrfs_key ins; | 5700 | struct btrfs_key ins; |
5655 | u64 alloc_hint; | 5701 | u64 alloc_hint; |
5656 | int ret; | 5702 | int ret; |
5657 | bool insert = false; | ||
5658 | |||
5659 | /* | ||
5660 | * Ok if the extent map we looked up is a hole and is for the exact | ||
5661 | * range we want, there is no reason to allocate a new one, however if | ||
5662 | * it is not right then we need to free this one and drop the cache for | ||
5663 | * our range. | ||
5664 | */ | ||
5665 | if (em->block_start != EXTENT_MAP_HOLE || em->start != start || | ||
5666 | em->len != len) { | ||
5667 | free_extent_map(em); | ||
5668 | em = NULL; | ||
5669 | insert = true; | ||
5670 | btrfs_drop_extent_cache(inode, start, start + len - 1, 0); | ||
5671 | } | ||
5672 | 5703 | ||
5673 | trans = btrfs_join_transaction(root); | 5704 | trans = btrfs_join_transaction(root); |
5674 | if (IS_ERR(trans)) | 5705 | if (IS_ERR(trans)) |
5675 | return ERR_CAST(trans); | 5706 | return ERR_CAST(trans); |
5676 | 5707 | ||
5677 | if (start <= BTRFS_I(inode)->disk_i_size && len < 64 * 1024) | ||
5678 | btrfs_add_inode_defrag(trans, inode); | ||
5679 | |||
5680 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 5708 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
5681 | 5709 | ||
5682 | alloc_hint = get_extent_allocation_hint(inode, start, len); | 5710 | alloc_hint = get_extent_allocation_hint(inode, start, len); |
@@ -5687,37 +5715,10 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5687 | goto out; | 5715 | goto out; |
5688 | } | 5716 | } |
5689 | 5717 | ||
5690 | if (!em) { | 5718 | em = create_pinned_em(inode, start, ins.offset, start, ins.objectid, |
5691 | em = alloc_extent_map(); | 5719 | ins.offset, ins.offset, 0); |
5692 | if (!em) { | 5720 | if (IS_ERR(em)) |
5693 | em = ERR_PTR(-ENOMEM); | 5721 | goto out; |
5694 | goto out; | ||
5695 | } | ||
5696 | } | ||
5697 | |||
5698 | em->start = start; | ||
5699 | em->orig_start = em->start; | ||
5700 | em->len = ins.offset; | ||
5701 | |||
5702 | em->block_start = ins.objectid; | ||
5703 | em->block_len = ins.offset; | ||
5704 | em->bdev = root->fs_info->fs_devices->latest_bdev; | ||
5705 | |||
5706 | /* | ||
5707 | * We need to do this because if we're using the original em we searched | ||
5708 | * for, we could have EXTENT_FLAG_VACANCY set, and we don't want that. | ||
5709 | */ | ||
5710 | em->flags = 0; | ||
5711 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | ||
5712 | |||
5713 | while (insert) { | ||
5714 | write_lock(&em_tree->lock); | ||
5715 | ret = add_extent_mapping(em_tree, em); | ||
5716 | write_unlock(&em_tree->lock); | ||
5717 | if (ret != -EEXIST) | ||
5718 | break; | ||
5719 | btrfs_drop_extent_cache(inode, start, start + em->len - 1, 0); | ||
5720 | } | ||
5721 | 5722 | ||
5722 | ret = btrfs_add_ordered_extent_dio(inode, start, ins.objectid, | 5723 | ret = btrfs_add_ordered_extent_dio(inode, start, ins.objectid, |
5723 | ins.offset, ins.offset, 0); | 5724 | ins.offset, ins.offset, 0); |
@@ -5894,7 +5895,7 @@ static int lock_extent_direct(struct inode *inode, u64 lockstart, u64 lockend, | |||
5894 | static struct extent_map *create_pinned_em(struct inode *inode, u64 start, | 5895 | static struct extent_map *create_pinned_em(struct inode *inode, u64 start, |
5895 | u64 len, u64 orig_start, | 5896 | u64 len, u64 orig_start, |
5896 | u64 block_start, u64 block_len, | 5897 | u64 block_start, u64 block_len, |
5897 | int type) | 5898 | u64 orig_block_len, int type) |
5898 | { | 5899 | { |
5899 | struct extent_map_tree *em_tree; | 5900 | struct extent_map_tree *em_tree; |
5900 | struct extent_map *em; | 5901 | struct extent_map *em; |
@@ -5912,15 +5913,20 @@ static struct extent_map *create_pinned_em(struct inode *inode, u64 start, | |||
5912 | em->block_len = block_len; | 5913 | em->block_len = block_len; |
5913 | em->block_start = block_start; | 5914 | em->block_start = block_start; |
5914 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 5915 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
5916 | em->orig_block_len = orig_block_len; | ||
5917 | em->generation = -1; | ||
5915 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 5918 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
5916 | if (type == BTRFS_ORDERED_PREALLOC) | 5919 | if (type == BTRFS_ORDERED_PREALLOC) |
5917 | set_bit(EXTENT_FLAG_PREALLOC, &em->flags); | 5920 | set_bit(EXTENT_FLAG_FILLING, &em->flags); |
5918 | 5921 | ||
5919 | do { | 5922 | do { |
5920 | btrfs_drop_extent_cache(inode, em->start, | 5923 | btrfs_drop_extent_cache(inode, em->start, |
5921 | em->start + em->len - 1, 0); | 5924 | em->start + em->len - 1, 0); |
5922 | write_lock(&em_tree->lock); | 5925 | write_lock(&em_tree->lock); |
5923 | ret = add_extent_mapping(em_tree, em); | 5926 | ret = add_extent_mapping(em_tree, em); |
5927 | if (!ret) | ||
5928 | list_move(&em->list, | ||
5929 | &em_tree->modified_extents); | ||
5924 | write_unlock(&em_tree->lock); | 5930 | write_unlock(&em_tree->lock); |
5925 | } while (ret == -EEXIST); | 5931 | } while (ret == -EEXIST); |
5926 | 5932 | ||
@@ -6047,13 +6053,15 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
6047 | goto must_cow; | 6053 | goto must_cow; |
6048 | 6054 | ||
6049 | if (can_nocow_odirect(trans, inode, start, len) == 1) { | 6055 | if (can_nocow_odirect(trans, inode, start, len) == 1) { |
6050 | u64 orig_start = em->start; | 6056 | u64 orig_start = em->orig_start; |
6057 | u64 orig_block_len = em->orig_block_len; | ||
6051 | 6058 | ||
6052 | if (type == BTRFS_ORDERED_PREALLOC) { | 6059 | if (type == BTRFS_ORDERED_PREALLOC) { |
6053 | free_extent_map(em); | 6060 | free_extent_map(em); |
6054 | em = create_pinned_em(inode, start, len, | 6061 | em = create_pinned_em(inode, start, len, |
6055 | orig_start, | 6062 | orig_start, |
6056 | block_start, len, type); | 6063 | block_start, len, |
6064 | orig_block_len, type); | ||
6057 | if (IS_ERR(em)) { | 6065 | if (IS_ERR(em)) { |
6058 | btrfs_end_transaction(trans, root); | 6066 | btrfs_end_transaction(trans, root); |
6059 | goto unlock_err; | 6067 | goto unlock_err; |
@@ -6077,7 +6085,8 @@ must_cow: | |||
6077 | * it above | 6085 | * it above |
6078 | */ | 6086 | */ |
6079 | len = bh_result->b_size; | 6087 | len = bh_result->b_size; |
6080 | em = btrfs_new_extent_direct(inode, em, start, len); | 6088 | free_extent_map(em); |
6089 | em = btrfs_new_extent_direct(inode, start, len); | ||
6081 | if (IS_ERR(em)) { | 6090 | if (IS_ERR(em)) { |
6082 | ret = PTR_ERR(em); | 6091 | ret = PTR_ERR(em); |
6083 | goto unlock_err; | 6092 | goto unlock_err; |
@@ -6318,6 +6327,9 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, | |||
6318 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6327 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6319 | int ret; | 6328 | int ret; |
6320 | 6329 | ||
6330 | if (async_submit) | ||
6331 | async_submit = !atomic_read(&BTRFS_I(inode)->sync_writers); | ||
6332 | |||
6321 | bio_get(bio); | 6333 | bio_get(bio); |
6322 | 6334 | ||
6323 | if (!write) { | 6335 | if (!write) { |
@@ -6362,7 +6374,6 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
6362 | { | 6374 | { |
6363 | struct inode *inode = dip->inode; | 6375 | struct inode *inode = dip->inode; |
6364 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6376 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6365 | struct btrfs_mapping_tree *map_tree = &root->fs_info->mapping_tree; | ||
6366 | struct bio *bio; | 6377 | struct bio *bio; |
6367 | struct bio *orig_bio = dip->orig_bio; | 6378 | struct bio *orig_bio = dip->orig_bio; |
6368 | struct bio_vec *bvec = orig_bio->bi_io_vec; | 6379 | struct bio_vec *bvec = orig_bio->bi_io_vec; |
@@ -6375,7 +6386,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
6375 | int async_submit = 0; | 6386 | int async_submit = 0; |
6376 | 6387 | ||
6377 | map_length = orig_bio->bi_size; | 6388 | map_length = orig_bio->bi_size; |
6378 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, | 6389 | ret = btrfs_map_block(root->fs_info, READ, start_sector << 9, |
6379 | &map_length, NULL, 0); | 6390 | &map_length, NULL, 0); |
6380 | if (ret) { | 6391 | if (ret) { |
6381 | bio_put(orig_bio); | 6392 | bio_put(orig_bio); |
@@ -6429,7 +6440,8 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
6429 | bio->bi_end_io = btrfs_end_dio_bio; | 6440 | bio->bi_end_io = btrfs_end_dio_bio; |
6430 | 6441 | ||
6431 | map_length = orig_bio->bi_size; | 6442 | map_length = orig_bio->bi_size; |
6432 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, | 6443 | ret = btrfs_map_block(root->fs_info, READ, |
6444 | start_sector << 9, | ||
6433 | &map_length, NULL, 0); | 6445 | &map_length, NULL, 0); |
6434 | if (ret) { | 6446 | if (ret) { |
6435 | bio_put(bio); | 6447 | bio_put(bio); |
@@ -6582,9 +6594,17 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb, | |||
6582 | btrfs_submit_direct, 0); | 6594 | btrfs_submit_direct, 0); |
6583 | } | 6595 | } |
6584 | 6596 | ||
6597 | #define BTRFS_FIEMAP_FLAGS (FIEMAP_FLAG_SYNC) | ||
6598 | |||
6585 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | 6599 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
6586 | __u64 start, __u64 len) | 6600 | __u64 start, __u64 len) |
6587 | { | 6601 | { |
6602 | int ret; | ||
6603 | |||
6604 | ret = fiemap_check_flags(fieinfo, BTRFS_FIEMAP_FLAGS); | ||
6605 | if (ret) | ||
6606 | return ret; | ||
6607 | |||
6588 | return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent_fiemap); | 6608 | return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent_fiemap); |
6589 | } | 6609 | } |
6590 | 6610 | ||
@@ -6855,7 +6875,6 @@ static int btrfs_truncate(struct inode *inode) | |||
6855 | int ret; | 6875 | int ret; |
6856 | int err = 0; | 6876 | int err = 0; |
6857 | struct btrfs_trans_handle *trans; | 6877 | struct btrfs_trans_handle *trans; |
6858 | unsigned long nr; | ||
6859 | u64 mask = root->sectorsize - 1; | 6878 | u64 mask = root->sectorsize - 1; |
6860 | u64 min_size = btrfs_calc_trunc_metadata_size(root, 1); | 6879 | u64 min_size = btrfs_calc_trunc_metadata_size(root, 1); |
6861 | 6880 | ||
@@ -6978,9 +6997,8 @@ static int btrfs_truncate(struct inode *inode) | |||
6978 | break; | 6997 | break; |
6979 | } | 6998 | } |
6980 | 6999 | ||
6981 | nr = trans->blocks_used; | ||
6982 | btrfs_end_transaction(trans, root); | 7000 | btrfs_end_transaction(trans, root); |
6983 | btrfs_btree_balance_dirty(root, nr); | 7001 | btrfs_btree_balance_dirty(root); |
6984 | 7002 | ||
6985 | trans = btrfs_start_transaction(root, 2); | 7003 | trans = btrfs_start_transaction(root, 2); |
6986 | if (IS_ERR(trans)) { | 7004 | if (IS_ERR(trans)) { |
@@ -7014,9 +7032,8 @@ static int btrfs_truncate(struct inode *inode) | |||
7014 | if (ret && !err) | 7032 | if (ret && !err) |
7015 | err = ret; | 7033 | err = ret; |
7016 | 7034 | ||
7017 | nr = trans->blocks_used; | ||
7018 | ret = btrfs_end_transaction(trans, root); | 7035 | ret = btrfs_end_transaction(trans, root); |
7019 | btrfs_btree_balance_dirty(root, nr); | 7036 | btrfs_btree_balance_dirty(root); |
7020 | } | 7037 | } |
7021 | 7038 | ||
7022 | out: | 7039 | out: |
@@ -7093,6 +7110,7 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
7093 | extent_io_tree_init(&ei->io_failure_tree, &inode->i_data); | 7110 | extent_io_tree_init(&ei->io_failure_tree, &inode->i_data); |
7094 | ei->io_tree.track_uptodate = 1; | 7111 | ei->io_tree.track_uptodate = 1; |
7095 | ei->io_failure_tree.track_uptodate = 1; | 7112 | ei->io_failure_tree.track_uptodate = 1; |
7113 | atomic_set(&ei->sync_writers, 0); | ||
7096 | mutex_init(&ei->log_mutex); | 7114 | mutex_init(&ei->log_mutex); |
7097 | mutex_init(&ei->delalloc_mutex); | 7115 | mutex_init(&ei->delalloc_mutex); |
7098 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); | 7116 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); |
@@ -7203,6 +7221,8 @@ void btrfs_destroy_cachep(void) | |||
7203 | kmem_cache_destroy(btrfs_path_cachep); | 7221 | kmem_cache_destroy(btrfs_path_cachep); |
7204 | if (btrfs_free_space_cachep) | 7222 | if (btrfs_free_space_cachep) |
7205 | kmem_cache_destroy(btrfs_free_space_cachep); | 7223 | kmem_cache_destroy(btrfs_free_space_cachep); |
7224 | if (btrfs_delalloc_work_cachep) | ||
7225 | kmem_cache_destroy(btrfs_delalloc_work_cachep); | ||
7206 | } | 7226 | } |
7207 | 7227 | ||
7208 | int btrfs_init_cachep(void) | 7228 | int btrfs_init_cachep(void) |
@@ -7237,6 +7257,13 @@ int btrfs_init_cachep(void) | |||
7237 | if (!btrfs_free_space_cachep) | 7257 | if (!btrfs_free_space_cachep) |
7238 | goto fail; | 7258 | goto fail; |
7239 | 7259 | ||
7260 | btrfs_delalloc_work_cachep = kmem_cache_create("btrfs_delalloc_work", | ||
7261 | sizeof(struct btrfs_delalloc_work), 0, | ||
7262 | SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, | ||
7263 | NULL); | ||
7264 | if (!btrfs_delalloc_work_cachep) | ||
7265 | goto fail; | ||
7266 | |||
7240 | return 0; | 7267 | return 0; |
7241 | fail: | 7268 | fail: |
7242 | btrfs_destroy_cachep(); | 7269 | btrfs_destroy_cachep(); |
@@ -7308,6 +7335,28 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
7308 | if (S_ISDIR(old_inode->i_mode) && new_inode && | 7335 | if (S_ISDIR(old_inode->i_mode) && new_inode && |
7309 | new_inode->i_size > BTRFS_EMPTY_DIR_SIZE) | 7336 | new_inode->i_size > BTRFS_EMPTY_DIR_SIZE) |
7310 | return -ENOTEMPTY; | 7337 | return -ENOTEMPTY; |
7338 | |||
7339 | |||
7340 | /* check for collisions, even if the name isn't there */ | ||
7341 | ret = btrfs_check_dir_item_collision(root, new_dir->i_ino, | ||
7342 | new_dentry->d_name.name, | ||
7343 | new_dentry->d_name.len); | ||
7344 | |||
7345 | if (ret) { | ||
7346 | if (ret == -EEXIST) { | ||
7347 | /* we shouldn't get | ||
7348 | * eexist without a new_inode */ | ||
7349 | if (!new_inode) { | ||
7350 | WARN_ON(1); | ||
7351 | return ret; | ||
7352 | } | ||
7353 | } else { | ||
7354 | /* maybe -EOVERFLOW */ | ||
7355 | return ret; | ||
7356 | } | ||
7357 | } | ||
7358 | ret = 0; | ||
7359 | |||
7311 | /* | 7360 | /* |
7312 | * we're using rename to replace one file with another. | 7361 | * we're using rename to replace one file with another. |
7313 | * and the replacement file is large. Start IO on it now so | 7362 | * and the replacement file is large. Start IO on it now so |
@@ -7447,6 +7496,49 @@ out_notrans: | |||
7447 | return ret; | 7496 | return ret; |
7448 | } | 7497 | } |
7449 | 7498 | ||
7499 | static void btrfs_run_delalloc_work(struct btrfs_work *work) | ||
7500 | { | ||
7501 | struct btrfs_delalloc_work *delalloc_work; | ||
7502 | |||
7503 | delalloc_work = container_of(work, struct btrfs_delalloc_work, | ||
7504 | work); | ||
7505 | if (delalloc_work->wait) | ||
7506 | btrfs_wait_ordered_range(delalloc_work->inode, 0, (u64)-1); | ||
7507 | else | ||
7508 | filemap_flush(delalloc_work->inode->i_mapping); | ||
7509 | |||
7510 | if (delalloc_work->delay_iput) | ||
7511 | btrfs_add_delayed_iput(delalloc_work->inode); | ||
7512 | else | ||
7513 | iput(delalloc_work->inode); | ||
7514 | complete(&delalloc_work->completion); | ||
7515 | } | ||
7516 | |||
7517 | struct btrfs_delalloc_work *btrfs_alloc_delalloc_work(struct inode *inode, | ||
7518 | int wait, int delay_iput) | ||
7519 | { | ||
7520 | struct btrfs_delalloc_work *work; | ||
7521 | |||
7522 | work = kmem_cache_zalloc(btrfs_delalloc_work_cachep, GFP_NOFS); | ||
7523 | if (!work) | ||
7524 | return NULL; | ||
7525 | |||
7526 | init_completion(&work->completion); | ||
7527 | INIT_LIST_HEAD(&work->list); | ||
7528 | work->inode = inode; | ||
7529 | work->wait = wait; | ||
7530 | work->delay_iput = delay_iput; | ||
7531 | work->work.func = btrfs_run_delalloc_work; | ||
7532 | |||
7533 | return work; | ||
7534 | } | ||
7535 | |||
7536 | void btrfs_wait_and_free_delalloc_work(struct btrfs_delalloc_work *work) | ||
7537 | { | ||
7538 | wait_for_completion(&work->completion); | ||
7539 | kmem_cache_free(btrfs_delalloc_work_cachep, work); | ||
7540 | } | ||
7541 | |||
7450 | /* | 7542 | /* |
7451 | * some fairly slow code that needs optimization. This walks the list | 7543 | * some fairly slow code that needs optimization. This walks the list |
7452 | * of all the inodes with pending delalloc and forces them to disk. | 7544 | * of all the inodes with pending delalloc and forces them to disk. |
@@ -7456,10 +7548,15 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput) | |||
7456 | struct list_head *head = &root->fs_info->delalloc_inodes; | 7548 | struct list_head *head = &root->fs_info->delalloc_inodes; |
7457 | struct btrfs_inode *binode; | 7549 | struct btrfs_inode *binode; |
7458 | struct inode *inode; | 7550 | struct inode *inode; |
7551 | struct btrfs_delalloc_work *work, *next; | ||
7552 | struct list_head works; | ||
7553 | int ret = 0; | ||
7459 | 7554 | ||
7460 | if (root->fs_info->sb->s_flags & MS_RDONLY) | 7555 | if (root->fs_info->sb->s_flags & MS_RDONLY) |
7461 | return -EROFS; | 7556 | return -EROFS; |
7462 | 7557 | ||
7558 | INIT_LIST_HEAD(&works); | ||
7559 | |||
7463 | spin_lock(&root->fs_info->delalloc_lock); | 7560 | spin_lock(&root->fs_info->delalloc_lock); |
7464 | while (!list_empty(head)) { | 7561 | while (!list_empty(head)) { |
7465 | binode = list_entry(head->next, struct btrfs_inode, | 7562 | binode = list_entry(head->next, struct btrfs_inode, |
@@ -7469,11 +7566,14 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput) | |||
7469 | list_del_init(&binode->delalloc_inodes); | 7566 | list_del_init(&binode->delalloc_inodes); |
7470 | spin_unlock(&root->fs_info->delalloc_lock); | 7567 | spin_unlock(&root->fs_info->delalloc_lock); |
7471 | if (inode) { | 7568 | if (inode) { |
7472 | filemap_flush(inode->i_mapping); | 7569 | work = btrfs_alloc_delalloc_work(inode, 0, delay_iput); |
7473 | if (delay_iput) | 7570 | if (!work) { |
7474 | btrfs_add_delayed_iput(inode); | 7571 | ret = -ENOMEM; |
7475 | else | 7572 | goto out; |
7476 | iput(inode); | 7573 | } |
7574 | list_add_tail(&work->list, &works); | ||
7575 | btrfs_queue_worker(&root->fs_info->flush_workers, | ||
7576 | &work->work); | ||
7477 | } | 7577 | } |
7478 | cond_resched(); | 7578 | cond_resched(); |
7479 | spin_lock(&root->fs_info->delalloc_lock); | 7579 | spin_lock(&root->fs_info->delalloc_lock); |
@@ -7492,7 +7592,12 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput) | |||
7492 | atomic_read(&root->fs_info->async_delalloc_pages) == 0)); | 7592 | atomic_read(&root->fs_info->async_delalloc_pages) == 0)); |
7493 | } | 7593 | } |
7494 | atomic_dec(&root->fs_info->async_submit_draining); | 7594 | atomic_dec(&root->fs_info->async_submit_draining); |
7495 | return 0; | 7595 | out: |
7596 | list_for_each_entry_safe(work, next, &works, list) { | ||
7597 | list_del_init(&work->list); | ||
7598 | btrfs_wait_and_free_delalloc_work(work); | ||
7599 | } | ||
7600 | return ret; | ||
7496 | } | 7601 | } |
7497 | 7602 | ||
7498 | static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | 7603 | static int btrfs_symlink(struct inode *dir, struct dentry *dentry, |
@@ -7512,7 +7617,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7512 | unsigned long ptr; | 7617 | unsigned long ptr; |
7513 | struct btrfs_file_extent_item *ei; | 7618 | struct btrfs_file_extent_item *ei; |
7514 | struct extent_buffer *leaf; | 7619 | struct extent_buffer *leaf; |
7515 | unsigned long nr = 0; | ||
7516 | 7620 | ||
7517 | name_len = strlen(symname) + 1; | 7621 | name_len = strlen(symname) + 1; |
7518 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) | 7622 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) |
@@ -7610,13 +7714,12 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7610 | out_unlock: | 7714 | out_unlock: |
7611 | if (!err) | 7715 | if (!err) |
7612 | d_instantiate(dentry, inode); | 7716 | d_instantiate(dentry, inode); |
7613 | nr = trans->blocks_used; | ||
7614 | btrfs_end_transaction(trans, root); | 7717 | btrfs_end_transaction(trans, root); |
7615 | if (drop_inode) { | 7718 | if (drop_inode) { |
7616 | inode_dec_link_count(inode); | 7719 | inode_dec_link_count(inode); |
7617 | iput(inode); | 7720 | iput(inode); |
7618 | } | 7721 | } |
7619 | btrfs_btree_balance_dirty(root, nr); | 7722 | btrfs_btree_balance_dirty(root); |
7620 | return err; | 7723 | return err; |
7621 | } | 7724 | } |
7622 | 7725 | ||
@@ -7679,6 +7782,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, | |||
7679 | em->len = ins.offset; | 7782 | em->len = ins.offset; |
7680 | em->block_start = ins.objectid; | 7783 | em->block_start = ins.objectid; |
7681 | em->block_len = ins.offset; | 7784 | em->block_len = ins.offset; |
7785 | em->orig_block_len = ins.offset; | ||
7682 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 7786 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
7683 | set_bit(EXTENT_FLAG_PREALLOC, &em->flags); | 7787 | set_bit(EXTENT_FLAG_PREALLOC, &em->flags); |
7684 | em->generation = trans->transid; | 7788 | em->generation = trans->transid; |