|
@@ -614,7 +614,8 @@ xfs_log_mount(
|
|
|
xfs_daddr_t blk_offset,
|
|
|
int num_bblks)
|
|
|
{
|
|
|
- int error;
|
|
|
+ int error = 0;
|
|
|
+ int min_logfsbs;
|
|
|
|
|
|
if (!(mp->m_flags & XFS_MOUNT_NORECOVERY))
|
|
|
xfs_notice(mp, "Mounting Filesystem");
|
|
@@ -630,6 +631,50 @@ xfs_log_mount(
|
|
|
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.
|
|
|
*/
|