diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 500 |
1 files changed, 295 insertions, 205 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 95542a1b3dfc..16d9e8e191e6 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; |
@@ -4219,16 +4262,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
4219 | if (dentry->d_name.len > BTRFS_NAME_LEN) | 4262 | if (dentry->d_name.len > BTRFS_NAME_LEN) |
4220 | return ERR_PTR(-ENAMETOOLONG); | 4263 | return ERR_PTR(-ENAMETOOLONG); |
4221 | 4264 | ||
4222 | if (unlikely(d_need_lookup(dentry))) { | 4265 | ret = btrfs_inode_by_name(dir, dentry, &location); |
4223 | memcpy(&location, dentry->d_fsdata, sizeof(struct btrfs_key)); | ||
4224 | kfree(dentry->d_fsdata); | ||
4225 | dentry->d_fsdata = NULL; | ||
4226 | /* This thing is hashed, drop it for now */ | ||
4227 | d_drop(dentry); | ||
4228 | } else { | ||
4229 | ret = btrfs_inode_by_name(dir, dentry, &location); | ||
4230 | } | ||
4231 | |||
4232 | if (ret < 0) | 4266 | if (ret < 0) |
4233 | return ERR_PTR(ret); | 4267 | return ERR_PTR(ret); |
4234 | 4268 | ||
@@ -4298,11 +4332,6 @@ static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry, | |||
4298 | struct dentry *ret; | 4332 | struct dentry *ret; |
4299 | 4333 | ||
4300 | ret = d_splice_alias(btrfs_lookup_dentry(dir, dentry), dentry); | 4334 | ret = d_splice_alias(btrfs_lookup_dentry(dir, dentry), dentry); |
4301 | if (unlikely(d_need_lookup(dentry))) { | ||
4302 | spin_lock(&dentry->d_lock); | ||
4303 | dentry->d_flags &= ~DCACHE_NEED_LOOKUP; | ||
4304 | spin_unlock(&dentry->d_lock); | ||
4305 | } | ||
4306 | return ret; | 4335 | return ret; |
4307 | } | 4336 | } |
4308 | 4337 | ||
@@ -4775,8 +4804,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
4775 | if (S_ISREG(mode)) { | 4804 | if (S_ISREG(mode)) { |
4776 | if (btrfs_test_opt(root, NODATASUM)) | 4805 | if (btrfs_test_opt(root, NODATASUM)) |
4777 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; | 4806 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; |
4778 | if (btrfs_test_opt(root, NODATACOW) || | 4807 | if (btrfs_test_opt(root, NODATACOW)) |
4779 | (BTRFS_I(dir)->flags & BTRFS_INODE_NODATACOW)) | ||
4780 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; | 4808 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; |
4781 | } | 4809 | } |
4782 | 4810 | ||
@@ -4842,7 +4870,7 @@ int btrfs_add_link(struct btrfs_trans_handle *trans, | |||
4842 | ret = btrfs_insert_dir_item(trans, root, name, name_len, | 4870 | ret = btrfs_insert_dir_item(trans, root, name, name_len, |
4843 | parent_inode, &key, | 4871 | parent_inode, &key, |
4844 | btrfs_inode_type(inode), index); | 4872 | btrfs_inode_type(inode), index); |
4845 | if (ret == -EEXIST) | 4873 | if (ret == -EEXIST || ret == -EOVERFLOW) |
4846 | goto fail_dir_item; | 4874 | goto fail_dir_item; |
4847 | else if (ret) { | 4875 | else if (ret) { |
4848 | btrfs_abort_transaction(trans, root, ret); | 4876 | btrfs_abort_transaction(trans, root, ret); |
@@ -4897,7 +4925,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4897 | int err; | 4925 | int err; |
4898 | int drop_inode = 0; | 4926 | int drop_inode = 0; |
4899 | u64 objectid; | 4927 | u64 objectid; |
4900 | unsigned long nr = 0; | ||
4901 | u64 index = 0; | 4928 | u64 index = 0; |
4902 | 4929 | ||
4903 | if (!new_valid_dev(rdev)) | 4930 | if (!new_valid_dev(rdev)) |
@@ -4930,6 +4957,12 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4930 | goto out_unlock; | 4957 | goto out_unlock; |
4931 | } | 4958 | } |
4932 | 4959 | ||
4960 | err = btrfs_update_inode(trans, root, inode); | ||
4961 | if (err) { | ||
4962 | drop_inode = 1; | ||
4963 | goto out_unlock; | ||
4964 | } | ||
4965 | |||
4933 | /* | 4966 | /* |
4934 | * If the active LSM wants to access the inode during | 4967 | * If the active LSM wants to access the inode during |
4935 | * d_instantiate it needs these. Smack checks to see | 4968 | * d_instantiate it needs these. Smack checks to see |
@@ -4947,9 +4980,8 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4947 | d_instantiate(dentry, inode); | 4980 | d_instantiate(dentry, inode); |
4948 | } | 4981 | } |
4949 | out_unlock: | 4982 | out_unlock: |
4950 | nr = trans->blocks_used; | ||
4951 | btrfs_end_transaction(trans, root); | 4983 | btrfs_end_transaction(trans, root); |
4952 | btrfs_btree_balance_dirty(root, nr); | 4984 | btrfs_btree_balance_dirty(root); |
4953 | if (drop_inode) { | 4985 | if (drop_inode) { |
4954 | inode_dec_link_count(inode); | 4986 | inode_dec_link_count(inode); |
4955 | iput(inode); | 4987 | iput(inode); |
@@ -4963,9 +4995,8 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4963 | struct btrfs_trans_handle *trans; | 4995 | struct btrfs_trans_handle *trans; |
4964 | struct btrfs_root *root = BTRFS_I(dir)->root; | 4996 | struct btrfs_root *root = BTRFS_I(dir)->root; |
4965 | struct inode *inode = NULL; | 4997 | struct inode *inode = NULL; |
4966 | int drop_inode = 0; | 4998 | int drop_inode_on_err = 0; |
4967 | int err; | 4999 | int err; |
4968 | unsigned long nr = 0; | ||
4969 | u64 objectid; | 5000 | u64 objectid; |
4970 | u64 index = 0; | 5001 | u64 index = 0; |
4971 | 5002 | ||
@@ -4989,12 +5020,15 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4989 | err = PTR_ERR(inode); | 5020 | err = PTR_ERR(inode); |
4990 | goto out_unlock; | 5021 | goto out_unlock; |
4991 | } | 5022 | } |
5023 | drop_inode_on_err = 1; | ||
4992 | 5024 | ||
4993 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); | 5025 | err = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); |
4994 | if (err) { | 5026 | if (err) |
4995 | drop_inode = 1; | 5027 | goto out_unlock; |
5028 | |||
5029 | err = btrfs_update_inode(trans, root, inode); | ||
5030 | if (err) | ||
4996 | goto out_unlock; | 5031 | goto out_unlock; |
4997 | } | ||
4998 | 5032 | ||
4999 | /* | 5033 | /* |
5000 | * If the active LSM wants to access the inode during | 5034 | * If the active LSM wants to access the inode during |
@@ -5007,21 +5041,20 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
5007 | 5041 | ||
5008 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); | 5042 | err = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); |
5009 | if (err) | 5043 | if (err) |
5010 | drop_inode = 1; | 5044 | goto out_unlock; |
5011 | else { | 5045 | |
5012 | inode->i_mapping->a_ops = &btrfs_aops; | 5046 | inode->i_mapping->a_ops = &btrfs_aops; |
5013 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; | 5047 | inode->i_mapping->backing_dev_info = &root->fs_info->bdi; |
5014 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; | 5048 | BTRFS_I(inode)->io_tree.ops = &btrfs_extent_io_ops; |
5015 | d_instantiate(dentry, inode); | 5049 | d_instantiate(dentry, inode); |
5016 | } | 5050 | |
5017 | out_unlock: | 5051 | out_unlock: |
5018 | nr = trans->blocks_used; | ||
5019 | btrfs_end_transaction(trans, root); | 5052 | btrfs_end_transaction(trans, root); |
5020 | if (drop_inode) { | 5053 | if (err && drop_inode_on_err) { |
5021 | inode_dec_link_count(inode); | 5054 | inode_dec_link_count(inode); |
5022 | iput(inode); | 5055 | iput(inode); |
5023 | } | 5056 | } |
5024 | btrfs_btree_balance_dirty(root, nr); | 5057 | btrfs_btree_balance_dirty(root); |
5025 | return err; | 5058 | return err; |
5026 | } | 5059 | } |
5027 | 5060 | ||
@@ -5032,7 +5065,6 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
5032 | struct btrfs_root *root = BTRFS_I(dir)->root; | 5065 | struct btrfs_root *root = BTRFS_I(dir)->root; |
5033 | struct inode *inode = old_dentry->d_inode; | 5066 | struct inode *inode = old_dentry->d_inode; |
5034 | u64 index; | 5067 | u64 index; |
5035 | unsigned long nr = 0; | ||
5036 | int err; | 5068 | int err; |
5037 | int drop_inode = 0; | 5069 | int drop_inode = 0; |
5038 | 5070 | ||
@@ -5062,6 +5094,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
5062 | inode_inc_iversion(inode); | 5094 | inode_inc_iversion(inode); |
5063 | inode->i_ctime = CURRENT_TIME; | 5095 | inode->i_ctime = CURRENT_TIME; |
5064 | ihold(inode); | 5096 | ihold(inode); |
5097 | set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags); | ||
5065 | 5098 | ||
5066 | err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); | 5099 | err = btrfs_add_nondir(trans, dir, dentry, inode, 1, index); |
5067 | 5100 | ||
@@ -5076,14 +5109,13 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
5076 | btrfs_log_new_name(trans, inode, NULL, parent); | 5109 | btrfs_log_new_name(trans, inode, NULL, parent); |
5077 | } | 5110 | } |
5078 | 5111 | ||
5079 | nr = trans->blocks_used; | ||
5080 | btrfs_end_transaction(trans, root); | 5112 | btrfs_end_transaction(trans, root); |
5081 | fail: | 5113 | fail: |
5082 | if (drop_inode) { | 5114 | if (drop_inode) { |
5083 | inode_dec_link_count(inode); | 5115 | inode_dec_link_count(inode); |
5084 | iput(inode); | 5116 | iput(inode); |
5085 | } | 5117 | } |
5086 | btrfs_btree_balance_dirty(root, nr); | 5118 | btrfs_btree_balance_dirty(root); |
5087 | return err; | 5119 | return err; |
5088 | } | 5120 | } |
5089 | 5121 | ||
@@ -5096,7 +5128,6 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
5096 | int drop_on_err = 0; | 5128 | int drop_on_err = 0; |
5097 | u64 objectid = 0; | 5129 | u64 objectid = 0; |
5098 | u64 index = 0; | 5130 | u64 index = 0; |
5099 | unsigned long nr = 1; | ||
5100 | 5131 | ||
5101 | /* | 5132 | /* |
5102 | * 2 items for inode and ref | 5133 | * 2 items for inode and ref |
@@ -5142,11 +5173,10 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | |||
5142 | drop_on_err = 0; | 5173 | drop_on_err = 0; |
5143 | 5174 | ||
5144 | out_fail: | 5175 | out_fail: |
5145 | nr = trans->blocks_used; | ||
5146 | btrfs_end_transaction(trans, root); | 5176 | btrfs_end_transaction(trans, root); |
5147 | if (drop_on_err) | 5177 | if (drop_on_err) |
5148 | iput(inode); | 5178 | iput(inode); |
5149 | btrfs_btree_balance_dirty(root, nr); | 5179 | btrfs_btree_balance_dirty(root); |
5150 | return err; | 5180 | return err; |
5151 | } | 5181 | } |
5152 | 5182 | ||
@@ -5340,6 +5370,7 @@ again: | |||
5340 | if (start + len <= found_key.offset) | 5370 | if (start + len <= found_key.offset) |
5341 | goto not_found; | 5371 | goto not_found; |
5342 | em->start = start; | 5372 | em->start = start; |
5373 | em->orig_start = start; | ||
5343 | em->len = found_key.offset - start; | 5374 | em->len = found_key.offset - start; |
5344 | goto not_found_em; | 5375 | goto not_found_em; |
5345 | } | 5376 | } |
@@ -5350,6 +5381,8 @@ again: | |||
5350 | em->len = extent_end - extent_start; | 5381 | em->len = extent_end - extent_start; |
5351 | em->orig_start = extent_start - | 5382 | em->orig_start = extent_start - |
5352 | btrfs_file_extent_offset(leaf, item); | 5383 | btrfs_file_extent_offset(leaf, item); |
5384 | em->orig_block_len = btrfs_file_extent_disk_num_bytes(leaf, | ||
5385 | item); | ||
5353 | bytenr = btrfs_file_extent_disk_bytenr(leaf, item); | 5386 | bytenr = btrfs_file_extent_disk_bytenr(leaf, item); |
5354 | if (bytenr == 0) { | 5387 | if (bytenr == 0) { |
5355 | em->block_start = EXTENT_MAP_HOLE; | 5388 | em->block_start = EXTENT_MAP_HOLE; |
@@ -5359,8 +5392,7 @@ again: | |||
5359 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 5392 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
5360 | em->compress_type = compress_type; | 5393 | em->compress_type = compress_type; |
5361 | em->block_start = bytenr; | 5394 | em->block_start = bytenr; |
5362 | em->block_len = btrfs_file_extent_disk_num_bytes(leaf, | 5395 | em->block_len = em->orig_block_len; |
5363 | item); | ||
5364 | } else { | 5396 | } else { |
5365 | bytenr += btrfs_file_extent_offset(leaf, item); | 5397 | bytenr += btrfs_file_extent_offset(leaf, item); |
5366 | em->block_start = bytenr; | 5398 | em->block_start = bytenr; |
@@ -5390,7 +5422,8 @@ again: | |||
5390 | em->start = extent_start + extent_offset; | 5422 | em->start = extent_start + extent_offset; |
5391 | em->len = (copy_size + root->sectorsize - 1) & | 5423 | em->len = (copy_size + root->sectorsize - 1) & |
5392 | ~((u64)root->sectorsize - 1); | 5424 | ~((u64)root->sectorsize - 1); |
5393 | em->orig_start = EXTENT_MAP_INLINE; | 5425 | em->orig_block_len = em->len; |
5426 | em->orig_start = em->start; | ||
5394 | if (compress_type) { | 5427 | if (compress_type) { |
5395 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 5428 | set_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
5396 | em->compress_type = compress_type; | 5429 | em->compress_type = compress_type; |
@@ -5439,11 +5472,11 @@ again: | |||
5439 | extent_map_end(em) - 1, NULL, GFP_NOFS); | 5472 | extent_map_end(em) - 1, NULL, GFP_NOFS); |
5440 | goto insert; | 5473 | goto insert; |
5441 | } else { | 5474 | } else { |
5442 | printk(KERN_ERR "btrfs unknown found_type %d\n", found_type); | 5475 | WARN(1, KERN_ERR "btrfs unknown found_type %d\n", found_type); |
5443 | WARN_ON(1); | ||
5444 | } | 5476 | } |
5445 | not_found: | 5477 | not_found: |
5446 | em->start = start; | 5478 | em->start = start; |
5479 | em->orig_start = start; | ||
5447 | em->len = len; | 5480 | em->len = len; |
5448 | not_found_em: | 5481 | not_found_em: |
5449 | em->block_start = EXTENT_MAP_HOLE; | 5482 | em->block_start = EXTENT_MAP_HOLE; |
@@ -5645,38 +5678,19 @@ out: | |||
5645 | } | 5678 | } |
5646 | 5679 | ||
5647 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | 5680 | static struct extent_map *btrfs_new_extent_direct(struct inode *inode, |
5648 | struct extent_map *em, | ||
5649 | u64 start, u64 len) | 5681 | u64 start, u64 len) |
5650 | { | 5682 | { |
5651 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5683 | struct btrfs_root *root = BTRFS_I(inode)->root; |
5652 | struct btrfs_trans_handle *trans; | 5684 | struct btrfs_trans_handle *trans; |
5653 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 5685 | struct extent_map *em; |
5654 | struct btrfs_key ins; | 5686 | struct btrfs_key ins; |
5655 | u64 alloc_hint; | 5687 | u64 alloc_hint; |
5656 | int ret; | 5688 | 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 | 5689 | ||
5673 | trans = btrfs_join_transaction(root); | 5690 | trans = btrfs_join_transaction(root); |
5674 | if (IS_ERR(trans)) | 5691 | if (IS_ERR(trans)) |
5675 | return ERR_CAST(trans); | 5692 | return ERR_CAST(trans); |
5676 | 5693 | ||
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; | 5694 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
5681 | 5695 | ||
5682 | alloc_hint = get_extent_allocation_hint(inode, start, len); | 5696 | alloc_hint = get_extent_allocation_hint(inode, start, len); |
@@ -5687,37 +5701,10 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5687 | goto out; | 5701 | goto out; |
5688 | } | 5702 | } |
5689 | 5703 | ||
5690 | if (!em) { | 5704 | em = create_pinned_em(inode, start, ins.offset, start, ins.objectid, |
5691 | em = alloc_extent_map(); | 5705 | ins.offset, ins.offset, 0); |
5692 | if (!em) { | 5706 | if (IS_ERR(em)) |
5693 | em = ERR_PTR(-ENOMEM); | 5707 | 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 | 5708 | ||
5722 | ret = btrfs_add_ordered_extent_dio(inode, start, ins.objectid, | 5709 | ret = btrfs_add_ordered_extent_dio(inode, start, ins.objectid, |
5723 | ins.offset, ins.offset, 0); | 5710 | ins.offset, ins.offset, 0); |
@@ -5894,7 +5881,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, | 5881 | static struct extent_map *create_pinned_em(struct inode *inode, u64 start, |
5895 | u64 len, u64 orig_start, | 5882 | u64 len, u64 orig_start, |
5896 | u64 block_start, u64 block_len, | 5883 | u64 block_start, u64 block_len, |
5897 | int type) | 5884 | u64 orig_block_len, int type) |
5898 | { | 5885 | { |
5899 | struct extent_map_tree *em_tree; | 5886 | struct extent_map_tree *em_tree; |
5900 | struct extent_map *em; | 5887 | struct extent_map *em; |
@@ -5912,15 +5899,20 @@ static struct extent_map *create_pinned_em(struct inode *inode, u64 start, | |||
5912 | em->block_len = block_len; | 5899 | em->block_len = block_len; |
5913 | em->block_start = block_start; | 5900 | em->block_start = block_start; |
5914 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 5901 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
5902 | em->orig_block_len = orig_block_len; | ||
5903 | em->generation = -1; | ||
5915 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 5904 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
5916 | if (type == BTRFS_ORDERED_PREALLOC) | 5905 | if (type == BTRFS_ORDERED_PREALLOC) |
5917 | set_bit(EXTENT_FLAG_PREALLOC, &em->flags); | 5906 | set_bit(EXTENT_FLAG_FILLING, &em->flags); |
5918 | 5907 | ||
5919 | do { | 5908 | do { |
5920 | btrfs_drop_extent_cache(inode, em->start, | 5909 | btrfs_drop_extent_cache(inode, em->start, |
5921 | em->start + em->len - 1, 0); | 5910 | em->start + em->len - 1, 0); |
5922 | write_lock(&em_tree->lock); | 5911 | write_lock(&em_tree->lock); |
5923 | ret = add_extent_mapping(em_tree, em); | 5912 | ret = add_extent_mapping(em_tree, em); |
5913 | if (!ret) | ||
5914 | list_move(&em->list, | ||
5915 | &em_tree->modified_extents); | ||
5924 | write_unlock(&em_tree->lock); | 5916 | write_unlock(&em_tree->lock); |
5925 | } while (ret == -EEXIST); | 5917 | } while (ret == -EEXIST); |
5926 | 5918 | ||
@@ -6047,13 +6039,15 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
6047 | goto must_cow; | 6039 | goto must_cow; |
6048 | 6040 | ||
6049 | if (can_nocow_odirect(trans, inode, start, len) == 1) { | 6041 | if (can_nocow_odirect(trans, inode, start, len) == 1) { |
6050 | u64 orig_start = em->start; | 6042 | u64 orig_start = em->orig_start; |
6043 | u64 orig_block_len = em->orig_block_len; | ||
6051 | 6044 | ||
6052 | if (type == BTRFS_ORDERED_PREALLOC) { | 6045 | if (type == BTRFS_ORDERED_PREALLOC) { |
6053 | free_extent_map(em); | 6046 | free_extent_map(em); |
6054 | em = create_pinned_em(inode, start, len, | 6047 | em = create_pinned_em(inode, start, len, |
6055 | orig_start, | 6048 | orig_start, |
6056 | block_start, len, type); | 6049 | block_start, len, |
6050 | orig_block_len, type); | ||
6057 | if (IS_ERR(em)) { | 6051 | if (IS_ERR(em)) { |
6058 | btrfs_end_transaction(trans, root); | 6052 | btrfs_end_transaction(trans, root); |
6059 | goto unlock_err; | 6053 | goto unlock_err; |
@@ -6077,7 +6071,8 @@ must_cow: | |||
6077 | * it above | 6071 | * it above |
6078 | */ | 6072 | */ |
6079 | len = bh_result->b_size; | 6073 | len = bh_result->b_size; |
6080 | em = btrfs_new_extent_direct(inode, em, start, len); | 6074 | free_extent_map(em); |
6075 | em = btrfs_new_extent_direct(inode, start, len); | ||
6081 | if (IS_ERR(em)) { | 6076 | if (IS_ERR(em)) { |
6082 | ret = PTR_ERR(em); | 6077 | ret = PTR_ERR(em); |
6083 | goto unlock_err; | 6078 | goto unlock_err; |
@@ -6318,6 +6313,9 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, | |||
6318 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6313 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6319 | int ret; | 6314 | int ret; |
6320 | 6315 | ||
6316 | if (async_submit) | ||
6317 | async_submit = !atomic_read(&BTRFS_I(inode)->sync_writers); | ||
6318 | |||
6321 | bio_get(bio); | 6319 | bio_get(bio); |
6322 | 6320 | ||
6323 | if (!write) { | 6321 | if (!write) { |
@@ -6362,7 +6360,6 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
6362 | { | 6360 | { |
6363 | struct inode *inode = dip->inode; | 6361 | struct inode *inode = dip->inode; |
6364 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6362 | struct btrfs_root *root = BTRFS_I(inode)->root; |
6365 | struct btrfs_mapping_tree *map_tree = &root->fs_info->mapping_tree; | ||
6366 | struct bio *bio; | 6363 | struct bio *bio; |
6367 | struct bio *orig_bio = dip->orig_bio; | 6364 | struct bio *orig_bio = dip->orig_bio; |
6368 | struct bio_vec *bvec = orig_bio->bi_io_vec; | 6365 | struct bio_vec *bvec = orig_bio->bi_io_vec; |
@@ -6375,7 +6372,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
6375 | int async_submit = 0; | 6372 | int async_submit = 0; |
6376 | 6373 | ||
6377 | map_length = orig_bio->bi_size; | 6374 | map_length = orig_bio->bi_size; |
6378 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, | 6375 | ret = btrfs_map_block(root->fs_info, READ, start_sector << 9, |
6379 | &map_length, NULL, 0); | 6376 | &map_length, NULL, 0); |
6380 | if (ret) { | 6377 | if (ret) { |
6381 | bio_put(orig_bio); | 6378 | bio_put(orig_bio); |
@@ -6429,7 +6426,8 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
6429 | bio->bi_end_io = btrfs_end_dio_bio; | 6426 | bio->bi_end_io = btrfs_end_dio_bio; |
6430 | 6427 | ||
6431 | map_length = orig_bio->bi_size; | 6428 | map_length = orig_bio->bi_size; |
6432 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, | 6429 | ret = btrfs_map_block(root->fs_info, READ, |
6430 | start_sector << 9, | ||
6433 | &map_length, NULL, 0); | 6431 | &map_length, NULL, 0); |
6434 | if (ret) { | 6432 | if (ret) { |
6435 | bio_put(bio); | 6433 | bio_put(bio); |
@@ -6582,9 +6580,17 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb, | |||
6582 | btrfs_submit_direct, 0); | 6580 | btrfs_submit_direct, 0); |
6583 | } | 6581 | } |
6584 | 6582 | ||
6583 | #define BTRFS_FIEMAP_FLAGS (FIEMAP_FLAG_SYNC) | ||
6584 | |||
6585 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | 6585 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
6586 | __u64 start, __u64 len) | 6586 | __u64 start, __u64 len) |
6587 | { | 6587 | { |
6588 | int ret; | ||
6589 | |||
6590 | ret = fiemap_check_flags(fieinfo, BTRFS_FIEMAP_FLAGS); | ||
6591 | if (ret) | ||
6592 | return ret; | ||
6593 | |||
6588 | return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent_fiemap); | 6594 | return extent_fiemap(inode, fieinfo, start, len, btrfs_get_extent_fiemap); |
6589 | } | 6595 | } |
6590 | 6596 | ||
@@ -6855,7 +6861,6 @@ static int btrfs_truncate(struct inode *inode) | |||
6855 | int ret; | 6861 | int ret; |
6856 | int err = 0; | 6862 | int err = 0; |
6857 | struct btrfs_trans_handle *trans; | 6863 | struct btrfs_trans_handle *trans; |
6858 | unsigned long nr; | ||
6859 | u64 mask = root->sectorsize - 1; | 6864 | u64 mask = root->sectorsize - 1; |
6860 | u64 min_size = btrfs_calc_trunc_metadata_size(root, 1); | 6865 | u64 min_size = btrfs_calc_trunc_metadata_size(root, 1); |
6861 | 6866 | ||
@@ -6978,9 +6983,8 @@ static int btrfs_truncate(struct inode *inode) | |||
6978 | break; | 6983 | break; |
6979 | } | 6984 | } |
6980 | 6985 | ||
6981 | nr = trans->blocks_used; | ||
6982 | btrfs_end_transaction(trans, root); | 6986 | btrfs_end_transaction(trans, root); |
6983 | btrfs_btree_balance_dirty(root, nr); | 6987 | btrfs_btree_balance_dirty(root); |
6984 | 6988 | ||
6985 | trans = btrfs_start_transaction(root, 2); | 6989 | trans = btrfs_start_transaction(root, 2); |
6986 | if (IS_ERR(trans)) { | 6990 | if (IS_ERR(trans)) { |
@@ -7014,9 +7018,8 @@ static int btrfs_truncate(struct inode *inode) | |||
7014 | if (ret && !err) | 7018 | if (ret && !err) |
7015 | err = ret; | 7019 | err = ret; |
7016 | 7020 | ||
7017 | nr = trans->blocks_used; | ||
7018 | ret = btrfs_end_transaction(trans, root); | 7021 | ret = btrfs_end_transaction(trans, root); |
7019 | btrfs_btree_balance_dirty(root, nr); | 7022 | btrfs_btree_balance_dirty(root); |
7020 | } | 7023 | } |
7021 | 7024 | ||
7022 | out: | 7025 | out: |
@@ -7093,6 +7096,7 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
7093 | extent_io_tree_init(&ei->io_failure_tree, &inode->i_data); | 7096 | extent_io_tree_init(&ei->io_failure_tree, &inode->i_data); |
7094 | ei->io_tree.track_uptodate = 1; | 7097 | ei->io_tree.track_uptodate = 1; |
7095 | ei->io_failure_tree.track_uptodate = 1; | 7098 | ei->io_failure_tree.track_uptodate = 1; |
7099 | atomic_set(&ei->sync_writers, 0); | ||
7096 | mutex_init(&ei->log_mutex); | 7100 | mutex_init(&ei->log_mutex); |
7097 | mutex_init(&ei->delalloc_mutex); | 7101 | mutex_init(&ei->delalloc_mutex); |
7098 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); | 7102 | btrfs_ordered_inode_tree_init(&ei->ordered_tree); |
@@ -7203,6 +7207,8 @@ void btrfs_destroy_cachep(void) | |||
7203 | kmem_cache_destroy(btrfs_path_cachep); | 7207 | kmem_cache_destroy(btrfs_path_cachep); |
7204 | if (btrfs_free_space_cachep) | 7208 | if (btrfs_free_space_cachep) |
7205 | kmem_cache_destroy(btrfs_free_space_cachep); | 7209 | kmem_cache_destroy(btrfs_free_space_cachep); |
7210 | if (btrfs_delalloc_work_cachep) | ||
7211 | kmem_cache_destroy(btrfs_delalloc_work_cachep); | ||
7206 | } | 7212 | } |
7207 | 7213 | ||
7208 | int btrfs_init_cachep(void) | 7214 | int btrfs_init_cachep(void) |
@@ -7237,6 +7243,13 @@ int btrfs_init_cachep(void) | |||
7237 | if (!btrfs_free_space_cachep) | 7243 | if (!btrfs_free_space_cachep) |
7238 | goto fail; | 7244 | goto fail; |
7239 | 7245 | ||
7246 | btrfs_delalloc_work_cachep = kmem_cache_create("btrfs_delalloc_work", | ||
7247 | sizeof(struct btrfs_delalloc_work), 0, | ||
7248 | SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, | ||
7249 | NULL); | ||
7250 | if (!btrfs_delalloc_work_cachep) | ||
7251 | goto fail; | ||
7252 | |||
7240 | return 0; | 7253 | return 0; |
7241 | fail: | 7254 | fail: |
7242 | btrfs_destroy_cachep(); | 7255 | btrfs_destroy_cachep(); |
@@ -7308,6 +7321,28 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
7308 | if (S_ISDIR(old_inode->i_mode) && new_inode && | 7321 | if (S_ISDIR(old_inode->i_mode) && new_inode && |
7309 | new_inode->i_size > BTRFS_EMPTY_DIR_SIZE) | 7322 | new_inode->i_size > BTRFS_EMPTY_DIR_SIZE) |
7310 | return -ENOTEMPTY; | 7323 | return -ENOTEMPTY; |
7324 | |||
7325 | |||
7326 | /* check for collisions, even if the name isn't there */ | ||
7327 | ret = btrfs_check_dir_item_collision(root, new_dir->i_ino, | ||
7328 | new_dentry->d_name.name, | ||
7329 | new_dentry->d_name.len); | ||
7330 | |||
7331 | if (ret) { | ||
7332 | if (ret == -EEXIST) { | ||
7333 | /* we shouldn't get | ||
7334 | * eexist without a new_inode */ | ||
7335 | if (!new_inode) { | ||
7336 | WARN_ON(1); | ||
7337 | return ret; | ||
7338 | } | ||
7339 | } else { | ||
7340 | /* maybe -EOVERFLOW */ | ||
7341 | return ret; | ||
7342 | } | ||
7343 | } | ||
7344 | ret = 0; | ||
7345 | |||
7311 | /* | 7346 | /* |
7312 | * we're using rename to replace one file with another. | 7347 | * we're using rename to replace one file with another. |
7313 | * and the replacement file is large. Start IO on it now so | 7348 | * and the replacement file is large. Start IO on it now so |
@@ -7447,6 +7482,49 @@ out_notrans: | |||
7447 | return ret; | 7482 | return ret; |
7448 | } | 7483 | } |
7449 | 7484 | ||
7485 | static void btrfs_run_delalloc_work(struct btrfs_work *work) | ||
7486 | { | ||
7487 | struct btrfs_delalloc_work *delalloc_work; | ||
7488 | |||
7489 | delalloc_work = container_of(work, struct btrfs_delalloc_work, | ||
7490 | work); | ||
7491 | if (delalloc_work->wait) | ||
7492 | btrfs_wait_ordered_range(delalloc_work->inode, 0, (u64)-1); | ||
7493 | else | ||
7494 | filemap_flush(delalloc_work->inode->i_mapping); | ||
7495 | |||
7496 | if (delalloc_work->delay_iput) | ||
7497 | btrfs_add_delayed_iput(delalloc_work->inode); | ||
7498 | else | ||
7499 | iput(delalloc_work->inode); | ||
7500 | complete(&delalloc_work->completion); | ||
7501 | } | ||
7502 | |||
7503 | struct btrfs_delalloc_work *btrfs_alloc_delalloc_work(struct inode *inode, | ||
7504 | int wait, int delay_iput) | ||
7505 | { | ||
7506 | struct btrfs_delalloc_work *work; | ||
7507 | |||
7508 | work = kmem_cache_zalloc(btrfs_delalloc_work_cachep, GFP_NOFS); | ||
7509 | if (!work) | ||
7510 | return NULL; | ||
7511 | |||
7512 | init_completion(&work->completion); | ||
7513 | INIT_LIST_HEAD(&work->list); | ||
7514 | work->inode = inode; | ||
7515 | work->wait = wait; | ||
7516 | work->delay_iput = delay_iput; | ||
7517 | work->work.func = btrfs_run_delalloc_work; | ||
7518 | |||
7519 | return work; | ||
7520 | } | ||
7521 | |||
7522 | void btrfs_wait_and_free_delalloc_work(struct btrfs_delalloc_work *work) | ||
7523 | { | ||
7524 | wait_for_completion(&work->completion); | ||
7525 | kmem_cache_free(btrfs_delalloc_work_cachep, work); | ||
7526 | } | ||
7527 | |||
7450 | /* | 7528 | /* |
7451 | * some fairly slow code that needs optimization. This walks the list | 7529 | * some fairly slow code that needs optimization. This walks the list |
7452 | * of all the inodes with pending delalloc and forces them to disk. | 7530 | * of all the inodes with pending delalloc and forces them to disk. |
@@ -7456,10 +7534,15 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput) | |||
7456 | struct list_head *head = &root->fs_info->delalloc_inodes; | 7534 | struct list_head *head = &root->fs_info->delalloc_inodes; |
7457 | struct btrfs_inode *binode; | 7535 | struct btrfs_inode *binode; |
7458 | struct inode *inode; | 7536 | struct inode *inode; |
7537 | struct btrfs_delalloc_work *work, *next; | ||
7538 | struct list_head works; | ||
7539 | int ret = 0; | ||
7459 | 7540 | ||
7460 | if (root->fs_info->sb->s_flags & MS_RDONLY) | 7541 | if (root->fs_info->sb->s_flags & MS_RDONLY) |
7461 | return -EROFS; | 7542 | return -EROFS; |
7462 | 7543 | ||
7544 | INIT_LIST_HEAD(&works); | ||
7545 | |||
7463 | spin_lock(&root->fs_info->delalloc_lock); | 7546 | spin_lock(&root->fs_info->delalloc_lock); |
7464 | while (!list_empty(head)) { | 7547 | while (!list_empty(head)) { |
7465 | binode = list_entry(head->next, struct btrfs_inode, | 7548 | binode = list_entry(head->next, struct btrfs_inode, |
@@ -7469,11 +7552,14 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput) | |||
7469 | list_del_init(&binode->delalloc_inodes); | 7552 | list_del_init(&binode->delalloc_inodes); |
7470 | spin_unlock(&root->fs_info->delalloc_lock); | 7553 | spin_unlock(&root->fs_info->delalloc_lock); |
7471 | if (inode) { | 7554 | if (inode) { |
7472 | filemap_flush(inode->i_mapping); | 7555 | work = btrfs_alloc_delalloc_work(inode, 0, delay_iput); |
7473 | if (delay_iput) | 7556 | if (!work) { |
7474 | btrfs_add_delayed_iput(inode); | 7557 | ret = -ENOMEM; |
7475 | else | 7558 | goto out; |
7476 | iput(inode); | 7559 | } |
7560 | list_add_tail(&work->list, &works); | ||
7561 | btrfs_queue_worker(&root->fs_info->flush_workers, | ||
7562 | &work->work); | ||
7477 | } | 7563 | } |
7478 | cond_resched(); | 7564 | cond_resched(); |
7479 | spin_lock(&root->fs_info->delalloc_lock); | 7565 | spin_lock(&root->fs_info->delalloc_lock); |
@@ -7492,7 +7578,12 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput) | |||
7492 | atomic_read(&root->fs_info->async_delalloc_pages) == 0)); | 7578 | atomic_read(&root->fs_info->async_delalloc_pages) == 0)); |
7493 | } | 7579 | } |
7494 | atomic_dec(&root->fs_info->async_submit_draining); | 7580 | atomic_dec(&root->fs_info->async_submit_draining); |
7495 | return 0; | 7581 | out: |
7582 | list_for_each_entry_safe(work, next, &works, list) { | ||
7583 | list_del_init(&work->list); | ||
7584 | btrfs_wait_and_free_delalloc_work(work); | ||
7585 | } | ||
7586 | return ret; | ||
7496 | } | 7587 | } |
7497 | 7588 | ||
7498 | static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | 7589 | static int btrfs_symlink(struct inode *dir, struct dentry *dentry, |
@@ -7512,7 +7603,6 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7512 | unsigned long ptr; | 7603 | unsigned long ptr; |
7513 | struct btrfs_file_extent_item *ei; | 7604 | struct btrfs_file_extent_item *ei; |
7514 | struct extent_buffer *leaf; | 7605 | struct extent_buffer *leaf; |
7515 | unsigned long nr = 0; | ||
7516 | 7606 | ||
7517 | name_len = strlen(symname) + 1; | 7607 | name_len = strlen(symname) + 1; |
7518 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) | 7608 | if (name_len > BTRFS_MAX_INLINE_DATA_SIZE(root)) |
@@ -7610,13 +7700,12 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
7610 | out_unlock: | 7700 | out_unlock: |
7611 | if (!err) | 7701 | if (!err) |
7612 | d_instantiate(dentry, inode); | 7702 | d_instantiate(dentry, inode); |
7613 | nr = trans->blocks_used; | ||
7614 | btrfs_end_transaction(trans, root); | 7703 | btrfs_end_transaction(trans, root); |
7615 | if (drop_inode) { | 7704 | if (drop_inode) { |
7616 | inode_dec_link_count(inode); | 7705 | inode_dec_link_count(inode); |
7617 | iput(inode); | 7706 | iput(inode); |
7618 | } | 7707 | } |
7619 | btrfs_btree_balance_dirty(root, nr); | 7708 | btrfs_btree_balance_dirty(root); |
7620 | return err; | 7709 | return err; |
7621 | } | 7710 | } |
7622 | 7711 | ||
@@ -7679,6 +7768,7 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, | |||
7679 | em->len = ins.offset; | 7768 | em->len = ins.offset; |
7680 | em->block_start = ins.objectid; | 7769 | em->block_start = ins.objectid; |
7681 | em->block_len = ins.offset; | 7770 | em->block_len = ins.offset; |
7771 | em->orig_block_len = ins.offset; | ||
7682 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 7772 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
7683 | set_bit(EXTENT_FLAG_PREALLOC, &em->flags); | 7773 | set_bit(EXTENT_FLAG_PREALLOC, &em->flags); |
7684 | em->generation = trans->transid; | 7774 | em->generation = trans->transid; |