diff options
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r-- | fs/btrfs/extent_io.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 1a57c17d4029..a53aca338c7f 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -2017,6 +2017,7 @@ static int __extent_read_full_page(struct extent_io_tree *tree, | |||
2017 | sector_t sector; | 2017 | sector_t sector; |
2018 | struct extent_map *em; | 2018 | struct extent_map *em; |
2019 | struct block_device *bdev; | 2019 | struct block_device *bdev; |
2020 | struct btrfs_ordered_extent *ordered; | ||
2020 | int ret; | 2021 | int ret; |
2021 | int nr = 0; | 2022 | int nr = 0; |
2022 | size_t page_offset = 0; | 2023 | size_t page_offset = 0; |
@@ -2028,7 +2029,15 @@ static int __extent_read_full_page(struct extent_io_tree *tree, | |||
2028 | set_page_extent_mapped(page); | 2029 | set_page_extent_mapped(page); |
2029 | 2030 | ||
2030 | end = page_end; | 2031 | end = page_end; |
2031 | lock_extent(tree, start, end, GFP_NOFS); | 2032 | while (1) { |
2033 | lock_extent(tree, start, end, GFP_NOFS); | ||
2034 | ordered = btrfs_lookup_ordered_extent(inode, start); | ||
2035 | if (!ordered) | ||
2036 | break; | ||
2037 | unlock_extent(tree, start, end, GFP_NOFS); | ||
2038 | btrfs_start_ordered_extent(inode, ordered, 1); | ||
2039 | btrfs_put_ordered_extent(ordered); | ||
2040 | } | ||
2032 | 2041 | ||
2033 | if (page->index == last_byte >> PAGE_CACHE_SHIFT) { | 2042 | if (page->index == last_byte >> PAGE_CACHE_SHIFT) { |
2034 | char *userpage; | 2043 | char *userpage; |