allow mkfs to make larger logs
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
@@ -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
@@ -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;
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.
I've put this into xfsprogs-dev now.
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
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.
Signed-off-by Dave Chinner <[email protected]>--- 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]