|
@@ -6709,6 +6709,20 @@ static noinline int uncompress_inline(struct btrfs_path *path,
|
|
max_size = min_t(unsigned long, PAGE_SIZE, max_size);
|
|
max_size = min_t(unsigned long, PAGE_SIZE, max_size);
|
|
ret = btrfs_decompress(compress_type, tmp, page,
|
|
ret = btrfs_decompress(compress_type, tmp, page,
|
|
extent_offset, inline_size, max_size);
|
|
extent_offset, inline_size, max_size);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * decompression code contains a memset to fill in any space between the end
|
|
|
|
+ * of the uncompressed data and the end of max_size in case the decompressed
|
|
|
|
+ * data ends up shorter than ram_bytes. That doesn't cover the hole between
|
|
|
|
+ * the end of an inline extent and the beginning of the next block, so we
|
|
|
|
+ * cover that region here.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ if (max_size + pg_offset < PAGE_SIZE) {
|
|
|
|
+ char *map = kmap(page);
|
|
|
|
+ memset(map + pg_offset + max_size, 0, PAGE_SIZE - max_size - pg_offset);
|
|
|
|
+ kunmap(page);
|
|
|
|
+ }
|
|
kfree(tmp);
|
|
kfree(tmp);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|