diff options
Diffstat (limited to 'fs/btrfs/extent_io.c')
-rw-r--r-- | fs/btrfs/extent_io.c | 45 |
1 files changed, 11 insertions, 34 deletions
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 | ||
3216 | int 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 | |||
3230 | static noinline void update_nr_written(struct page *page, | 3207 | static 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) |