Btrfs-progs: try other mirrors on read failure
authorJosef Bacik <josef@redhat.com>
Tue, 12 Mar 2013 17:38:10 +0000 (13:38 -0400)
committerDavid Sterba <dsterba@suse.cz>
Mon, 18 Mar 2013 17:14:18 +0000 (18:14 +0100)
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 <josef@redhat.com>
cmds-restore.c

index 1d24691..617f507 100644 (file)
@@ -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;