]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
mkfs: allow to make larger logs
authorDavid Chinner <dgc@sgi.com>
Sun, 10 May 2009 19:31:22 +0000 (21:31 +0200)
committerChristoph Hellwig <hch@brick.lst.de>
Sun, 10 May 2009 19:31:22 +0000 (21:31 +0200)
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 <dgc@sgi.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
include/xfs_fs.h
mkfs/xfs_mkfs.c

index 01c0cc88d3f37055bc071dc545ca731509361bc6..9aff7bb46574fa0b405db99793694b786cc96b24 100644 (file)
@@ -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
index c7f7e78ae9340c257395586dcfea82c114378e86..69d91c505f333c7ad573e93a6f9d08216161f183 100644 (file)
@@ -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;