From: David Chinner Date: Sun, 10 May 2009 19:31:22 +0000 (+0200) Subject: mkfs: allow to make larger logs X-Git-Tag: v3.0.3~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a6634fba3dec4a92f0a2c4e30c80b634c0576ad5;p=thirdparty%2Fxfsprogs-dev.git mkfs: allow to make larger logs Increase the maximum log size supported by mkfs. The log size can be increased easily in mkfs by changing a few defines and a couple of types to allow the log size to increase to just under 2GB. Theoretically, the log size can be made much, much larger than this (up to 2^32 sectors), but going beyond 2^31 *bytes* causes integer overflow issues in the kernel log code. We use a maximum size of just under 2GB as exactly 2GB will cause overflow issues on the first transaction reservation. Maximum log size is now reached at a fs size of ~4TB. Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig --- diff --git a/include/xfs_fs.h b/include/xfs_fs.h index 01c0cc88d..9aff7bb46 100644 --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -247,10 +247,13 @@ typedef struct xfs_fsop_resblks { * Minimum and maximum sizes need for growth checks */ #define XFS_MIN_AG_BLOCKS 64 -#define XFS_MIN_LOG_BLOCKS 512 -#define XFS_MAX_LOG_BLOCKS (64 * 1024) -#define XFS_MIN_LOG_BYTES (256 * 1024) -#define XFS_MAX_LOG_BYTES (128 * 1024 * 1024) +#define XFS_MIN_LOG_BLOCKS 512ULL +#define XFS_MAX_LOG_BLOCKS (1024 * 1024ULL) +#define XFS_MIN_LOG_BYTES (10 * 1024 * 1024ULL) + +/* keep the maximum size under 2^31 by a small amount */ +#define XFS_MAX_LOG_BYTES \ + ((2 * 1024 * 1024 * 1024ULL) - XFS_MIN_LOG_BYTES) /* * Structures for XFS_IOC_FSGROWFSDATA, XFS_IOC_FSGROWFSLOG & XFS_IOC_FSGROWFSRT diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index c7f7e78ae..69d91c505 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -362,13 +362,13 @@ validate_log_size(__uint64_t logblocks, int blocklog, int min_logblocks) } if (logblocks > XFS_MAX_LOG_BLOCKS) { fprintf(stderr, - _("log size %lld blocks too large, maximum size is %d blocks\n"), + _("log size %lld blocks too large, maximum size is %lld blocks\n"), (long long)logblocks, XFS_MAX_LOG_BLOCKS); usage(); } if ((logblocks << blocklog) > XFS_MAX_LOG_BYTES) { fprintf(stderr, - _("log size %lld bytes too large, maximum size is %d bytes\n"), + _("log size %lld bytes too large, maximum size is %lld bytes\n"), (long long)(logblocks << blocklog), XFS_MAX_LOG_BYTES); usage(); } @@ -1717,7 +1717,7 @@ reported by the device (%u).\n"), min_logblocks = max_tr_res * XFS_MIN_LOG_FACTOR; min_logblocks = MAX(XFS_MIN_LOG_BLOCKS, min_logblocks); if (!logsize && dblocks >= (1024*1024*1024) >> blocklog) - min_logblocks = MAX(min_logblocks, (10*1024*1024)>>blocklog); + min_logblocks = MAX(min_logblocks, XFS_MIN_LOG_BYTES>>blocklog); if (logsize && xi.logBBsize > 0 && logblocks > DTOBT(xi.logBBsize)) { fprintf(stderr, _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), @@ -1737,10 +1737,10 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), logblocks = 0; } else if (loginternal && !logsize) { /* - * logblocks grows from min_logblocks to XFS_MAX_LOG_BLOCKS - * at 128GB - * - * 2048 = 128GB / MAX_LOG_BYTES + * With a 2GB max log size, default to maximum size + * at 4TB. This keeps the same ratio from the older + * max log size of 128M at 256GB fs size. IOWs, + * the ratio of fs size to log size is 2048:1. */ logblocks = (dblocks << blocklog) / 2048; logblocks = logblocks >> blocklog;