On 2017年12月05日 16:39, Nikolay Borisov wrote: > Commit 3296d058b7ce ("btrfs-progs: super-recover: Reuse > btrfs_read_dev_super function") Oh my fault. > changed the logic when a superblock > is added to the bad block list to depend on -EIO. However currently > btrfs_read_dev_super doesn't return -EIO when the fist super block > is broken. Instead it returns -1. This causes the super-recovery > logic to miss the fact that the first super block is completely broken. > > Fix this by considering any error code from btrfs_read_dev_super other > than -ENOENT to mean that the super block is corrupted. -ENOENT > means that the superblock copy is not part of the fs i.e. it's smaller > than the offset of the block. This can only occur for the 2nd copy at > 256gb mark. > > Signed-off-by: Nikolay Borisov Reviewed-by: Qu Wenruo Thanks, Qu > --- > super-recover.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/super-recover.c b/super-recover.c > index e12513100f17..880fd7712546 100644 > --- a/super-recover.c > +++ b/super-recover.c > @@ -136,7 +136,7 @@ read_dev_supers(char *filename, struct btrfs_recover_superblock *recover) > max_gen = btrfs_super_generation(sb); > if (max_gen > recover->max_generation) > recover->max_generation = max_gen; > - } else if (ret == -EIO){ > + } else if (ret != -ENOENT){ > /* > * Skip superblock which doesn't exist, only adds > * really corrupted superblock >