All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Btrfs-progs: fix restore of files with compressed extents
@ 2014-02-25 18:25 Filipe David Borba Manana
  0 siblings, 0 replies; only message in thread
From: Filipe David Borba Manana @ 2014-02-25 18:25 UTC (permalink / raw)
  To: linux-btrfs; +Cc: Filipe David Borba Manana

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>
---
 cmds-restore.c |    9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/cmds-restore.c b/cmds-restore.c
index 1748262..e620ee7 100644
--- a/cmds-restore.c
+++ b/cmds-restore.c
@@ -297,7 +297,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);
@@ -387,8 +388,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;
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2014-02-25 18:25 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-25 18:25 [PATCH] Btrfs-progs: fix restore of files with compressed extents Filipe David Borba Manana

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.