aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/compression.c6
-rw-r--r--fs/btrfs/extent_io.c45
-rw-r--r--fs/btrfs/extent_io.h3
3 files changed, 12 insertions, 42 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index c473c42d7d6c..3346cd8f9910 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -637,11 +637,7 @@ int btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
637 faili = nr_pages - 1; 637 faili = nr_pages - 1;
638 cb->nr_pages = nr_pages; 638 cb->nr_pages = nr_pages;
639 639
640 /* In the parent-locked case, we only locked the range we are 640 add_ra_bio_pages(inode, em_start + em_len, cb);
641 * interested in. In all other cases, we can opportunistically
642 * cache decompressed data that goes beyond the requested range. */
643 if (!(bio_flags & EXTENT_BIO_PARENT_LOCKED))
644 add_ra_bio_pages(inode, em_start + em_len, cb);
645 641
646 /* include any pages we added in add_ra-bio_pages */ 642 /* include any pages we added in add_ra-bio_pages */
647 uncompressed_len = bio->bi_vcnt * PAGE_CACHE_SIZE; 643 uncompressed_len = bio->bi_vcnt * PAGE_CACHE_SIZE;
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 2e7c97a3f344..392592dc7010 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2897,12 +2897,11 @@ static int __do_readpage(struct extent_io_tree *tree,
2897 struct block_device *bdev; 2897 struct block_device *bdev;
2898 int ret; 2898 int ret;
2899 int nr = 0; 2899 int nr = 0;
2900 int parent_locked = *bio_flags & EXTENT_BIO_PARENT_LOCKED;
2901 size_t pg_offset = 0; 2900 size_t pg_offset = 0;
2902 size_t iosize; 2901 size_t iosize;
2903 size_t disk_io_size; 2902 size_t disk_io_size;
2904 size_t blocksize = inode->i_sb->s_blocksize; 2903 size_t blocksize = inode->i_sb->s_blocksize;
2905 unsigned long this_bio_flag = *bio_flags & EXTENT_BIO_PARENT_LOCKED; 2904 unsigned long this_bio_flag = 0;
2906 2905
2907 set_page_extent_mapped(page); 2906 set_page_extent_mapped(page);
2908 2907
@@ -2942,18 +2941,16 @@ static int __do_readpage(struct extent_io_tree *tree,
2942 kunmap_atomic(userpage); 2941 kunmap_atomic(userpage);
2943 set_extent_uptodate(tree, cur, cur + iosize - 1, 2942 set_extent_uptodate(tree, cur, cur + iosize - 1,
2944 &cached, GFP_NOFS); 2943 &cached, GFP_NOFS);
2945 if (!parent_locked) 2944 unlock_extent_cached(tree, cur,
2946 unlock_extent_cached(tree, cur, 2945 cur + iosize - 1,
2947 cur + iosize - 1, 2946 &cached, GFP_NOFS);
2948 &cached, GFP_NOFS);
2949 break; 2947 break;
2950 } 2948 }
2951 em = __get_extent_map(inode, page, pg_offset, cur, 2949 em = __get_extent_map(inode, page, pg_offset, cur,
2952 end - cur + 1, get_extent, em_cached); 2950 end - cur + 1, get_extent, em_cached);
2953 if (IS_ERR_OR_NULL(em)) { 2951 if (IS_ERR_OR_NULL(em)) {
2954 SetPageError(page); 2952 SetPageError(page);
2955 if (!parent_locked) 2953 unlock_extent(tree, cur, end);
2956 unlock_extent(tree, cur, end);
2957 break; 2954 break;
2958 } 2955 }
2959 extent_offset = cur - em->start; 2956 extent_offset = cur - em->start;
@@ -3038,12 +3035,9 @@ static int __do_readpage(struct extent_io_tree *tree,
3038 3035
3039 set_extent_uptodate(tree, cur, cur + iosize - 1, 3036 set_extent_uptodate(tree, cur, cur + iosize - 1,
3040 &cached, GFP_NOFS); 3037 &cached, GFP_NOFS);
3041 if (parent_locked) 3038 unlock_extent_cached(tree, cur,
3042 free_extent_state(cached); 3039 cur + iosize - 1,
3043 else 3040 &cached, GFP_NOFS);
3044 unlock_extent_cached(tree, cur,
3045 cur + iosize - 1,
3046 &cached, GFP_NOFS);
3047 cur = cur + iosize; 3041 cur = cur + iosize;
3048 pg_offset += iosize; 3042 pg_offset += iosize;
3049 continue; 3043 continue;
@@ -3052,8 +3046,7 @@ static int __do_readpage(struct extent_io_tree *tree,
3052 if (test_range_bit(tree, cur, cur_end, 3046 if (test_range_bit(tree, cur, cur_end,
3053 EXTENT_UPTODATE, 1, NULL)) { 3047 EXTENT_UPTODATE, 1, NULL)) {
3054 check_page_uptodate(tree, page); 3048 check_page_uptodate(tree, page);
3055 if (!parent_locked) 3049 unlock_extent(tree, cur, cur + iosize - 1);
3056 unlock_extent(tree, cur, cur + iosize - 1);
3057 cur = cur + iosize; 3050 cur = cur + iosize;
3058 pg_offset += iosize; 3051 pg_offset += iosize;
3059 continue; 3052 continue;
@@ -3063,8 +3056,7 @@ static int __do_readpage(struct extent_io_tree *tree,
3063 */ 3056 */
3064 if (block_start == EXTENT_MAP_INLINE) { 3057 if (block_start == EXTENT_MAP_INLINE) {
3065 SetPageError(page); 3058 SetPageError(page);
3066 if (!parent_locked) 3059 unlock_extent(tree, cur, cur + iosize - 1);
3067 unlock_extent(tree, cur, cur + iosize - 1);
3068 cur = cur + iosize; 3060 cur = cur + iosize;
3069 pg_offset += iosize; 3061 pg_offset += iosize;
3070 continue; 3062 continue;
@@ -3083,8 +3075,7 @@ static int __do_readpage(struct extent_io_tree *tree,
3083 *bio_flags = this_bio_flag; 3075 *bio_flags = this_bio_flag;
3084 } else { 3076 } else {
3085 SetPageError(page); 3077 SetPageError(page);
3086 if (!parent_locked) 3078 unlock_extent(tree, cur, cur + iosize - 1);
3087 unlock_extent(tree, cur, cur + iosize - 1);
3088 } 3079 }
3089 cur = cur + iosize; 3080 cur = cur + iosize;
3090 pg_offset += iosize; 3081 pg_offset += iosize;
@@ -3213,20 +3204,6 @@ int extent_read_full_page(struct extent_io_tree *tree, struct page *page,
3213 return ret; 3204 return ret;
3214} 3205}
3215 3206
3216int extent_read_full_page_nolock(struct extent_io_tree *tree, struct page *page,
3217 get_extent_t *get_extent, int mirror_num)
3218{
3219 struct bio *bio = NULL;
3220 unsigned long bio_flags = EXTENT_BIO_PARENT_LOCKED;
3221 int ret;
3222
3223 ret = __do_readpage(tree, page, get_extent, NULL, &bio, mirror_num,
3224 &bio_flags, READ, NULL);
3225 if (bio)
3226 ret = submit_one_bio(READ, bio, mirror_num, bio_flags);
3227 return ret;
3228}
3229
3230static noinline void update_nr_written(struct page *page, 3207static noinline void update_nr_written(struct page *page,
3231 struct writeback_control *wbc, 3208 struct writeback_control *wbc,
3232 unsigned long nr_written) 3209 unsigned long nr_written)
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
index 0377413bd4b9..880d5292e972 100644
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -29,7 +29,6 @@
29 */ 29 */
30#define EXTENT_BIO_COMPRESSED 1 30#define EXTENT_BIO_COMPRESSED 1
31#define EXTENT_BIO_TREE_LOG 2 31#define EXTENT_BIO_TREE_LOG 2
32#define EXTENT_BIO_PARENT_LOCKED 4
33#define EXTENT_BIO_FLAG_SHIFT 16 32#define EXTENT_BIO_FLAG_SHIFT 16
34 33
35/* these are bit numbers for test/set bit */ 34/* these are bit numbers for test/set bit */
@@ -210,8 +209,6 @@ static inline int lock_extent(struct extent_io_tree *tree, u64 start, u64 end)
210int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end); 209int try_lock_extent(struct extent_io_tree *tree, u64 start, u64 end);
211int extent_read_full_page(struct extent_io_tree *tree, struct page *page, 210int extent_read_full_page(struct extent_io_tree *tree, struct page *page,
212 get_extent_t *get_extent, int mirror_num); 211 get_extent_t *get_extent, int mirror_num);
213int extent_read_full_page_nolock(struct extent_io_tree *tree, struct page *page,
214 get_extent_t *get_extent, int mirror_num);
215int __init extent_io_init(void); 212int __init extent_io_init(void);
216void extent_io_exit(void); 213void extent_io_exit(void);
217 214