|
@@ -5404,8 +5404,12 @@ void read_extent_buffer(const struct extent_buffer *eb, void *dstv,
|
|
|
size_t start_offset = eb->start & ((u64)PAGE_SIZE - 1);
|
|
|
unsigned long i = (start_offset + start) >> PAGE_SHIFT;
|
|
|
|
|
|
- WARN_ON(start > eb->len);
|
|
|
- WARN_ON(start + len > eb->start + eb->len);
|
|
|
+ if (start + len > eb->len) {
|
|
|
+ WARN(1, KERN_ERR "btrfs bad mapping eb start %llu len %lu, wanted %lu %lu\n",
|
|
|
+ eb->start, eb->len, start, len);
|
|
|
+ memset(dst, 0, len);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
offset = (start_offset + start) & (PAGE_SIZE - 1);
|
|
|
|
|
@@ -5478,6 +5482,12 @@ int map_private_extent_buffer(const struct extent_buffer *eb,
|
|
|
unsigned long end_i = (start_offset + start + min_len - 1) >>
|
|
|
PAGE_SHIFT;
|
|
|
|
|
|
+ if (start + min_len > eb->len) {
|
|
|
+ WARN(1, KERN_ERR "btrfs bad mapping eb start %llu len %lu, wanted %lu %lu\n",
|
|
|
+ eb->start, eb->len, start, min_len);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
if (i != end_i)
|
|
|
return 1;
|
|
|
|
|
@@ -5489,12 +5499,6 @@ int map_private_extent_buffer(const struct extent_buffer *eb,
|
|
|
*map_start = ((u64)i << PAGE_SHIFT) - start_offset;
|
|
|
}
|
|
|
|
|
|
- if (start + min_len > eb->len) {
|
|
|
- WARN(1, KERN_ERR "btrfs bad mapping eb start %llu len %lu, wanted %lu %lu\n",
|
|
|
- eb->start, eb->len, start, min_len);
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
p = eb->pages[i];
|
|
|
kaddr = page_address(p);
|
|
|
*map = kaddr + offset;
|