xfs: Validate log space at mount time
Validate log space during log mount stage, the underlying function will drop a warning message via syslog in critical level if the log space is too small or too large. [ dchinner: For CRC enable filesystems, abort the mounting of the filesystem as mkfs should never make a log too small for the given filesystem configuration. ] [ dchinner: make a note of the fact that the log size limits in block counts are in units of filesystem blocks, not basic blocks. ] Signed-off-by: Jie Liu <jeff.liu@oracle.com> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Mark Tinguely <tinguely@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
parent
5a96a94547
commit
3e7b91cf8c
@ -240,7 +240,9 @@ typedef struct xfs_fsop_resblks {
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Minimum and maximum sizes need for growth checks
|
* Minimum and maximum sizes need for growth checks.
|
||||||
|
*
|
||||||
|
* Block counts are in units of filesystem blocks, not basic blocks.
|
||||||
*/
|
*/
|
||||||
#define XFS_MIN_AG_BLOCKS 64
|
#define XFS_MIN_AG_BLOCKS 64
|
||||||
#define XFS_MIN_LOG_BLOCKS 512ULL
|
#define XFS_MIN_LOG_BLOCKS 512ULL
|
||||||
|
@ -614,7 +614,8 @@ xfs_log_mount(
|
|||||||
xfs_daddr_t blk_offset,
|
xfs_daddr_t blk_offset,
|
||||||
int num_bblks)
|
int num_bblks)
|
||||||
{
|
{
|
||||||
int error;
|
int error = 0;
|
||||||
|
int min_logfsbs;
|
||||||
|
|
||||||
if (!(mp->m_flags & XFS_MOUNT_NORECOVERY))
|
if (!(mp->m_flags & XFS_MOUNT_NORECOVERY))
|
||||||
xfs_notice(mp, "Mounting Filesystem");
|
xfs_notice(mp, "Mounting Filesystem");
|
||||||
@ -630,6 +631,50 @@ xfs_log_mount(
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Validate the given log space and drop a critical message via syslog
|
||||||
|
* if the log size is too small that would lead to some unexpected
|
||||||
|
* situations in transaction log space reservation stage.
|
||||||
|
*
|
||||||
|
* Note: we can't just reject the mount if the validation fails. This
|
||||||
|
* would mean that people would have to downgrade their kernel just to
|
||||||
|
* remedy the situation as there is no way to grow the log (short of
|
||||||
|
* black magic surgery with xfs_db).
|
||||||
|
*
|
||||||
|
* We can, however, reject mounts for CRC format filesystems, as the
|
||||||
|
* mkfs binary being used to make the filesystem should never create a
|
||||||
|
* filesystem with a log that is too small.
|
||||||
|
*/
|
||||||
|
min_logfsbs = xfs_log_calc_minimum_size(mp);
|
||||||
|
|
||||||
|
if (mp->m_sb.sb_logblocks < min_logfsbs) {
|
||||||
|
xfs_warn(mp,
|
||||||
|
"Log size %d blocks too small, minimum size is %d blocks",
|
||||||
|
mp->m_sb.sb_logblocks, min_logfsbs);
|
||||||
|
error = EINVAL;
|
||||||
|
} else if (mp->m_sb.sb_logblocks > XFS_MAX_LOG_BLOCKS) {
|
||||||
|
xfs_warn(mp,
|
||||||
|
"Log size %d blocks too large, maximum size is %lld blocks",
|
||||||
|
mp->m_sb.sb_logblocks, XFS_MAX_LOG_BLOCKS);
|
||||||
|
error = EINVAL;
|
||||||
|
} else if (XFS_FSB_TO_B(mp, mp->m_sb.sb_logblocks) > XFS_MAX_LOG_BYTES) {
|
||||||
|
xfs_warn(mp,
|
||||||
|
"log size %lld bytes too large, maximum size is %lld bytes",
|
||||||
|
XFS_FSB_TO_B(mp, mp->m_sb.sb_logblocks),
|
||||||
|
XFS_MAX_LOG_BYTES);
|
||||||
|
error = EINVAL;
|
||||||
|
}
|
||||||
|
if (error) {
|
||||||
|
if (xfs_sb_version_hascrc(&mp->m_sb)) {
|
||||||
|
xfs_crit(mp, "AAIEEE! Log failed size checks. Abort!");
|
||||||
|
ASSERT(0);
|
||||||
|
goto out_free_log;
|
||||||
|
}
|
||||||
|
xfs_crit(mp,
|
||||||
|
"Log size out of supported range. Continuing onwards, but if log hangs are\n"
|
||||||
|
"experienced then please report this message in the bug report.");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the AIL now we have a log.
|
* Initialize the AIL now we have a log.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user