From d2334781fde887ed4e541c6794970ae942f81f23 Mon Sep 17 00:00:00 2001 From: Filipe David Borba Manana Date: Tue, 8 Apr 2014 17:37:22 +0100 Subject: Btrfs-progs: restore, for compressed extents don't read more bytes than needed We need to read a number of bytes corresponding to the disk size of the file extent item, and not to the number of bytes in the num_bytes field. Normally disk_size is smaller than num_bytes (when using compression), except for files created with lzo compression in a kernel older then the one which introduced the following change: commit 59516f6017c589e7316418fda6128ba8f829a77f Author: Stefan Agner Date: Mon Jul 1 20:33:39 2013 +0200 Btrfs: return -1 when lzo compression makes data bigger With this fix the lzo code behaves like the zlib code by returning an error code when compression does not help reduce the size of the file. This is currently not a bug since the compressed size is checked again in the calling method compress_file_range. Signed-off-by: Filipe David Borba Manana Signed-off-by: David Sterba --- cmds-restore.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'cmds-restore.c') diff --git a/cmds-restore.c b/cmds-restore.c index 07a0e634..2ecbc94d 100644 --- a/cmds-restore.c +++ b/cmds-restore.c @@ -297,7 +297,7 @@ static int copy_one_extent(struct btrfs_root *root, int fd, ram_size = btrfs_file_extent_ram_bytes(leaf, fi); offset = btrfs_file_extent_offset(leaf, fi); num_bytes = btrfs_file_extent_num_bytes(leaf, fi); - size_left = num_bytes; + size_left = disk_size; if (compress == BTRFS_COMPRESS_NONE) bytenr += offset; @@ -376,7 +376,7 @@ again: goto out; } - ret = decompress(inbuf, outbuf, num_bytes, &ram_size, compress); + ret = decompress(inbuf, outbuf, disk_size, &ram_size, compress); if (ret) { num_copies = btrfs_num_copies(&root->fs_info->mapping_tree, bytenr, length); -- cgit v1.2.3