In super-recover.c, around line 96, check_super calls btrfs_super_csum_size, which then dies because the size was too big. I have solved this by reimplementing that stub inside super-recover.c with error handling rather than crashing:

diff --git a/super-recover.c b/super-recover.c
index adb2c44..2508e06 100644
--- a/super-recover.c
+++ b/super-recover.c
@@ -93,7 +93,11 @@ void free_recover_superblock(struct btrfs_recover_superblock *recover)

 static int check_super(u64 bytenr, struct btrfs_super_block *sb)
-       int csum_size = btrfs_super_csum_size(sb);
+       int t = btrfs_super_csum_type(sb);
+       if(t >= ARRAY_SIZE(btrfs_csum_sizes))
+               return 0;
+       int csum_size = btrfs_csum_sizes[t];
        char result[csum_size];
        u32 crc = ~(u32)0;

(Sorry for bad formatting)
This allowed me to recover my superblocks

I found this bug kind of ironic because a routine made to discover bad data, crashed because it encountered bad data :D

- hawken
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