diff options
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r-- | fs/btrfs/file.c | 449 |
1 files changed, 409 insertions, 40 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 5caf285c6e4d..9ab1bed88116 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -39,6 +39,7 @@ | |||
39 | #include "tree-log.h" | 39 | #include "tree-log.h" |
40 | #include "locking.h" | 40 | #include "locking.h" |
41 | #include "compat.h" | 41 | #include "compat.h" |
42 | #include "volumes.h" | ||
42 | 43 | ||
43 | /* | 44 | /* |
44 | * when auto defrag is enabled we | 45 | * when auto defrag is enabled we |
@@ -458,14 +459,15 @@ int btrfs_dirty_pages(struct btrfs_root *root, struct inode *inode, | |||
458 | * this drops all the extents in the cache that intersect the range | 459 | * this drops all the extents in the cache that intersect the range |
459 | * [start, end]. Existing extents are split as required. | 460 | * [start, end]. Existing extents are split as required. |
460 | */ | 461 | */ |
461 | int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | 462 | void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, |
462 | int skip_pinned) | 463 | int skip_pinned) |
463 | { | 464 | { |
464 | struct extent_map *em; | 465 | struct extent_map *em; |
465 | struct extent_map *split = NULL; | 466 | struct extent_map *split = NULL; |
466 | struct extent_map *split2 = NULL; | 467 | struct extent_map *split2 = NULL; |
467 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 468 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; |
468 | u64 len = end - start + 1; | 469 | u64 len = end - start + 1; |
470 | u64 gen; | ||
469 | int ret; | 471 | int ret; |
470 | int testend = 1; | 472 | int testend = 1; |
471 | unsigned long flags; | 473 | unsigned long flags; |
@@ -477,11 +479,14 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
477 | testend = 0; | 479 | testend = 0; |
478 | } | 480 | } |
479 | while (1) { | 481 | while (1) { |
482 | int no_splits = 0; | ||
483 | |||
480 | if (!split) | 484 | if (!split) |
481 | split = alloc_extent_map(); | 485 | split = alloc_extent_map(); |
482 | if (!split2) | 486 | if (!split2) |
483 | split2 = alloc_extent_map(); | 487 | split2 = alloc_extent_map(); |
484 | BUG_ON(!split || !split2); /* -ENOMEM */ | 488 | if (!split || !split2) |
489 | no_splits = 1; | ||
485 | 490 | ||
486 | write_lock(&em_tree->lock); | 491 | write_lock(&em_tree->lock); |
487 | em = lookup_extent_mapping(em_tree, start, len); | 492 | em = lookup_extent_mapping(em_tree, start, len); |
@@ -490,6 +495,7 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
490 | break; | 495 | break; |
491 | } | 496 | } |
492 | flags = em->flags; | 497 | flags = em->flags; |
498 | gen = em->generation; | ||
493 | if (skip_pinned && test_bit(EXTENT_FLAG_PINNED, &em->flags)) { | 499 | if (skip_pinned && test_bit(EXTENT_FLAG_PINNED, &em->flags)) { |
494 | if (testend && em->start + em->len >= start + len) { | 500 | if (testend && em->start + em->len >= start + len) { |
495 | free_extent_map(em); | 501 | free_extent_map(em); |
@@ -506,6 +512,8 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
506 | compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 512 | compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
507 | clear_bit(EXTENT_FLAG_PINNED, &em->flags); | 513 | clear_bit(EXTENT_FLAG_PINNED, &em->flags); |
508 | remove_extent_mapping(em_tree, em); | 514 | remove_extent_mapping(em_tree, em); |
515 | if (no_splits) | ||
516 | goto next; | ||
509 | 517 | ||
510 | if (em->block_start < EXTENT_MAP_LAST_BYTE && | 518 | if (em->block_start < EXTENT_MAP_LAST_BYTE && |
511 | em->start < start) { | 519 | em->start < start) { |
@@ -518,12 +526,13 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
518 | split->block_len = em->block_len; | 526 | split->block_len = em->block_len; |
519 | else | 527 | else |
520 | split->block_len = split->len; | 528 | split->block_len = split->len; |
521 | 529 | split->generation = gen; | |
522 | split->bdev = em->bdev; | 530 | split->bdev = em->bdev; |
523 | split->flags = flags; | 531 | split->flags = flags; |
524 | split->compress_type = em->compress_type; | 532 | split->compress_type = em->compress_type; |
525 | ret = add_extent_mapping(em_tree, split); | 533 | ret = add_extent_mapping(em_tree, split); |
526 | BUG_ON(ret); /* Logic error */ | 534 | BUG_ON(ret); /* Logic error */ |
535 | list_move(&split->list, &em_tree->modified_extents); | ||
527 | free_extent_map(split); | 536 | free_extent_map(split); |
528 | split = split2; | 537 | split = split2; |
529 | split2 = NULL; | 538 | split2 = NULL; |
@@ -537,6 +546,7 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
537 | split->bdev = em->bdev; | 546 | split->bdev = em->bdev; |
538 | split->flags = flags; | 547 | split->flags = flags; |
539 | split->compress_type = em->compress_type; | 548 | split->compress_type = em->compress_type; |
549 | split->generation = gen; | ||
540 | 550 | ||
541 | if (compressed) { | 551 | if (compressed) { |
542 | split->block_len = em->block_len; | 552 | split->block_len = em->block_len; |
@@ -550,9 +560,11 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
550 | 560 | ||
551 | ret = add_extent_mapping(em_tree, split); | 561 | ret = add_extent_mapping(em_tree, split); |
552 | BUG_ON(ret); /* Logic error */ | 562 | BUG_ON(ret); /* Logic error */ |
563 | list_move(&split->list, &em_tree->modified_extents); | ||
553 | free_extent_map(split); | 564 | free_extent_map(split); |
554 | split = NULL; | 565 | split = NULL; |
555 | } | 566 | } |
567 | next: | ||
556 | write_unlock(&em_tree->lock); | 568 | write_unlock(&em_tree->lock); |
557 | 569 | ||
558 | /* once for us */ | 570 | /* once for us */ |
@@ -564,7 +576,6 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
564 | free_extent_map(split); | 576 | free_extent_map(split); |
565 | if (split2) | 577 | if (split2) |
566 | free_extent_map(split2); | 578 | free_extent_map(split2); |
567 | return 0; | ||
568 | } | 579 | } |
569 | 580 | ||
570 | /* | 581 | /* |
@@ -576,13 +587,13 @@ int btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
576 | * it is either truncated or split. Anything entirely inside the range | 587 | * it is either truncated or split. Anything entirely inside the range |
577 | * is deleted from the tree. | 588 | * is deleted from the tree. |
578 | */ | 589 | */ |
579 | int btrfs_drop_extents(struct btrfs_trans_handle *trans, struct inode *inode, | 590 | int __btrfs_drop_extents(struct btrfs_trans_handle *trans, |
580 | u64 start, u64 end, u64 *hint_byte, int drop_cache) | 591 | struct btrfs_root *root, struct inode *inode, |
592 | struct btrfs_path *path, u64 start, u64 end, | ||
593 | u64 *drop_end, int drop_cache) | ||
581 | { | 594 | { |
582 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
583 | struct extent_buffer *leaf; | 595 | struct extent_buffer *leaf; |
584 | struct btrfs_file_extent_item *fi; | 596 | struct btrfs_file_extent_item *fi; |
585 | struct btrfs_path *path; | ||
586 | struct btrfs_key key; | 597 | struct btrfs_key key; |
587 | struct btrfs_key new_key; | 598 | struct btrfs_key new_key; |
588 | u64 ino = btrfs_ino(inode); | 599 | u64 ino = btrfs_ino(inode); |
@@ -597,14 +608,12 @@ int btrfs_drop_extents(struct btrfs_trans_handle *trans, struct inode *inode, | |||
597 | int recow; | 608 | int recow; |
598 | int ret; | 609 | int ret; |
599 | int modify_tree = -1; | 610 | int modify_tree = -1; |
611 | int update_refs = (root->ref_cows || root == root->fs_info->tree_root); | ||
612 | int found = 0; | ||
600 | 613 | ||
601 | if (drop_cache) | 614 | if (drop_cache) |
602 | btrfs_drop_extent_cache(inode, start, end - 1, 0); | 615 | btrfs_drop_extent_cache(inode, start, end - 1, 0); |
603 | 616 | ||
604 | path = btrfs_alloc_path(); | ||
605 | if (!path) | ||
606 | return -ENOMEM; | ||
607 | |||
608 | if (start >= BTRFS_I(inode)->disk_i_size) | 617 | if (start >= BTRFS_I(inode)->disk_i_size) |
609 | modify_tree = 0; | 618 | modify_tree = 0; |
610 | 619 | ||
@@ -666,6 +675,7 @@ next_slot: | |||
666 | goto next_slot; | 675 | goto next_slot; |
667 | } | 676 | } |
668 | 677 | ||
678 | found = 1; | ||
669 | search_start = max(key.offset, start); | 679 | search_start = max(key.offset, start); |
670 | if (recow || !modify_tree) { | 680 | if (recow || !modify_tree) { |
671 | modify_tree = -1; | 681 | modify_tree = -1; |
@@ -707,14 +717,13 @@ next_slot: | |||
707 | extent_end - start); | 717 | extent_end - start); |
708 | btrfs_mark_buffer_dirty(leaf); | 718 | btrfs_mark_buffer_dirty(leaf); |
709 | 719 | ||
710 | if (disk_bytenr > 0) { | 720 | if (update_refs && disk_bytenr > 0) { |
711 | ret = btrfs_inc_extent_ref(trans, root, | 721 | ret = btrfs_inc_extent_ref(trans, root, |
712 | disk_bytenr, num_bytes, 0, | 722 | disk_bytenr, num_bytes, 0, |
713 | root->root_key.objectid, | 723 | root->root_key.objectid, |
714 | new_key.objectid, | 724 | new_key.objectid, |
715 | start - extent_offset, 0); | 725 | start - extent_offset, 0); |
716 | BUG_ON(ret); /* -ENOMEM */ | 726 | BUG_ON(ret); /* -ENOMEM */ |
717 | *hint_byte = disk_bytenr; | ||
718 | } | 727 | } |
719 | key.offset = start; | 728 | key.offset = start; |
720 | } | 729 | } |
@@ -734,10 +743,8 @@ next_slot: | |||
734 | btrfs_set_file_extent_num_bytes(leaf, fi, | 743 | btrfs_set_file_extent_num_bytes(leaf, fi, |
735 | extent_end - end); | 744 | extent_end - end); |
736 | btrfs_mark_buffer_dirty(leaf); | 745 | btrfs_mark_buffer_dirty(leaf); |
737 | if (disk_bytenr > 0) { | 746 | if (update_refs && disk_bytenr > 0) |
738 | inode_sub_bytes(inode, end - key.offset); | 747 | inode_sub_bytes(inode, end - key.offset); |
739 | *hint_byte = disk_bytenr; | ||
740 | } | ||
741 | break; | 748 | break; |
742 | } | 749 | } |
743 | 750 | ||
@@ -753,10 +760,8 @@ next_slot: | |||
753 | btrfs_set_file_extent_num_bytes(leaf, fi, | 760 | btrfs_set_file_extent_num_bytes(leaf, fi, |
754 | start - key.offset); | 761 | start - key.offset); |
755 | btrfs_mark_buffer_dirty(leaf); | 762 | btrfs_mark_buffer_dirty(leaf); |
756 | if (disk_bytenr > 0) { | 763 | if (update_refs && disk_bytenr > 0) |
757 | inode_sub_bytes(inode, extent_end - start); | 764 | inode_sub_bytes(inode, extent_end - start); |
758 | *hint_byte = disk_bytenr; | ||
759 | } | ||
760 | if (end == extent_end) | 765 | if (end == extent_end) |
761 | break; | 766 | break; |
762 | 767 | ||
@@ -777,12 +782,13 @@ next_slot: | |||
777 | del_nr++; | 782 | del_nr++; |
778 | } | 783 | } |
779 | 784 | ||
780 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { | 785 | if (update_refs && |
786 | extent_type == BTRFS_FILE_EXTENT_INLINE) { | ||
781 | inode_sub_bytes(inode, | 787 | inode_sub_bytes(inode, |
782 | extent_end - key.offset); | 788 | extent_end - key.offset); |
783 | extent_end = ALIGN(extent_end, | 789 | extent_end = ALIGN(extent_end, |
784 | root->sectorsize); | 790 | root->sectorsize); |
785 | } else if (disk_bytenr > 0) { | 791 | } else if (update_refs && disk_bytenr > 0) { |
786 | ret = btrfs_free_extent(trans, root, | 792 | ret = btrfs_free_extent(trans, root, |
787 | disk_bytenr, num_bytes, 0, | 793 | disk_bytenr, num_bytes, 0, |
788 | root->root_key.objectid, | 794 | root->root_key.objectid, |
@@ -791,7 +797,6 @@ next_slot: | |||
791 | BUG_ON(ret); /* -ENOMEM */ | 797 | BUG_ON(ret); /* -ENOMEM */ |
792 | inode_sub_bytes(inode, | 798 | inode_sub_bytes(inode, |
793 | extent_end - key.offset); | 799 | extent_end - key.offset); |
794 | *hint_byte = disk_bytenr; | ||
795 | } | 800 | } |
796 | 801 | ||
797 | if (end == extent_end) | 802 | if (end == extent_end) |
@@ -806,7 +811,7 @@ next_slot: | |||
806 | del_nr); | 811 | del_nr); |
807 | if (ret) { | 812 | if (ret) { |
808 | btrfs_abort_transaction(trans, root, ret); | 813 | btrfs_abort_transaction(trans, root, ret); |
809 | goto out; | 814 | break; |
810 | } | 815 | } |
811 | 816 | ||
812 | del_nr = 0; | 817 | del_nr = 0; |
@@ -825,7 +830,24 @@ next_slot: | |||
825 | btrfs_abort_transaction(trans, root, ret); | 830 | btrfs_abort_transaction(trans, root, ret); |
826 | } | 831 | } |
827 | 832 | ||
828 | out: | 833 | if (drop_end) |
834 | *drop_end = found ? min(end, extent_end) : end; | ||
835 | btrfs_release_path(path); | ||
836 | return ret; | ||
837 | } | ||
838 | |||
839 | int btrfs_drop_extents(struct btrfs_trans_handle *trans, | ||
840 | struct btrfs_root *root, struct inode *inode, u64 start, | ||
841 | u64 end, int drop_cache) | ||
842 | { | ||
843 | struct btrfs_path *path; | ||
844 | int ret; | ||
845 | |||
846 | path = btrfs_alloc_path(); | ||
847 | if (!path) | ||
848 | return -ENOMEM; | ||
849 | ret = __btrfs_drop_extents(trans, root, inode, path, start, end, NULL, | ||
850 | drop_cache); | ||
829 | btrfs_free_path(path); | 851 | btrfs_free_path(path); |
830 | return ret; | 852 | return ret; |
831 | } | 853 | } |
@@ -892,8 +914,6 @@ int btrfs_mark_extent_written(struct btrfs_trans_handle *trans, | |||
892 | int ret; | 914 | int ret; |
893 | u64 ino = btrfs_ino(inode); | 915 | u64 ino = btrfs_ino(inode); |
894 | 916 | ||
895 | btrfs_drop_extent_cache(inode, start, end - 1, 0); | ||
896 | |||
897 | path = btrfs_alloc_path(); | 917 | path = btrfs_alloc_path(); |
898 | if (!path) | 918 | if (!path) |
899 | return -ENOMEM; | 919 | return -ENOMEM; |
@@ -935,12 +955,16 @@ again: | |||
935 | btrfs_set_item_key_safe(trans, root, path, &new_key); | 955 | btrfs_set_item_key_safe(trans, root, path, &new_key); |
936 | fi = btrfs_item_ptr(leaf, path->slots[0], | 956 | fi = btrfs_item_ptr(leaf, path->slots[0], |
937 | struct btrfs_file_extent_item); | 957 | struct btrfs_file_extent_item); |
958 | btrfs_set_file_extent_generation(leaf, fi, | ||
959 | trans->transid); | ||
938 | btrfs_set_file_extent_num_bytes(leaf, fi, | 960 | btrfs_set_file_extent_num_bytes(leaf, fi, |
939 | extent_end - end); | 961 | extent_end - end); |
940 | btrfs_set_file_extent_offset(leaf, fi, | 962 | btrfs_set_file_extent_offset(leaf, fi, |
941 | end - orig_offset); | 963 | end - orig_offset); |
942 | fi = btrfs_item_ptr(leaf, path->slots[0] - 1, | 964 | fi = btrfs_item_ptr(leaf, path->slots[0] - 1, |
943 | struct btrfs_file_extent_item); | 965 | struct btrfs_file_extent_item); |
966 | btrfs_set_file_extent_generation(leaf, fi, | ||
967 | trans->transid); | ||
944 | btrfs_set_file_extent_num_bytes(leaf, fi, | 968 | btrfs_set_file_extent_num_bytes(leaf, fi, |
945 | end - other_start); | 969 | end - other_start); |
946 | btrfs_mark_buffer_dirty(leaf); | 970 | btrfs_mark_buffer_dirty(leaf); |
@@ -958,12 +982,16 @@ again: | |||
958 | struct btrfs_file_extent_item); | 982 | struct btrfs_file_extent_item); |
959 | btrfs_set_file_extent_num_bytes(leaf, fi, | 983 | btrfs_set_file_extent_num_bytes(leaf, fi, |
960 | start - key.offset); | 984 | start - key.offset); |
985 | btrfs_set_file_extent_generation(leaf, fi, | ||
986 | trans->transid); | ||
961 | path->slots[0]++; | 987 | path->slots[0]++; |
962 | new_key.offset = start; | 988 | new_key.offset = start; |
963 | btrfs_set_item_key_safe(trans, root, path, &new_key); | 989 | btrfs_set_item_key_safe(trans, root, path, &new_key); |
964 | 990 | ||
965 | fi = btrfs_item_ptr(leaf, path->slots[0], | 991 | fi = btrfs_item_ptr(leaf, path->slots[0], |
966 | struct btrfs_file_extent_item); | 992 | struct btrfs_file_extent_item); |
993 | btrfs_set_file_extent_generation(leaf, fi, | ||
994 | trans->transid); | ||
967 | btrfs_set_file_extent_num_bytes(leaf, fi, | 995 | btrfs_set_file_extent_num_bytes(leaf, fi, |
968 | other_end - start); | 996 | other_end - start); |
969 | btrfs_set_file_extent_offset(leaf, fi, | 997 | btrfs_set_file_extent_offset(leaf, fi, |
@@ -991,12 +1019,14 @@ again: | |||
991 | leaf = path->nodes[0]; | 1019 | leaf = path->nodes[0]; |
992 | fi = btrfs_item_ptr(leaf, path->slots[0] - 1, | 1020 | fi = btrfs_item_ptr(leaf, path->slots[0] - 1, |
993 | struct btrfs_file_extent_item); | 1021 | struct btrfs_file_extent_item); |
1022 | btrfs_set_file_extent_generation(leaf, fi, trans->transid); | ||
994 | btrfs_set_file_extent_num_bytes(leaf, fi, | 1023 | btrfs_set_file_extent_num_bytes(leaf, fi, |
995 | split - key.offset); | 1024 | split - key.offset); |
996 | 1025 | ||
997 | fi = btrfs_item_ptr(leaf, path->slots[0], | 1026 | fi = btrfs_item_ptr(leaf, path->slots[0], |
998 | struct btrfs_file_extent_item); | 1027 | struct btrfs_file_extent_item); |
999 | 1028 | ||
1029 | btrfs_set_file_extent_generation(leaf, fi, trans->transid); | ||
1000 | btrfs_set_file_extent_offset(leaf, fi, split - orig_offset); | 1030 | btrfs_set_file_extent_offset(leaf, fi, split - orig_offset); |
1001 | btrfs_set_file_extent_num_bytes(leaf, fi, | 1031 | btrfs_set_file_extent_num_bytes(leaf, fi, |
1002 | extent_end - split); | 1032 | extent_end - split); |
@@ -1056,12 +1086,14 @@ again: | |||
1056 | struct btrfs_file_extent_item); | 1086 | struct btrfs_file_extent_item); |
1057 | btrfs_set_file_extent_type(leaf, fi, | 1087 | btrfs_set_file_extent_type(leaf, fi, |
1058 | BTRFS_FILE_EXTENT_REG); | 1088 | BTRFS_FILE_EXTENT_REG); |
1089 | btrfs_set_file_extent_generation(leaf, fi, trans->transid); | ||
1059 | btrfs_mark_buffer_dirty(leaf); | 1090 | btrfs_mark_buffer_dirty(leaf); |
1060 | } else { | 1091 | } else { |
1061 | fi = btrfs_item_ptr(leaf, del_slot - 1, | 1092 | fi = btrfs_item_ptr(leaf, del_slot - 1, |
1062 | struct btrfs_file_extent_item); | 1093 | struct btrfs_file_extent_item); |
1063 | btrfs_set_file_extent_type(leaf, fi, | 1094 | btrfs_set_file_extent_type(leaf, fi, |
1064 | BTRFS_FILE_EXTENT_REG); | 1095 | BTRFS_FILE_EXTENT_REG); |
1096 | btrfs_set_file_extent_generation(leaf, fi, trans->transid); | ||
1065 | btrfs_set_file_extent_num_bytes(leaf, fi, | 1097 | btrfs_set_file_extent_num_bytes(leaf, fi, |
1066 | extent_end - key.offset); | 1098 | extent_end - key.offset); |
1067 | btrfs_mark_buffer_dirty(leaf); | 1099 | btrfs_mark_buffer_dirty(leaf); |
@@ -1173,8 +1205,8 @@ again: | |||
1173 | 1205 | ||
1174 | clear_extent_bit(&BTRFS_I(inode)->io_tree, start_pos, | 1206 | clear_extent_bit(&BTRFS_I(inode)->io_tree, start_pos, |
1175 | last_pos - 1, EXTENT_DIRTY | EXTENT_DELALLOC | | 1207 | last_pos - 1, EXTENT_DIRTY | EXTENT_DELALLOC | |
1176 | EXTENT_DO_ACCOUNTING, 0, 0, &cached_state, | 1208 | EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG, |
1177 | GFP_NOFS); | 1209 | 0, 0, &cached_state, GFP_NOFS); |
1178 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, | 1210 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, |
1179 | start_pos, last_pos - 1, &cached_state, | 1211 | start_pos, last_pos - 1, &cached_state, |
1180 | GFP_NOFS); | 1212 | GFP_NOFS); |
@@ -1514,16 +1546,24 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
1514 | 1546 | ||
1515 | trace_btrfs_sync_file(file, datasync); | 1547 | trace_btrfs_sync_file(file, datasync); |
1516 | 1548 | ||
1549 | /* | ||
1550 | * We write the dirty pages in the range and wait until they complete | ||
1551 | * out of the ->i_mutex. If so, we can flush the dirty pages by | ||
1552 | * multi-task, and make the performance up. | ||
1553 | */ | ||
1554 | ret = filemap_write_and_wait_range(inode->i_mapping, start, end); | ||
1555 | if (ret) | ||
1556 | return ret; | ||
1557 | |||
1517 | mutex_lock(&inode->i_mutex); | 1558 | mutex_lock(&inode->i_mutex); |
1518 | 1559 | ||
1519 | /* | 1560 | /* |
1520 | * we wait first, since the writeback may change the inode, also wait | 1561 | * We flush the dirty pages again to avoid some dirty pages in the |
1521 | * ordered range does a filemape_write_and_wait_range which is why we | 1562 | * range being left. |
1522 | * don't do it above like other file systems. | ||
1523 | */ | 1563 | */ |
1524 | root->log_batch++; | 1564 | atomic_inc(&root->log_batch); |
1525 | btrfs_wait_ordered_range(inode, start, end); | 1565 | btrfs_wait_ordered_range(inode, start, end); |
1526 | root->log_batch++; | 1566 | atomic_inc(&root->log_batch); |
1527 | 1567 | ||
1528 | /* | 1568 | /* |
1529 | * check the transaction that last modified this inode | 1569 | * check the transaction that last modified this inode |
@@ -1544,6 +1584,14 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
1544 | BTRFS_I(inode)->last_trans <= | 1584 | BTRFS_I(inode)->last_trans <= |
1545 | root->fs_info->last_trans_committed) { | 1585 | root->fs_info->last_trans_committed) { |
1546 | BTRFS_I(inode)->last_trans = 0; | 1586 | BTRFS_I(inode)->last_trans = 0; |
1587 | |||
1588 | /* | ||
1589 | * We'v had everything committed since the last time we were | ||
1590 | * modified so clear this flag in case it was set for whatever | ||
1591 | * reason, it's no longer relevant. | ||
1592 | */ | ||
1593 | clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC, | ||
1594 | &BTRFS_I(inode)->runtime_flags); | ||
1547 | mutex_unlock(&inode->i_mutex); | 1595 | mutex_unlock(&inode->i_mutex); |
1548 | goto out; | 1596 | goto out; |
1549 | } | 1597 | } |
@@ -1599,6 +1647,7 @@ out: | |||
1599 | static const struct vm_operations_struct btrfs_file_vm_ops = { | 1647 | static const struct vm_operations_struct btrfs_file_vm_ops = { |
1600 | .fault = filemap_fault, | 1648 | .fault = filemap_fault, |
1601 | .page_mkwrite = btrfs_page_mkwrite, | 1649 | .page_mkwrite = btrfs_page_mkwrite, |
1650 | .remap_pages = generic_file_remap_pages, | ||
1602 | }; | 1651 | }; |
1603 | 1652 | ||
1604 | static int btrfs_file_mmap(struct file *filp, struct vm_area_struct *vma) | 1653 | static int btrfs_file_mmap(struct file *filp, struct vm_area_struct *vma) |
@@ -1610,11 +1659,328 @@ static int btrfs_file_mmap(struct file *filp, struct vm_area_struct *vma) | |||
1610 | 1659 | ||
1611 | file_accessed(filp); | 1660 | file_accessed(filp); |
1612 | vma->vm_ops = &btrfs_file_vm_ops; | 1661 | vma->vm_ops = &btrfs_file_vm_ops; |
1613 | vma->vm_flags |= VM_CAN_NONLINEAR; | ||
1614 | 1662 | ||
1615 | return 0; | 1663 | return 0; |
1616 | } | 1664 | } |
1617 | 1665 | ||
1666 | static int hole_mergeable(struct inode *inode, struct extent_buffer *leaf, | ||
1667 | int slot, u64 start, u64 end) | ||
1668 | { | ||
1669 | struct btrfs_file_extent_item *fi; | ||
1670 | struct btrfs_key key; | ||
1671 | |||
1672 | if (slot < 0 || slot >= btrfs_header_nritems(leaf)) | ||
1673 | return 0; | ||
1674 | |||
1675 | btrfs_item_key_to_cpu(leaf, &key, slot); | ||
1676 | if (key.objectid != btrfs_ino(inode) || | ||
1677 | key.type != BTRFS_EXTENT_DATA_KEY) | ||
1678 | return 0; | ||
1679 | |||
1680 | fi = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item); | ||
1681 | |||
1682 | if (btrfs_file_extent_type(leaf, fi) != BTRFS_FILE_EXTENT_REG) | ||
1683 | return 0; | ||
1684 | |||
1685 | if (btrfs_file_extent_disk_bytenr(leaf, fi)) | ||
1686 | return 0; | ||
1687 | |||
1688 | if (key.offset == end) | ||
1689 | return 1; | ||
1690 | if (key.offset + btrfs_file_extent_num_bytes(leaf, fi) == start) | ||
1691 | return 1; | ||
1692 | return 0; | ||
1693 | } | ||
1694 | |||
1695 | static int fill_holes(struct btrfs_trans_handle *trans, struct inode *inode, | ||
1696 | struct btrfs_path *path, u64 offset, u64 end) | ||
1697 | { | ||
1698 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
1699 | struct extent_buffer *leaf; | ||
1700 | struct btrfs_file_extent_item *fi; | ||
1701 | struct extent_map *hole_em; | ||
1702 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | ||
1703 | struct btrfs_key key; | ||
1704 | int ret; | ||
1705 | |||
1706 | key.objectid = btrfs_ino(inode); | ||
1707 | key.type = BTRFS_EXTENT_DATA_KEY; | ||
1708 | key.offset = offset; | ||
1709 | |||
1710 | |||
1711 | ret = btrfs_search_slot(trans, root, &key, path, 0, 1); | ||
1712 | if (ret < 0) | ||
1713 | return ret; | ||
1714 | BUG_ON(!ret); | ||
1715 | |||
1716 | leaf = path->nodes[0]; | ||
1717 | if (hole_mergeable(inode, leaf, path->slots[0]-1, offset, end)) { | ||
1718 | u64 num_bytes; | ||
1719 | |||
1720 | path->slots[0]--; | ||
1721 | fi = btrfs_item_ptr(leaf, path->slots[0], | ||
1722 | struct btrfs_file_extent_item); | ||
1723 | num_bytes = btrfs_file_extent_num_bytes(leaf, fi) + | ||
1724 | end - offset; | ||
1725 | btrfs_set_file_extent_num_bytes(leaf, fi, num_bytes); | ||
1726 | btrfs_set_file_extent_ram_bytes(leaf, fi, num_bytes); | ||
1727 | btrfs_set_file_extent_offset(leaf, fi, 0); | ||
1728 | btrfs_mark_buffer_dirty(leaf); | ||
1729 | goto out; | ||
1730 | } | ||
1731 | |||
1732 | if (hole_mergeable(inode, leaf, path->slots[0]+1, offset, end)) { | ||
1733 | u64 num_bytes; | ||
1734 | |||
1735 | path->slots[0]++; | ||
1736 | key.offset = offset; | ||
1737 | btrfs_set_item_key_safe(trans, root, path, &key); | ||
1738 | fi = btrfs_item_ptr(leaf, path->slots[0], | ||
1739 | struct btrfs_file_extent_item); | ||
1740 | num_bytes = btrfs_file_extent_num_bytes(leaf, fi) + end - | ||
1741 | offset; | ||
1742 | btrfs_set_file_extent_num_bytes(leaf, fi, num_bytes); | ||
1743 | btrfs_set_file_extent_ram_bytes(leaf, fi, num_bytes); | ||
1744 | btrfs_set_file_extent_offset(leaf, fi, 0); | ||
1745 | btrfs_mark_buffer_dirty(leaf); | ||
1746 | goto out; | ||
1747 | } | ||
1748 | btrfs_release_path(path); | ||
1749 | |||
1750 | ret = btrfs_insert_file_extent(trans, root, btrfs_ino(inode), offset, | ||
1751 | 0, 0, end - offset, 0, end - offset, | ||
1752 | 0, 0, 0); | ||
1753 | if (ret) | ||
1754 | return ret; | ||
1755 | |||
1756 | out: | ||
1757 | btrfs_release_path(path); | ||
1758 | |||
1759 | hole_em = alloc_extent_map(); | ||
1760 | if (!hole_em) { | ||
1761 | btrfs_drop_extent_cache(inode, offset, end - 1, 0); | ||
1762 | set_bit(BTRFS_INODE_NEEDS_FULL_SYNC, | ||
1763 | &BTRFS_I(inode)->runtime_flags); | ||
1764 | } else { | ||
1765 | hole_em->start = offset; | ||
1766 | hole_em->len = end - offset; | ||
1767 | hole_em->orig_start = offset; | ||
1768 | |||
1769 | hole_em->block_start = EXTENT_MAP_HOLE; | ||
1770 | hole_em->block_len = 0; | ||
1771 | hole_em->bdev = root->fs_info->fs_devices->latest_bdev; | ||
1772 | hole_em->compress_type = BTRFS_COMPRESS_NONE; | ||
1773 | hole_em->generation = trans->transid; | ||
1774 | |||
1775 | do { | ||
1776 | btrfs_drop_extent_cache(inode, offset, end - 1, 0); | ||
1777 | write_lock(&em_tree->lock); | ||
1778 | ret = add_extent_mapping(em_tree, hole_em); | ||
1779 | if (!ret) | ||
1780 | list_move(&hole_em->list, | ||
1781 | &em_tree->modified_extents); | ||
1782 | write_unlock(&em_tree->lock); | ||
1783 | } while (ret == -EEXIST); | ||
1784 | free_extent_map(hole_em); | ||
1785 | if (ret) | ||
1786 | set_bit(BTRFS_INODE_NEEDS_FULL_SYNC, | ||
1787 | &BTRFS_I(inode)->runtime_flags); | ||
1788 | } | ||
1789 | |||
1790 | return 0; | ||
1791 | } | ||
1792 | |||
1793 | static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len) | ||
1794 | { | ||
1795 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
1796 | struct extent_state *cached_state = NULL; | ||
1797 | struct btrfs_path *path; | ||
1798 | struct btrfs_block_rsv *rsv; | ||
1799 | struct btrfs_trans_handle *trans; | ||
1800 | u64 mask = BTRFS_I(inode)->root->sectorsize - 1; | ||
1801 | u64 lockstart = (offset + mask) & ~mask; | ||
1802 | u64 lockend = ((offset + len) & ~mask) - 1; | ||
1803 | u64 cur_offset = lockstart; | ||
1804 | u64 min_size = btrfs_calc_trunc_metadata_size(root, 1); | ||
1805 | u64 drop_end; | ||
1806 | unsigned long nr; | ||
1807 | int ret = 0; | ||
1808 | int err = 0; | ||
1809 | bool same_page = (offset >> PAGE_CACHE_SHIFT) == | ||
1810 | ((offset + len) >> PAGE_CACHE_SHIFT); | ||
1811 | |||
1812 | btrfs_wait_ordered_range(inode, offset, len); | ||
1813 | |||
1814 | mutex_lock(&inode->i_mutex); | ||
1815 | if (offset >= inode->i_size) { | ||
1816 | mutex_unlock(&inode->i_mutex); | ||
1817 | return 0; | ||
1818 | } | ||
1819 | |||
1820 | /* | ||
1821 | * Only do this if we are in the same page and we aren't doing the | ||
1822 | * entire page. | ||
1823 | */ | ||
1824 | if (same_page && len < PAGE_CACHE_SIZE) { | ||
1825 | ret = btrfs_truncate_page(inode, offset, len, 0); | ||
1826 | mutex_unlock(&inode->i_mutex); | ||
1827 | return ret; | ||
1828 | } | ||
1829 | |||
1830 | /* zero back part of the first page */ | ||
1831 | ret = btrfs_truncate_page(inode, offset, 0, 0); | ||
1832 | if (ret) { | ||
1833 | mutex_unlock(&inode->i_mutex); | ||
1834 | return ret; | ||
1835 | } | ||
1836 | |||
1837 | /* zero the front end of the last page */ | ||
1838 | ret = btrfs_truncate_page(inode, offset + len, 0, 1); | ||
1839 | if (ret) { | ||
1840 | mutex_unlock(&inode->i_mutex); | ||
1841 | return ret; | ||
1842 | } | ||
1843 | |||
1844 | if (lockend < lockstart) { | ||
1845 | mutex_unlock(&inode->i_mutex); | ||
1846 | return 0; | ||
1847 | } | ||
1848 | |||
1849 | while (1) { | ||
1850 | struct btrfs_ordered_extent *ordered; | ||
1851 | |||
1852 | truncate_pagecache_range(inode, lockstart, lockend); | ||
1853 | |||
1854 | lock_extent_bits(&BTRFS_I(inode)->io_tree, lockstart, lockend, | ||
1855 | 0, &cached_state); | ||
1856 | ordered = btrfs_lookup_first_ordered_extent(inode, lockend); | ||
1857 | |||
1858 | /* | ||
1859 | * We need to make sure we have no ordered extents in this range | ||
1860 | * and nobody raced in and read a page in this range, if we did | ||
1861 | * we need to try again. | ||
1862 | */ | ||
1863 | if ((!ordered || | ||
1864 | (ordered->file_offset + ordered->len < lockstart || | ||
1865 | ordered->file_offset > lockend)) && | ||
1866 | !test_range_bit(&BTRFS_I(inode)->io_tree, lockstart, | ||
1867 | lockend, EXTENT_UPTODATE, 0, | ||
1868 | cached_state)) { | ||
1869 | if (ordered) | ||
1870 | btrfs_put_ordered_extent(ordered); | ||
1871 | break; | ||
1872 | } | ||
1873 | if (ordered) | ||
1874 | btrfs_put_ordered_extent(ordered); | ||
1875 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, lockstart, | ||
1876 | lockend, &cached_state, GFP_NOFS); | ||
1877 | btrfs_wait_ordered_range(inode, lockstart, | ||
1878 | lockend - lockstart + 1); | ||
1879 | } | ||
1880 | |||
1881 | path = btrfs_alloc_path(); | ||
1882 | if (!path) { | ||
1883 | ret = -ENOMEM; | ||
1884 | goto out; | ||
1885 | } | ||
1886 | |||
1887 | rsv = btrfs_alloc_block_rsv(root, BTRFS_BLOCK_RSV_TEMP); | ||
1888 | if (!rsv) { | ||
1889 | ret = -ENOMEM; | ||
1890 | goto out_free; | ||
1891 | } | ||
1892 | rsv->size = btrfs_calc_trunc_metadata_size(root, 1); | ||
1893 | rsv->failfast = 1; | ||
1894 | |||
1895 | /* | ||
1896 | * 1 - update the inode | ||
1897 | * 1 - removing the extents in the range | ||
1898 | * 1 - adding the hole extent | ||
1899 | */ | ||
1900 | trans = btrfs_start_transaction(root, 3); | ||
1901 | if (IS_ERR(trans)) { | ||
1902 | err = PTR_ERR(trans); | ||
1903 | goto out_free; | ||
1904 | } | ||
1905 | |||
1906 | ret = btrfs_block_rsv_migrate(&root->fs_info->trans_block_rsv, rsv, | ||
1907 | min_size); | ||
1908 | BUG_ON(ret); | ||
1909 | trans->block_rsv = rsv; | ||
1910 | |||
1911 | while (cur_offset < lockend) { | ||
1912 | ret = __btrfs_drop_extents(trans, root, inode, path, | ||
1913 | cur_offset, lockend + 1, | ||
1914 | &drop_end, 1); | ||
1915 | if (ret != -ENOSPC) | ||
1916 | break; | ||
1917 | |||
1918 | trans->block_rsv = &root->fs_info->trans_block_rsv; | ||
1919 | |||
1920 | ret = fill_holes(trans, inode, path, cur_offset, drop_end); | ||
1921 | if (ret) { | ||
1922 | err = ret; | ||
1923 | break; | ||
1924 | } | ||
1925 | |||
1926 | cur_offset = drop_end; | ||
1927 | |||
1928 | ret = btrfs_update_inode(trans, root, inode); | ||
1929 | if (ret) { | ||
1930 | err = ret; | ||
1931 | break; | ||
1932 | } | ||
1933 | |||
1934 | nr = trans->blocks_used; | ||
1935 | btrfs_end_transaction(trans, root); | ||
1936 | btrfs_btree_balance_dirty(root, nr); | ||
1937 | |||
1938 | trans = btrfs_start_transaction(root, 3); | ||
1939 | if (IS_ERR(trans)) { | ||
1940 | ret = PTR_ERR(trans); | ||
1941 | trans = NULL; | ||
1942 | break; | ||
1943 | } | ||
1944 | |||
1945 | ret = btrfs_block_rsv_migrate(&root->fs_info->trans_block_rsv, | ||
1946 | rsv, min_size); | ||
1947 | BUG_ON(ret); /* shouldn't happen */ | ||
1948 | trans->block_rsv = rsv; | ||
1949 | } | ||
1950 | |||
1951 | if (ret) { | ||
1952 | err = ret; | ||
1953 | goto out_trans; | ||
1954 | } | ||
1955 | |||
1956 | trans->block_rsv = &root->fs_info->trans_block_rsv; | ||
1957 | ret = fill_holes(trans, inode, path, cur_offset, drop_end); | ||
1958 | if (ret) { | ||
1959 | err = ret; | ||
1960 | goto out_trans; | ||
1961 | } | ||
1962 | |||
1963 | out_trans: | ||
1964 | if (!trans) | ||
1965 | goto out_free; | ||
1966 | |||
1967 | trans->block_rsv = &root->fs_info->trans_block_rsv; | ||
1968 | ret = btrfs_update_inode(trans, root, inode); | ||
1969 | nr = trans->blocks_used; | ||
1970 | btrfs_end_transaction(trans, root); | ||
1971 | btrfs_btree_balance_dirty(root, nr); | ||
1972 | out_free: | ||
1973 | btrfs_free_path(path); | ||
1974 | btrfs_free_block_rsv(root, rsv); | ||
1975 | out: | ||
1976 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, lockstart, lockend, | ||
1977 | &cached_state, GFP_NOFS); | ||
1978 | mutex_unlock(&inode->i_mutex); | ||
1979 | if (ret && !err) | ||
1980 | err = ret; | ||
1981 | return err; | ||
1982 | } | ||
1983 | |||
1618 | static long btrfs_fallocate(struct file *file, int mode, | 1984 | static long btrfs_fallocate(struct file *file, int mode, |
1619 | loff_t offset, loff_t len) | 1985 | loff_t offset, loff_t len) |
1620 | { | 1986 | { |
@@ -1633,15 +1999,18 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
1633 | alloc_start = offset & ~mask; | 1999 | alloc_start = offset & ~mask; |
1634 | alloc_end = (offset + len + mask) & ~mask; | 2000 | alloc_end = (offset + len + mask) & ~mask; |
1635 | 2001 | ||
1636 | /* We only support the FALLOC_FL_KEEP_SIZE mode */ | 2002 | /* Make sure we aren't being give some crap mode */ |
1637 | if (mode & ~FALLOC_FL_KEEP_SIZE) | 2003 | if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) |
1638 | return -EOPNOTSUPP; | 2004 | return -EOPNOTSUPP; |
1639 | 2005 | ||
2006 | if (mode & FALLOC_FL_PUNCH_HOLE) | ||
2007 | return btrfs_punch_hole(inode, offset, len); | ||
2008 | |||
1640 | /* | 2009 | /* |
1641 | * Make sure we have enough space before we do the | 2010 | * Make sure we have enough space before we do the |
1642 | * allocation. | 2011 | * allocation. |
1643 | */ | 2012 | */ |
1644 | ret = btrfs_check_data_free_space(inode, len); | 2013 | ret = btrfs_check_data_free_space(inode, alloc_end - alloc_start + 1); |
1645 | if (ret) | 2014 | if (ret) |
1646 | return ret; | 2015 | return ret; |
1647 | 2016 | ||
@@ -1748,7 +2117,7 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
1748 | out: | 2117 | out: |
1749 | mutex_unlock(&inode->i_mutex); | 2118 | mutex_unlock(&inode->i_mutex); |
1750 | /* Let go of our reservation. */ | 2119 | /* Let go of our reservation. */ |
1751 | btrfs_free_reserved_data_space(inode, len); | 2120 | btrfs_free_reserved_data_space(inode, alloc_end - alloc_start + 1); |
1752 | return ret; | 2121 | return ret; |
1753 | } | 2122 | } |
1754 | 2123 | ||