diff options
Diffstat (limited to 'fs/xfs/xfs_mount.c')
| -rw-r--r-- | fs/xfs/xfs_mount.c | 39 | 
1 files changed, 16 insertions, 23 deletions
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index fbca293326e..912101d280b 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -980,42 +980,35 @@ xfs_check_sizes(xfs_mount_t *mp)  {  	xfs_buf_t	*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) { -		cmn_err(CE_WARN, "XFS: size check 1 failed"); +		cmn_err(CE_WARN, "XFS: filesystem size mismatch detected");  		return XFS_ERROR(EFBIG);  	} -	error = xfs_read_buf(mp, mp->m_ddev_targp, -			     d - XFS_FSS_TO_BB(mp, 1), -			     XFS_FSS_TO_BB(mp, 1), 0, &bp); -	if (!error) { -		xfs_buf_relse(bp); -	} else { -		cmn_err(CE_WARN, "XFS: size check 2 failed"); -		if (error == ENOSPC) -			error = XFS_ERROR(EFBIG); -		return error; +	bp = xfs_buf_read_uncached(mp, mp->m_ddev_targp, +					d - XFS_FSS_TO_BB(mp, 1), +					BBTOB(XFS_FSS_TO_BB(mp, 1)), 0); +	if (!bp) { +		cmn_err(CE_WARN, "XFS: last sector read failed"); +		return EIO;  	} +	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) { -			cmn_err(CE_WARN, "XFS: size check 3 failed"); +			cmn_err(CE_WARN, "XFS: log size mismatch detected");  			return XFS_ERROR(EFBIG);  		} -		error = xfs_read_buf(mp, mp->m_logdev_targp, -				     d - XFS_FSB_TO_BB(mp, 1), -				     XFS_FSB_TO_BB(mp, 1), 0, &bp); -		if (!error) { -			xfs_buf_relse(bp); -		} else { -			cmn_err(CE_WARN, "XFS: size check 3 failed"); -			if (error == ENOSPC) -				error = XFS_ERROR(EFBIG); -			return error; +		bp = xfs_buf_read_uncached(mp, mp->m_logdev_targp, +					d - XFS_FSB_TO_BB(mp, 1), +					XFS_FSB_TO_B(mp, 1), 0); +		if (!bp) { +			cmn_err(CE_WARN, "XFS: log device read failed"); +			return EIO;  		} +		xfs_buf_relse(bp);  	}  	return 0;  }  |