dc3edf7a66
Automatic submission by obs-autosubmit OBS-URL: https://build.opensuse.org/request/show/106239 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/btrfsprogs?expand=0&rev=25
135 lines
3.3 KiB
Diff
135 lines
3.3 KiB
Diff
From 9dee07a6365d2facddea9a501737dce92333c582 Mon Sep 17 00:00:00 2001
|
|
From: Josef Bacik <josef@redhat.com>
|
|
Date: Fri, 4 Nov 2011 09:10:49 -0400
|
|
Subject: [PATCH 18/35] Btrfs-progs: try other mirrors if decomression fails
|
|
|
|
This will make the restore program fall back on other mirrors if it fails to
|
|
decompress an extent for whatever reason. Thanks,
|
|
|
|
Signed-off-by: Josef Bacik <josef@redhat.com>
|
|
---
|
|
restore.c | 47 +++++++++++++++++++++++++----------------------
|
|
1 files changed, 25 insertions(+), 22 deletions(-)
|
|
|
|
diff --git a/restore.c b/restore.c
|
|
index 38c4ded..f062a2b 100644
|
|
--- a/restore.c
|
|
+++ b/restore.c
|
|
@@ -61,7 +61,7 @@ static int decompress(char *inbuf, char *outbuf, u64 compress_len,
|
|
ret = inflate(&strm, Z_NO_FLUSH);
|
|
if (ret != Z_STREAM_END) {
|
|
(void)inflateEnd(&strm);
|
|
- fprintf(stderr, "ret is %d\n", ret);
|
|
+ fprintf(stderr, "failed to inflate: %d\n", ret);
|
|
return -1;
|
|
}
|
|
|
|
@@ -197,6 +197,8 @@ static int copy_one_extent(struct btrfs_root *root, int fd,
|
|
int compress;
|
|
int ret;
|
|
int dev_fd;
|
|
+ int mirror_num = 0;
|
|
+ int num_copies;
|
|
|
|
compress = btrfs_file_extent_compression(leaf, fi);
|
|
bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
|
|
@@ -225,12 +227,10 @@ static int copy_one_extent(struct btrfs_root *root, int fd,
|
|
again:
|
|
length = size_left;
|
|
ret = btrfs_map_block(&root->fs_info->mapping_tree, READ,
|
|
- bytenr, &length, &multi, 0);
|
|
+ bytenr, &length, &multi, mirror_num);
|
|
if (ret) {
|
|
- free(inbuf);
|
|
- free(outbuf);
|
|
fprintf(stderr, "Error mapping block %d\n", ret);
|
|
- return ret;
|
|
+ goto out;
|
|
}
|
|
device = multi->stripes[0].dev;
|
|
dev_fd = device->fd;
|
|
@@ -244,10 +244,9 @@ again:
|
|
|
|
done = pread(dev_fd, inbuf+count, length, dev_bytenr);
|
|
if (done < length) {
|
|
- free(inbuf);
|
|
- free(outbuf);
|
|
+ ret = -1;
|
|
fprintf(stderr, "Short read %d\n", errno);
|
|
- return -1;
|
|
+ goto out;
|
|
}
|
|
|
|
count += length;
|
|
@@ -255,41 +254,46 @@ again:
|
|
if (size_left)
|
|
goto again;
|
|
|
|
-
|
|
if (compress == BTRFS_COMPRESS_NONE) {
|
|
while (total < ram_size) {
|
|
done = pwrite(fd, inbuf+total, ram_size-total,
|
|
pos+total);
|
|
if (done < 0) {
|
|
- free(inbuf);
|
|
+ ret = -1;
|
|
fprintf(stderr, "Error writing: %d %s\n", errno, strerror(errno));
|
|
- return -1;
|
|
+ goto out;
|
|
}
|
|
total += done;
|
|
}
|
|
- free(inbuf);
|
|
- return 0;
|
|
+ ret = 0;
|
|
+ goto out;
|
|
}
|
|
|
|
ret = decompress(inbuf, outbuf, disk_size, ram_size);
|
|
- free(inbuf);
|
|
if (ret) {
|
|
- free(outbuf);
|
|
- return ret;
|
|
+ num_copies = btrfs_num_copies(&root->fs_info->mapping_tree,
|
|
+ bytenr, length);
|
|
+ mirror_num++;
|
|
+ if (mirror_num >= num_copies) {
|
|
+ ret = -1;
|
|
+ goto out;
|
|
+ }
|
|
+ fprintf(stderr, "Trying another mirror\n");
|
|
+ goto again;
|
|
}
|
|
|
|
while (total < ram_size) {
|
|
done = pwrite(fd, outbuf+total, ram_size-total, pos+total);
|
|
if (done < 0) {
|
|
- free(outbuf);
|
|
- fprintf(stderr, "Error writing: %d %s\n", errno, strerror(errno));
|
|
- return -1;
|
|
+ ret = -1;
|
|
+ goto out;
|
|
}
|
|
total += done;
|
|
}
|
|
+out:
|
|
+ free(inbuf);
|
|
free(outbuf);
|
|
-
|
|
- return 0;
|
|
+ return ret;
|
|
}
|
|
|
|
static int ask_to_continue(const char *file)
|
|
@@ -385,7 +389,6 @@ static int copy_file(struct btrfs_root *root, int fd, struct btrfs_key *key,
|
|
/* No more leaves to search */
|
|
btrfs_free_path(path);
|
|
goto set_size;
|
|
- return 0;
|
|
}
|
|
leaf = path->nodes[0];
|
|
} while (!leaf);
|
|
--
|
|
1.7.6.233.gd79bc
|
|
|