From: Josef Bacik <jo...@redhat.com>

If we hit a bad disk and the read doesn't work, try other mirrors in case we
have other disks with good copies.  Thanks,

Signed-off-by: Josef Bacik <jo...@redhat.com>
---
 cmds-restore.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/cmds-restore.c b/cmds-restore.c
index 1d24691..617f507 100644
--- a/cmds-restore.c
+++ b/cmds-restore.c
@@ -245,9 +245,16 @@ again:
 
        done = pread(dev_fd, inbuf+count, length, dev_bytenr);
        if (done < length) {
-               ret = -1;
-               fprintf(stderr, "Short read %d\n", errno);
-               goto out;
+               num_copies = btrfs_num_copies(&root->fs_info->mapping_tree,
+                                             bytenr, length);
+               mirror_num++;
+               if (mirror_num >= num_copies) {
+                       ret = -1;
+                       fprintf(stderr, "Exhausted mirrors trying to read\n");
+                       goto out;
+               }
+               fprintf(stderr, "Trying another mirror\n");
+               goto again;
        }
 
        count += length;
-- 
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to