• Q
    btrfs: scrub: try to fix super block errors · f9eab5f0
    Qu Wenruo 提交于
    [BUG]
    The following script shows that, although scrub can detect super block
    errors, it never tries to fix it:
    
    	mkfs.btrfs -f -d raid1 -m raid1 $dev1 $dev2
    	xfs_io -c "pwrite 67108864 4k" $dev2
    
    	mount $dev1 $mnt
    	btrfs scrub start -B $dev2
    	btrfs scrub start -Br $dev2
    	umount $mnt
    
    The first scrub reports the super error correctly:
    
      scrub done for f3289218-abd3-41ac-a630-202f766c0859
      Scrub started:    Tue Aug  2 14:44:11 2022
      Status:           finished
      Duration:         0:00:00
      Total to scrub:   1.26GiB
      Rate:             0.00B/s
      Error summary:    super=1
        Corrected:      0
        Uncorrectable:  0
        Unverified:     0
    
    But the second read-only scrub still reports the same super error:
    
      Scrub started:    Tue Aug  2 14:44:11 2022
      Status:           finished
      Duration:         0:00:00
      Total to scrub:   1.26GiB
      Rate:             0.00B/s
      Error summary:    super=1
        Corrected:      0
        Uncorrectable:  0
        Unverified:     0
    
    [CAUSE]
    The comments already shows that super block can be easily fixed by
    committing a transaction:
    
    	/*
    	 * If we find an error in a super block, we just report it.
    	 * They will get written with the next transaction commit
    	 * anyway
    	 */
    
    But the truth is, such assumption is not always true, and since scrub
    should try to repair every error it found (except for read-only scrub),
    we should really actively commit a transaction to fix this.
    
    [FIX]
    Just commit a transaction if we found any super block errors, after
    everything else is done.
    
    We cannot do this just after scrub_supers(), as
    btrfs_commit_transaction() will try to pause and wait for the running
    scrub, thus we can not call it with scrub_lock hold.
    Signed-off-by: NQu Wenruo <wqu@suse.com>
    Reviewed-by: NDavid Sterba <dsterba@suse.com>
    Signed-off-by: NDavid Sterba <dsterba@suse.com>
    f9eab5f0
scrub.c 120.2 KB