diff options
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 14 | 
1 files changed, 14 insertions, 0 deletions
| diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c40060cc481f..231503935652 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -6709,6 +6709,20 @@ static noinline int uncompress_inline(struct btrfs_path *path,  	max_size = min_t(unsigned long, PAGE_SIZE, max_size);  	ret = btrfs_decompress(compress_type, tmp, page,  			       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);  	return ret;  } |