|
@@ -155,7 +155,7 @@ xfs_growfs_data_private(
|
|
|
xfs_buf_t *bp;
|
|
|
int bucket;
|
|
|
int dpct;
|
|
|
- int error;
|
|
|
+ int error, saved_error = 0;
|
|
|
xfs_agnumber_t nagcount;
|
|
|
xfs_agnumber_t nagimax = 0;
|
|
|
xfs_rfsblock_t nb, nb_mod;
|
|
@@ -498,29 +498,33 @@ xfs_growfs_data_private(
|
|
|
error = ENOMEM;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * If we get an error reading or writing alternate superblocks,
|
|
|
+ * continue. xfs_repair chooses the "best" superblock based
|
|
|
+ * on most matches; if we break early, we'll leave more
|
|
|
+ * superblocks un-updated than updated, and xfs_repair may
|
|
|
+ * pick them over the properly-updated primary.
|
|
|
+ */
|
|
|
if (error) {
|
|
|
xfs_warn(mp,
|
|
|
"error %d reading secondary superblock for ag %d",
|
|
|
error, agno);
|
|
|
- break;
|
|
|
+ saved_error = error;
|
|
|
+ continue;
|
|
|
}
|
|
|
xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb, XFS_SB_ALL_BITS);
|
|
|
|
|
|
- /*
|
|
|
- * If we get an error writing out the alternate superblocks,
|
|
|
- * just issue a warning and continue. The real work is
|
|
|
- * already done and committed.
|
|
|
- */
|
|
|
error = xfs_bwrite(bp);
|
|
|
xfs_buf_relse(bp);
|
|
|
if (error) {
|
|
|
xfs_warn(mp,
|
|
|
"write error %d updating secondary superblock for ag %d",
|
|
|
error, agno);
|
|
|
- break; /* no point in continuing */
|
|
|
+ saved_error = error;
|
|
|
+ continue;
|
|
|
}
|
|
|
}
|
|
|
- return error;
|
|
|
+ return saved_error ? saved_error : error;
|
|
|
|
|
|
error0:
|
|
|
xfs_trans_cancel(tp, XFS_TRANS_ABORT);
|