diff options
Diffstat (limited to 'fs/btrfs/ordered-data.c')
-rw-r--r-- | fs/btrfs/ordered-data.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c index 157cc54fc634..760c4a5e096b 100644 --- a/fs/btrfs/ordered-data.c +++ b/fs/btrfs/ordered-data.c | |||
@@ -722,6 +722,7 @@ void btrfs_start_ordered_extent(struct inode *inode, | |||
722 | int btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len) | 722 | int btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len) |
723 | { | 723 | { |
724 | int ret = 0; | 724 | int ret = 0; |
725 | int ret_wb = 0; | ||
725 | u64 end; | 726 | u64 end; |
726 | u64 orig_end; | 727 | u64 orig_end; |
727 | struct btrfs_ordered_extent *ordered; | 728 | struct btrfs_ordered_extent *ordered; |
@@ -741,9 +742,14 @@ int btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len) | |||
741 | if (ret) | 742 | if (ret) |
742 | return ret; | 743 | return ret; |
743 | 744 | ||
744 | ret = filemap_fdatawait_range(inode->i_mapping, start, orig_end); | 745 | /* |
745 | if (ret) | 746 | * If we have a writeback error don't return immediately. Wait first |
746 | return ret; | 747 | * for any ordered extents that haven't completed yet. This is to make |
748 | * sure no one can dirty the same page ranges and call writepages() | ||
749 | * before the ordered extents complete - to avoid failures (-EEXIST) | ||
750 | * when adding the new ordered extents to the ordered tree. | ||
751 | */ | ||
752 | ret_wb = filemap_fdatawait_range(inode->i_mapping, start, orig_end); | ||
747 | 753 | ||
748 | end = orig_end; | 754 | end = orig_end; |
749 | while (1) { | 755 | while (1) { |
@@ -767,7 +773,7 @@ int btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len) | |||
767 | break; | 773 | break; |
768 | end--; | 774 | end--; |
769 | } | 775 | } |
770 | return ret; | 776 | return ret_wb ? ret_wb : ret; |
771 | } | 777 | } |
772 | 778 | ||
773 | /* | 779 | /* |