diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2017-02-26 15:34:42 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2017-02-26 15:34:42 -0500 |
commit | 8e22e1b3499a446df48c2b26667ca36c55bf864c (patch) | |
tree | 5329f98b3eb3c95a9dcbab0fa4f9b6e62f0e788d /fs/btrfs/compression.c | |
parent | 00d3c14f14d51babd8aeafd5fa734ccf04f5ca3d (diff) | |
parent | 64a577196d66b44e37384bc5c4d78c61f59d5b2a (diff) |
Merge airlied/drm-next into drm-misc-next
Backmerge the main pull request to sync up with all the newly landed
drivers. Otherwise we'll have chaos even before 4.12 started in
earnest.
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Diffstat (limited to 'fs/btrfs/compression.c')
-rw-r--r-- | fs/btrfs/compression.c | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 7f390849343b..c4444d6f439f 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c | |||
@@ -1024,6 +1024,7 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start, | |||
1024 | unsigned long buf_offset; | 1024 | unsigned long buf_offset; |
1025 | unsigned long current_buf_start; | 1025 | unsigned long current_buf_start; |
1026 | unsigned long start_byte; | 1026 | unsigned long start_byte; |
1027 | unsigned long prev_start_byte; | ||
1027 | unsigned long working_bytes = total_out - buf_start; | 1028 | unsigned long working_bytes = total_out - buf_start; |
1028 | unsigned long bytes; | 1029 | unsigned long bytes; |
1029 | char *kaddr; | 1030 | char *kaddr; |
@@ -1071,26 +1072,34 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start, | |||
1071 | if (!bio->bi_iter.bi_size) | 1072 | if (!bio->bi_iter.bi_size) |
1072 | return 0; | 1073 | return 0; |
1073 | bvec = bio_iter_iovec(bio, bio->bi_iter); | 1074 | bvec = bio_iter_iovec(bio, bio->bi_iter); |
1074 | 1075 | prev_start_byte = start_byte; | |
1075 | start_byte = page_offset(bvec.bv_page) - disk_start; | 1076 | start_byte = page_offset(bvec.bv_page) - disk_start; |
1076 | 1077 | ||
1077 | /* | 1078 | /* |
1078 | * make sure our new page is covered by this | 1079 | * We need to make sure we're only adjusting |
1079 | * working buffer | 1080 | * our offset into compression working buffer when |
1081 | * we're switching pages. Otherwise we can incorrectly | ||
1082 | * keep copying when we were actually done. | ||
1080 | */ | 1083 | */ |
1081 | if (total_out <= start_byte) | 1084 | if (start_byte != prev_start_byte) { |
1082 | return 1; | 1085 | /* |
1086 | * make sure our new page is covered by this | ||
1087 | * working buffer | ||
1088 | */ | ||
1089 | if (total_out <= start_byte) | ||
1090 | return 1; | ||
1083 | 1091 | ||
1084 | /* | 1092 | /* |
1085 | * the next page in the biovec might not be adjacent | 1093 | * the next page in the biovec might not be adjacent |
1086 | * to the last page, but it might still be found | 1094 | * to the last page, but it might still be found |
1087 | * inside this working buffer. bump our offset pointer | 1095 | * inside this working buffer. bump our offset pointer |
1088 | */ | 1096 | */ |
1089 | if (total_out > start_byte && | 1097 | if (total_out > start_byte && |
1090 | current_buf_start < start_byte) { | 1098 | current_buf_start < start_byte) { |
1091 | buf_offset = start_byte - buf_start; | 1099 | buf_offset = start_byte - buf_start; |
1092 | working_bytes = total_out - start_byte; | 1100 | working_bytes = total_out - start_byte; |
1093 | current_buf_start = buf_start + buf_offset; | 1101 | current_buf_start = buf_start + buf_offset; |
1102 | } | ||
1094 | } | 1103 | } |
1095 | } | 1104 | } |
1096 | 1105 | ||