• Eric Sandeen's avatar
    xfs: don't break from growfs ag update loop on error · 59e5a0e8
    Eric Sandeen authored
    When xfs_growfs_data_private() is updating backup superblocks,
    it bails out on the first error encountered, whether reading or
    writing:
    
    * If we get an error writing out the alternate superblocks,
    * just issue a warning and continue.  The real work is
    * already done and committed.
    
    This can cause a problem later during repair, because repair
    looks at all superblocks, and picks the most prevalent one
    as correct.  If we bail out early in the backup superblock
    loop, we can end up with more "bad" matching superblocks than
    good, and a post-growfs repair may revert the filesystem to
    the old geometry.
    
    With the combination of superblock verifiers and old bugs,
    we're more likely to encounter read errors due to verification.
    
    And perhaps even worse, we don't even properly write any of the
    newly-added superblocks in the new AGs.
    
    Even with this change, growfs will still say:
    
      xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Structure needs cleaning
      data blocks changed from 319815680 to 335216640
    
    which might be confusing to the user, but it at least communicates
    that something has gone wrong, and dmesg will probably highlight
    the need for an xfs_repair.
    
    And this is still best-effort; if verifiers fail on more than
    half the backup supers, they may still "win" - but that's probably
    best left to repair to more gracefully handle by doing its own
    strict verification as part of the backup super "voting."
    Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
    Acked-by: default avatarDave Chinner <david@fromorbit.com>
    Reviewed-by: Mark Tinguely <tinguely@sgi.com> 
    Signed-off-by: default avatarBen Myers <bpm@sgi.com>
    59e5a0e8
xfs_fsops.c 22.5 KB