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 <nbori...@suse.com>

Reviewed-by: Qu Wenruo <w...@suse.com>

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
> 

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to