diff options
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r-- | fs/btrfs/file.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index e81e428a8840..a56abed78104 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -552,6 +552,7 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
552 | int testend = 1; | 552 | int testend = 1; |
553 | unsigned long flags; | 553 | unsigned long flags; |
554 | int compressed = 0; | 554 | int compressed = 0; |
555 | bool modified; | ||
555 | 556 | ||
556 | WARN_ON(end < start); | 557 | WARN_ON(end < start); |
557 | if (end == (u64)-1) { | 558 | if (end == (u64)-1) { |
@@ -561,6 +562,7 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
561 | while (1) { | 562 | while (1) { |
562 | int no_splits = 0; | 563 | int no_splits = 0; |
563 | 564 | ||
565 | modified = false; | ||
564 | if (!split) | 566 | if (!split) |
565 | split = alloc_extent_map(); | 567 | split = alloc_extent_map(); |
566 | if (!split2) | 568 | if (!split2) |
@@ -592,6 +594,7 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
592 | compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags); | 594 | compressed = test_bit(EXTENT_FLAG_COMPRESSED, &em->flags); |
593 | clear_bit(EXTENT_FLAG_PINNED, &em->flags); | 595 | clear_bit(EXTENT_FLAG_PINNED, &em->flags); |
594 | clear_bit(EXTENT_FLAG_LOGGING, &flags); | 596 | clear_bit(EXTENT_FLAG_LOGGING, &flags); |
597 | modified = !list_empty(&em->list); | ||
595 | remove_extent_mapping(em_tree, em); | 598 | remove_extent_mapping(em_tree, em); |
596 | if (no_splits) | 599 | if (no_splits) |
597 | goto next; | 600 | goto next; |
@@ -614,9 +617,8 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
614 | split->bdev = em->bdev; | 617 | split->bdev = em->bdev; |
615 | split->flags = flags; | 618 | split->flags = flags; |
616 | split->compress_type = em->compress_type; | 619 | split->compress_type = em->compress_type; |
617 | ret = add_extent_mapping(em_tree, split); | 620 | ret = add_extent_mapping(em_tree, split, modified); |
618 | BUG_ON(ret); /* Logic error */ | 621 | BUG_ON(ret); /* Logic error */ |
619 | list_move(&split->list, &em_tree->modified_extents); | ||
620 | free_extent_map(split); | 622 | free_extent_map(split); |
621 | split = split2; | 623 | split = split2; |
622 | split2 = NULL; | 624 | split2 = NULL; |
@@ -645,9 +647,8 @@ void btrfs_drop_extent_cache(struct inode *inode, u64 start, u64 end, | |||
645 | split->orig_start = em->orig_start; | 647 | split->orig_start = em->orig_start; |
646 | } | 648 | } |
647 | 649 | ||
648 | ret = add_extent_mapping(em_tree, split); | 650 | ret = add_extent_mapping(em_tree, split, modified); |
649 | BUG_ON(ret); /* Logic error */ | 651 | BUG_ON(ret); /* Logic error */ |
650 | list_move(&split->list, &em_tree->modified_extents); | ||
651 | free_extent_map(split); | 652 | free_extent_map(split); |
652 | split = NULL; | 653 | split = NULL; |
653 | } | 654 | } |
@@ -1930,10 +1931,7 @@ out: | |||
1930 | do { | 1931 | do { |
1931 | btrfs_drop_extent_cache(inode, offset, end - 1, 0); | 1932 | btrfs_drop_extent_cache(inode, offset, end - 1, 0); |
1932 | write_lock(&em_tree->lock); | 1933 | write_lock(&em_tree->lock); |
1933 | ret = add_extent_mapping(em_tree, hole_em); | 1934 | ret = add_extent_mapping(em_tree, hole_em, 1); |
1934 | if (!ret) | ||
1935 | list_move(&hole_em->list, | ||
1936 | &em_tree->modified_extents); | ||
1937 | write_unlock(&em_tree->lock); | 1935 | write_unlock(&em_tree->lock); |
1938 | } while (ret == -EEXIST); | 1936 | } while (ret == -EEXIST); |
1939 | free_extent_map(hole_em); | 1937 | free_extent_map(hole_em); |