mirror of
https://github.com/kdave/btrfs-progs
synced 2025-04-11 03:31:17 +00:00
Btrfs-progs: fix restore of files with compressed extents
The code was incorrectly adding the file extent items' data offset to the logical disk address of the extent (bytenr) when the extent is compressed. The offset is relative to the uncompressed data and not to what we store on disk (compressed). Also it attempted to copy ram_bytes to destination, which is incorrect when the data offset field is non-zero, it must use num_bytes instead. A test case for xfstests follows. Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com> Signed-off-by: David Sterba <dsterba@suse.cz> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
fbf186bf87
commit
4314116bae
@ -298,7 +298,8 @@ static int copy_one_extent(struct btrfs_root *root, int fd,
|
||||
offset = btrfs_file_extent_offset(leaf, fi);
|
||||
num_bytes = btrfs_file_extent_num_bytes(leaf, fi);
|
||||
size_left = num_bytes;
|
||||
bytenr += offset;
|
||||
if (compress == BTRFS_COMPRESS_NONE)
|
||||
bytenr += offset;
|
||||
|
||||
if (offset)
|
||||
printf("offset is %Lu\n", offset);
|
||||
@ -388,8 +389,10 @@ again:
|
||||
goto again;
|
||||
}
|
||||
|
||||
while (total < ram_size) {
|
||||
done = pwrite(fd, outbuf+total, ram_size-total, pos+total);
|
||||
while (total < num_bytes) {
|
||||
done = pwrite(fd, outbuf + offset + total,
|
||||
num_bytes - total,
|
||||
pos + total);
|
||||
if (done < 0) {
|
||||
ret = -1;
|
||||
goto out;
|
||||
|
Loading…
Reference in New Issue
Block a user