Skip to contentSkip to conversation

allow mkfs to make larger logs

PATCH In review David Chinner 3 participants 4 messages May 22, 2008 – May 10, 2009

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 allow mkfs 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.

---
 xfsprogs/include/xfs_fs.h |   11 +++++++----
 xfsprogs/mkfs/xfs_mkfs.c  |   14 +++++++-------
 2 files changed, 14 insertions(+), 11 deletions(-)
xfsprogs/include/xfs_fs.h +7 -4
Index: xfs-cmds/xfsprogs/include/xfs_fs.h
===================================================================
@@ -248,10 +248,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
xfsprogs/mkfs/xfs_mkfs.c +7 -7
Index: xfs-cmds/xfsprogs/mkfs/xfs_mkfs.c
===================================================================
@@ -362,13 +362,13 @@ validate_log_size(__uint64_t 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();
 	}
@@ -1724,7 +1724,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"),
@@ -1744,10 +1744,10 @@ _("size %s specified for log subvolume i
 		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;
#1 lore raw
Quoted 8 lines · David Chinner

===================================================================

xfsprogs/include/xfs_fs.h +0 -1
@@ -248,10 +248,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

xfsprogs/include/xfs_fs.h typedef struct xfs_fsop_resblks { · line 257

Quoted 10 lines
xfsprogs/include/xfs_fs.h +7 -3
-#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)

This file is a copy for the kernel, so please update it there aswell, once we get changes to these files in both xfs-cmds and the kernel tree merging will become a complete nightmare.

Except for that the patch looks good to me.

#3 lore raw
In reply to David Chinner

ping?

Quoted 88 lines · David Chinner

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.

---
 xfsprogs/include/xfs_fs.h |   11 +++++++----
 xfsprogs/mkfs/xfs_mkfs.c  |   14 +++++++-------
 2 files changed, 14 insertions(+), 11 deletions(-)

Index: xfs-cmds/xfsprogs/include/xfs_fs.h
===================================================================

xfsprogs/include/xfs_fs.h +7 -4
@@ -248,10 +248,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: xfs-cmds/xfsprogs/mkfs/xfs_mkfs.c
===================================================================

xfsprogs/mkfs/xfs_mkfs.c +7 -7
@@ -362,13 +362,13 @@ validate_log_size(__uint64_t 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();
 	}
@@ -1724,7 +1724,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"),
@@ -1744,10 +1744,10 @@ _("size %s specified for log subvolume i
 		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;
Signature · 2 lines
Dave Chinner
[email protected]