|
@@ -302,21 +302,15 @@ xfs_readsb(
|
|
|
* access to the superblock.
|
|
|
*/
|
|
|
reread:
|
|
|
- bp = xfs_buf_read_uncached(mp->m_ddev_targp, XFS_SB_DADDR,
|
|
|
- BTOBB(sector_size), 0, buf_ops);
|
|
|
- if (!bp) {
|
|
|
- if (loud)
|
|
|
- xfs_warn(mp, "SB buffer read failed");
|
|
|
- return -EIO;
|
|
|
- }
|
|
|
- if (bp->b_error) {
|
|
|
- error = bp->b_error;
|
|
|
+ error = xfs_buf_read_uncached(mp->m_ddev_targp, XFS_SB_DADDR,
|
|
|
+ BTOBB(sector_size), 0, &bp, buf_ops);
|
|
|
+ if (error) {
|
|
|
if (loud)
|
|
|
xfs_warn(mp, "SB validate failed with error %d.", error);
|
|
|
/* bad CRC means corrupted metadata */
|
|
|
if (error == -EFSBADCRC)
|
|
|
error = -EFSCORRUPTED;
|
|
|
- goto release_buf;
|
|
|
+ return error;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -546,40 +540,43 @@ xfs_set_inoalignment(xfs_mount_t *mp)
|
|
|
* Check that the data (and log if separate) is an ok size.
|
|
|
*/
|
|
|
STATIC int
|
|
|
-xfs_check_sizes(xfs_mount_t *mp)
|
|
|
+xfs_check_sizes(
|
|
|
+ struct xfs_mount *mp)
|
|
|
{
|
|
|
- xfs_buf_t *bp;
|
|
|
+ struct xfs_buf *bp;
|
|
|
xfs_daddr_t d;
|
|
|
+ int error;
|
|
|
|
|
|
d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks);
|
|
|
if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_dblocks) {
|
|
|
xfs_warn(mp, "filesystem size mismatch detected");
|
|
|
return -EFBIG;
|
|
|
}
|
|
|
- bp = xfs_buf_read_uncached(mp->m_ddev_targp,
|
|
|
+ error = xfs_buf_read_uncached(mp->m_ddev_targp,
|
|
|
d - XFS_FSS_TO_BB(mp, 1),
|
|
|
- XFS_FSS_TO_BB(mp, 1), 0, NULL);
|
|
|
- if (!bp) {
|
|
|
+ XFS_FSS_TO_BB(mp, 1), 0, &bp, NULL);
|
|
|
+ if (error) {
|
|
|
xfs_warn(mp, "last sector read failed");
|
|
|
- return -EIO;
|
|
|
+ return error;
|
|
|
}
|
|
|
xfs_buf_relse(bp);
|
|
|
|
|
|
- if (mp->m_logdev_targp != mp->m_ddev_targp) {
|
|
|
- d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks);
|
|
|
- if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_logblocks) {
|
|
|
- xfs_warn(mp, "log size mismatch detected");
|
|
|
- return -EFBIG;
|
|
|
- }
|
|
|
- bp = xfs_buf_read_uncached(mp->m_logdev_targp,
|
|
|
+ if (mp->m_logdev_targp == mp->m_ddev_targp)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks);
|
|
|
+ if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_logblocks) {
|
|
|
+ xfs_warn(mp, "log size mismatch detected");
|
|
|
+ return -EFBIG;
|
|
|
+ }
|
|
|
+ error = xfs_buf_read_uncached(mp->m_logdev_targp,
|
|
|
d - XFS_FSB_TO_BB(mp, 1),
|
|
|
- XFS_FSB_TO_BB(mp, 1), 0, NULL);
|
|
|
- if (!bp) {
|
|
|
- xfs_warn(mp, "log device read failed");
|
|
|
- return -EIO;
|
|
|
- }
|
|
|
- xfs_buf_relse(bp);
|
|
|
+ XFS_FSB_TO_BB(mp, 1), 0, &bp, NULL);
|
|
|
+ if (error) {
|
|
|
+ xfs_warn(mp, "log device read failed");
|
|
|
+ return error;
|
|
|
}
|
|
|
+ xfs_buf_relse(bp);
|
|
|
return 0;
|
|
|
}
|
|
|
|