On 2/27/14, 3:45 AM, Dave Chinner wrote: > From: Dave Chinner <dchinner@xxxxxxxxxx> > > Recent changes to the log size scaling have resulted in using the > default size multiplier for the log size even on small filesystems. > Commit 88cd79b ("xfs: Add xfs_log_rlimit.c") changed the calculation > of the maximum transaction size that the kernel would issues and > that significantly increased the minimum size of the default log. > As such the size of the log on small filesystems was typically > larger than the prefious default, even though the previous default > was still larger than the minimum needed. > > Rework the default log size calculation such that it will use the > original log size default if it is larger than the minimum log size > required, and only use a larger log if the configuration of the > filesystem requires it. > > This is especially obvious in xfs/216, where the default log size is > 10MB all the way up to 16GB filesystems. The current mkfs selects a > log size of 50MB for the same size filesystems and this is > unnecessarily large. > > Return the scaling of the log size for small filesystems to > something similar to what xfs/216 expects. > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> Looks good. Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> > --- > mkfs/xfs_mkfs.c | 48 ++++++++++++++++++++++++++++-------------------- > 1 file changed, 28 insertions(+), 20 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index d82128c..f7cf394 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -2366,32 +2366,40 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), > } else if (!loginternal && !xi.logdev) { > logblocks = 0; > } else if (loginternal && !logsize) { > - /* > - * 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; > - logblocks = MAX(min_logblocks, logblocks); > > - /* > - * If the default log size doesn't fit in the AG size, use the > - * minimum log size instead. This ensures small filesystems > - * don't use excessive amounts of space for the log. > - */ > - if (min_logblocks * XFS_DFL_LOG_FACTOR >= agsize) { > + if (dblocks < GIGABYTES(1, blocklog)) { > + /* tiny filesystems get minimum sized logs. */ > logblocks = min_logblocks; > + } else if (dblocks < GIGABYTES(16, blocklog)) { > + > + /* > + * For small filesystems, we want to use the > + * XFS_MIN_LOG_BYTES for filesystems smaller than 16G if > + * at all possible, ramping up to 128MB at 256GB. > + */ > + logblocks = MIN(XFS_MIN_LOG_BYTES >> blocklog, > + min_logblocks * XFS_DFL_LOG_FACTOR); > } else { > - logblocks = MAX(logblocks, > - MAX(XFS_DFL_LOG_SIZE, > - min_logblocks * XFS_DFL_LOG_FACTOR)); > + /* > + * 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; > + logblocks = MAX(min_logblocks, logblocks); > } > + > + /* make sure the log fits wholly within an AG */ > + if (logblocks >= agsize) > + logblocks = min_logblocks; > + > + /* and now clamp the size to the maximum supported size */ > logblocks = MIN(logblocks, XFS_MAX_LOG_BLOCKS); > - if ((logblocks << blocklog) > XFS_MAX_LOG_BYTES) { > + if ((logblocks << blocklog) > XFS_MAX_LOG_BYTES) > logblocks = XFS_MAX_LOG_BYTES >> blocklog; > - } > + > } > validate_log_size(logblocks, blocklog, min_logblocks); > > _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs