aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_mount.c
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2010-09-21 20:47:20 -0400
committerAlex Elder <aelder@sgi.com>2010-10-18 16:07:50 -0400
commit1922c949c59f93beb560d59874bcc6d5c00115ac (patch)
treef680f7cc4a36f9233f2c54c473a69a658ea9e224 /fs/xfs/xfs_mount.c
parent26af655233dd486659235f3049959d2f7dafc5a1 (diff)
xfs: use unhashed buffers for size checks
When we are checking we can access the last block of each device, we do not need to use cached buffers as they will be tossed away immediately. Use uncached buffers for size checks so that all IO prior to full in-memory structure initialisation does not use the buffer cache. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Alex Elder <aelder@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_mount.c')
-rw-r--r--fs/xfs/xfs_mount.c39
1 files changed, 16 insertions, 23 deletions
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
index fbca293326e5..912101d280bf 100644
--- a/fs/xfs/xfs_mount.c
+++ b/fs/xfs/xfs_mount.c
@@ -980,42 +980,35 @@ xfs_check_sizes(xfs_mount_t *mp)
980{ 980{
981 xfs_buf_t *bp; 981 xfs_buf_t *bp;
982 xfs_daddr_t d; 982 xfs_daddr_t d;
983 int error;
984 983
985 d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks); 984 d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks);
986 if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_dblocks) { 985 if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_dblocks) {
987 cmn_err(CE_WARN, "XFS: size check 1 failed"); 986 cmn_err(CE_WARN, "XFS: filesystem size mismatch detected");
988 return XFS_ERROR(EFBIG); 987 return XFS_ERROR(EFBIG);
989 } 988 }
990 error = xfs_read_buf(mp, mp->m_ddev_targp, 989 bp = xfs_buf_read_uncached(mp, mp->m_ddev_targp,
991 d - XFS_FSS_TO_BB(mp, 1), 990 d - XFS_FSS_TO_BB(mp, 1),
992 XFS_FSS_TO_BB(mp, 1), 0, &bp); 991 BBTOB(XFS_FSS_TO_BB(mp, 1)), 0);
993 if (!error) { 992 if (!bp) {
994 xfs_buf_relse(bp); 993 cmn_err(CE_WARN, "XFS: last sector read failed");
995 } else { 994 return EIO;
996 cmn_err(CE_WARN, "XFS: size check 2 failed");
997 if (error == ENOSPC)
998 error = XFS_ERROR(EFBIG);
999 return error;
1000 } 995 }
996 xfs_buf_relse(bp);
1001 997
1002 if (mp->m_logdev_targp != mp->m_ddev_targp) { 998 if (mp->m_logdev_targp != mp->m_ddev_targp) {
1003 d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); 999 d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks);
1004 if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_logblocks) { 1000 if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_logblocks) {
1005 cmn_err(CE_WARN, "XFS: size check 3 failed"); 1001 cmn_err(CE_WARN, "XFS: log size mismatch detected");
1006 return XFS_ERROR(EFBIG); 1002 return XFS_ERROR(EFBIG);
1007 } 1003 }
1008 error = xfs_read_buf(mp, mp->m_logdev_targp, 1004 bp = xfs_buf_read_uncached(mp, mp->m_logdev_targp,
1009 d - XFS_FSB_TO_BB(mp, 1), 1005 d - XFS_FSB_TO_BB(mp, 1),
1010 XFS_FSB_TO_BB(mp, 1), 0, &bp); 1006 XFS_FSB_TO_B(mp, 1), 0);
1011 if (!error) { 1007 if (!bp) {
1012 xfs_buf_relse(bp); 1008 cmn_err(CE_WARN, "XFS: log device read failed");
1013 } else { 1009 return EIO;
1014 cmn_err(CE_WARN, "XFS: size check 3 failed");
1015 if (error == ENOSPC)
1016 error = XFS_ERROR(EFBIG);
1017 return error;
1018 } 1010 }
1011 xfs_buf_relse(bp);
1019 } 1012 }
1020 return 0; 1013 return 0;
1021} 1014}