Re: [PATCH 11/17] mkfs: table based parsing for converted parameters

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Jun 19, 2015 at 01:02:00PM +0200, Jan Ťulák wrote:
> From: Dave Chinner <dchinner@xxxxxxxxxx>
> 
> All the parameters that can be passed as block or sector sizes need
> to be passed the block and sector sizes that they should be using
> for conversion. For parameter parsing, it is always the same two
> variables, so to make things easy just declare them as global
> variables so we can avoid needing to pass them to getnum_checked().
> 
> We also need to mark these parameters are requiring conversion so
> that we don't need to pass this information manually to
> getnum_checked(). Further, some of these options are required to
> have a power of 2 value, so add optional checking for that as well.
> 
> Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
> Signed-off-by: Jan Ťulák <jtulak@xxxxxxxxxx>
> ---

Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx>

>  mkfs/xfs_mkfs.c | 171 ++++++++++++++++++++++----------------------------------
>  1 file changed, 68 insertions(+), 103 deletions(-)
> 
> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
> index 0bd8998..4fc1f34 100644
> --- a/mkfs/xfs_mkfs.c
> +++ b/mkfs/xfs_mkfs.c
> @@ -52,6 +52,13 @@ static int  ispow2(unsigned int i);
>  static long long cvtnum(unsigned int blocksize,
>  			unsigned int sectorsize, const char *s);
>  
> +/*
> + * The configured block and sector sizes are defined as global variables so
> + * that they don't need to be passed to functions that require them.
> + */
> +unsigned int		blocksize;
> +unsigned int		sectorsize;
> +
>  #define MAX_SUBOPTS	16
>  #define SUBOPT_NEEDS_VAL	(-1LL)
>  struct opt_params {
> @@ -61,6 +68,8 @@ struct opt_params {
>  	struct subopt_param {
>  		int		index;
>  		bool		seen;
> +		bool		convert;
> +		bool		is_power_2;
>  		long long	minval;
>  		long long	maxval;
>  		long long	defaultval;
> @@ -83,6 +92,8 @@ struct opt_params bopts = {
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = B_SIZE,
> +		  .convert = true,
> +		  .is_power_2 = true,
>  		  .minval = XFS_MIN_BLOCKSIZE,
>  		  .maxval = XFS_MAX_BLOCKSIZE,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
> @@ -140,6 +151,9 @@ struct opt_params dopts = {
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = D_SIZE,
> +		  .convert = true,
> +		  .minval = XFS_AG_MIN_BYTES,
> +		  .maxval = LLONG_MAX,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = D_SUNIT,
> @@ -153,11 +167,15 @@ struct opt_params dopts = {
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = D_AGSIZE,
> +		  .convert = true,
>  		  .minval = XFS_AG_MIN_BYTES,
>  		  .maxval = XFS_AG_MAX_BYTES,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = D_SU,
> +		  .convert = true,
> +		  .minval = 0,
> +		  .maxval = UINT_MAX,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = D_SW,
> @@ -171,6 +189,8 @@ struct opt_params dopts = {
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = D_SECTSIZE,
> +		  .convert = true,
> +		  .is_power_2 = true,
>  		  .minval = XFS_MIN_SECTORSIZE,
>  		  .maxval = XFS_MAX_SECTORSIZE,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
> @@ -237,11 +257,13 @@ struct opt_params iopts = {
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = I_PERBLOCK,
> +		  .is_power_2 = true,
>  		  .minval = XFS_MIN_INODE_PERBLOCK,
>  		  .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = I_SIZE,
> +		  .is_power_2 = true,
>  		  .minval = XFS_DINODE_MIN_SIZE,
>  		  .maxval = XFS_DINODE_MAX_SIZE,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
> @@ -300,6 +322,9 @@ struct opt_params lopts = {
>  		  .defaultval = 1,
>  		},
>  		{ .index = L_SIZE,
> +		  .convert = true,
> +		  .minval = 2 * 1024 * 1024LL,	/* XXX: XFS_MIN_LOG_BYTES */
> +		  .maxval = XFS_MAX_LOG_BYTES,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = L_VERSION,
> @@ -313,6 +338,9 @@ struct opt_params lopts = {
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = L_SU,
> +		  .convert = true,
> +		  .minval = XLOG_MIN_RECORD_BSIZE,
> +		  .maxval = XLOG_MAX_RECORD_BSIZE,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = L_DEV,
> @@ -324,6 +352,8 @@ struct opt_params lopts = {
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = L_SECTSIZE,
> +		  .convert = true,
> +		  .is_power_2 = true,
>  		  .minval = XFS_MIN_SECTORSIZE,
>  		  .maxval = XFS_MAX_SECTORSIZE,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
> @@ -364,6 +394,8 @@ struct opt_params nopts = {
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = N_SIZE,
> +		  .convert = true,
> +		  .is_power_2 = true,
>  		  .minval = 1 << XFS_MIN_REC_DIRSIZE,
>  		  .maxval = XFS_MAX_BLOCKSIZE,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
> @@ -400,9 +432,15 @@ struct opt_params ropts = {
>  	},
>  	.subopt_params = {
>  		{ .index = R_EXTSIZE,
> +		  .convert = true,
> +		  .minval = XFS_MIN_RTEXTSIZE,
> +		  .maxval = XFS_MAX_RTEXTSIZE,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = R_SIZE,
> +		  .convert = true,
> +		  .minval = 0,
> +		  .maxval = LLONG_MAX,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = R_DEV,
> @@ -445,11 +483,15 @@ struct opt_params sopts = {
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = S_SIZE,
> +		  .convert = true,
> +		  .is_power_2 = true,
>  		  .minval = XFS_MIN_SECTORSIZE,
>  		  .maxval = XFS_MAX_SECTORSIZE,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
>  		},
>  		{ .index = S_SECTSIZE,
> +		  .convert = true,
> +		  .is_power_2 = true,
>  		  .minval = XFS_MIN_SECTORSIZE,
>  		  .maxval = XFS_MAX_SECTORSIZE,
>  		  .defaultval = SUBOPT_NEEDS_VAL,
> @@ -1291,15 +1333,15 @@ sb_set_features(
>  long long
>  getnum(
>  	const char	*str,
> -	unsigned int	blocksize,
> -	unsigned int	sectorsize,
> +	unsigned int	blksize,
> +	unsigned int	sectsize,
>  	bool		convert)
>  {
>  	long long	i;
>  	char		*sp;
>  
>  	if (convert)
> -		return cvtnum(blocksize, sectorsize, str);
> +		return cvtnum(blksize, sectsize, str);
>  
>  	i = strtoll(str, &sp, 0);
>  	if (i == 0 && sp == str)
> @@ -1348,9 +1390,11 @@ getnum_checked(
>  		return sp->defaultval;
>  	}
>  
> -	c = getnum(str, 0, 0, false);
> +	c = getnum(str, blocksize, sectorsize, sp->convert);
>  	if (c < sp->minval || c > sp->maxval)
>  		illegal_option(str, opts, index);
> +	if (sp->is_power_2 && !ispow2(c))
> +		illegal_option(str, opts, index);
>  	return c;
>  }
>  
> @@ -1368,7 +1412,6 @@ main(
>  	struct xfs_btree_block	*block;
>  	int			blflag;
>  	int			blocklog;
> -	unsigned int		blocksize;
>  	int			bsflag;
>  	int			bsize;
>  	xfs_buf_t		*buf;
> @@ -1441,7 +1484,6 @@ main(
>  	char			*rtsize;
>  	xfs_sb_t		*sbp;
>  	int			sectorlog;
> -	unsigned int		sectorsize;
>  	__uint64_t		sector_mask;
>  	int			slflag;
>  	int			ssflag;
> @@ -1520,18 +1562,11 @@ main(
>  					blflag = 1;
>  					break;
>  				case B_SIZE:
> -					if (!value || *value == '\0')
> -						reqval('b', subopts, B_SIZE);
> -					if (bsflag)
> -						respec('b', subopts, B_SIZE);
>  					if (blflag)
>  						conflict('b', subopts, B_LOG,
>  							 B_SIZE);
> -					blocksize = getnum(value, blocksize,
> -							sectorsize, true);
> -					if (blocksize <= 0 ||
> -					    !ispow2(blocksize))
> -						illegal(value, "b size");
> +					blocksize = getnum_checked(value, &bopts,
> +								  B_SIZE);
>  					blocklog = libxfs_highbit32(blocksize);
>  					bsflag = 1;
>  					break;
> @@ -1554,14 +1589,8 @@ main(
>  					daflag = 1;
>  					break;
>  				case D_AGSIZE:
> -					if (!value || *value == '\0')
> -						reqval('d', subopts, D_AGSIZE);
> -					if (dasize)
> -						respec('d', subopts, D_AGSIZE);
> -					agsize = getnum(value, blocksize,
> -							sectorsize, true);
> -					if ((__int64_t)agsize <= 0)
> -						illegal(value, "d agsize");
> +					agsize = getnum_checked(value, &dopts,
> +								 D_AGSIZE);
>  					dasize = 1;
>  					break;
>  				case D_FILE:
> @@ -1599,17 +1628,11 @@ main(
>  								 D_SWIDTH);
>  					break;
>  				case D_SU:
> -					if (!value || *value == '\0')
> -						reqval('d', subopts, D_SU);
> -					if (dsu)
> -						respec('d', subopts, D_SU);
>  					if (nodsflag)
>  						conflict('d', subopts, D_NOALIGN,
>  							 D_SU);
> -					dsu = getnum(value, blocksize,
> -						     sectorsize, true);
> -					if (dsu < 0)
> -						illegal(value, "d su");
> +					dsu = getnum_checked(value, &dopts,
> +								 D_SU);
>  					break;
>  				case D_SW:
>  					if (nodsflag)
> @@ -1643,18 +1666,11 @@ main(
>  					slflag = 1;
>  					break;
>  				case D_SECTSIZE:
> -					if (!value || *value == '\0')
> -						reqval('d', subopts, D_SECTSIZE);
> -					if (ssflag)
> -						respec('d', subopts, D_SECTSIZE);
>  					if (slflag)
>  						conflict('d', subopts, D_SECTLOG,
>  							 D_SECTSIZE);
> -					sectorsize = getnum(value, blocksize,
> -							    sectorsize, true);
> -					if (sectorsize <= 0 ||
> -					    !ispow2(sectorsize))
> -						illegal(value, "d sectsize");
> +					sectorsize = getnum_checked(value,
> +							&dopts, D_SECTSIZE);
>  					sectorlog =
>  						libxfs_highbit32(sectorsize);
>  					ssflag = 1;
> @@ -1721,8 +1737,6 @@ main(
>  							 I_PERBLOCK);
>  					inopblock = getnum_checked(value, &iopts,
>  								   I_PERBLOCK);
> -					if (!ispow2(inopblock))
> -						illegal(value, "i perblock");
>  					ipflag = 1;
>  					break;
>  				case I_SIZE:
> @@ -1734,8 +1748,6 @@ main(
>  							 I_SIZE);
>  					isize = getnum_checked(value, &iopts,
>  							       I_SIZE);
> -					if (!ispow2(isize))
> -						illegal(value, "i size");
>  					inodelog = libxfs_highbit32(isize);
>  					isflag = 1;
>  					break;
> @@ -1797,14 +1809,8 @@ main(
>  					liflag = 1;
>  					break;
>  				case L_SU:
> -					if (!value || *value == '\0')
> -						reqval('l', subopts, L_SU);
> -					if (lsu)
> -						respec('l', subopts, L_SU);
> -					lsu = getnum(value, blocksize,
> -						     sectorsize, true);
> -					if (lsu < 0)
> -						illegal(value, "l su");
> +					lsu = getnum_checked(value, &lopts,
> +								 L_SU);
>  					lsuflag = 1;
>  					break;
>  				case L_SUNIT:
> @@ -1851,18 +1857,11 @@ main(
>  					lslflag = 1;
>  					break;
>  				case L_SECTSIZE:
> -					if (!value || *value == '\0')
> -						reqval('l', subopts, L_SECTSIZE);
> -					if (lssflag)
> -						respec('l', subopts, L_SECTSIZE);
>  					if (lslflag)
>  						conflict('l', subopts, L_SECTLOG,
>  							 L_SECTSIZE);
> -					lsectorsize = getnum(value, blocksize,
> -							     sectorsize, true);
> -					if (lsectorsize <= 0 ||
> -					    !ispow2(lsectorsize))
> -						illegal(value, "l sectsize");
> +					lsectorsize = getnum_checked(value,
> +							&lopts, L_SECTSIZE);
>  					lsectorlog =
>  						libxfs_highbit32(lsectorsize);
>  					lssflag = 1;
> @@ -1933,18 +1932,11 @@ _("cannot specify both -m crc=1 and -n ftype\n"));
>  					nlflag = 1;
>  					break;
>  				case N_SIZE:
> -					if (!value || *value == '\0')
> -						reqval('n', subopts, N_SIZE);
> -					if (nsflag)
> -						respec('n', subopts, N_SIZE);
>  					if (nlflag)
>  						conflict('n', subopts, N_LOG,
>  							 N_SIZE);
> -					dirblocksize = getnum(value, blocksize,
> -							      sectorsize, true);
> -					if (dirblocksize <= 0 ||
> -					    !ispow2(dirblocksize))
> -						illegal(value, "n size");
> +					dirblocksize = getnum_checked(value,
> +								&nopts, N_SIZE);
>  					dirblocklog =
>  						libxfs_highbit32(dirblocksize);
>  					nsflag = 1;
> @@ -2060,18 +2052,11 @@ _("cannot specify both -m crc=1 and -n ftype\n"));
>  					break;
>  				case S_SIZE:
>  				case S_SECTSIZE:
> -					if (!value || *value == '\0')
> -						reqval('s', subopts, S_SECTSIZE);
> -					if (ssflag || lssflag)
> -						respec('s', subopts, S_SECTSIZE);
>  					if (slflag || lslflag)
>  						conflict('s', subopts, S_SECTLOG,
>  							 S_SECTSIZE);
> -					sectorsize = getnum(value, blocksize,
> -							    sectorsize, true);
> -					if (sectorsize <= 0 ||
> -					    !ispow2(sectorsize))
> -						illegal(value, "s sectsize");
> +					sectorsize = getnum_checked(value,
> +							&sopts, S_SECTSIZE);
>  					lsectorsize = sectorsize;
>  					sectorlog =
>  						libxfs_highbit32(sectorsize);
> @@ -2306,9 +2291,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n"));
>  	if (dsize) {
>  		__uint64_t dbytes;
>  
> -		dbytes = getnum(dsize, blocksize, sectorsize, true);
> -		if ((__int64_t)dbytes < 0)
> -			illegal(dsize, "d size");
> +		dbytes = getnum_checked(dsize, &dopts, D_SIZE);
>  		if (dbytes % XFS_MIN_BLOCKSIZE) {
>  			fprintf(stderr,
>  			_("illegal data length %lld, not a multiple of %d\n"),
> @@ -2345,9 +2328,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n"));
>  	if (logsize) {
>  		__uint64_t logbytes;
>  
> -		logbytes = getnum(logsize, blocksize, sectorsize, true);
> -		if ((__int64_t)logbytes < 0)
> -			illegal(logsize, "l size");
> +		logbytes = getnum_checked(logsize, &lopts, L_SIZE);
>  		if (logbytes % XFS_MIN_BLOCKSIZE) {
>  			fprintf(stderr,
>  			_("illegal log length %lld, not a multiple of %d\n"),
> @@ -2369,9 +2350,7 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n"));
>  	if (rtsize) {
>  		__uint64_t rtbytes;
>  
> -		rtbytes = getnum(rtsize, blocksize, sectorsize, true);
> -		if ((__int64_t)rtbytes < 0)
> -			illegal(rtsize, "r size");
> +		rtbytes = getnum_checked(rtsize, &ropts, R_SIZE);
>  		if (rtbytes % XFS_MIN_BLOCKSIZE) {
>  			fprintf(stderr,
>  			_("illegal rt length %lld, not a multiple of %d\n"),
> @@ -2391,27 +2370,13 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n"));
>  	if (rtextsize) {
>  		__uint64_t rtextbytes;
>  
> -		rtextbytes = getnum(rtextsize, blocksize, sectorsize, true);
> -		if ((__int64_t)rtextbytes < 0)
> -			illegal(rtsize, "r extsize");
> +		rtextbytes = getnum_checked(rtextsize, &ropts, R_EXTSIZE);
>  		if (rtextbytes % blocksize) {
>  			fprintf(stderr,
>  		_("illegal rt extent size %lld, not a multiple of %d\n"),
>  				(long long)rtextbytes, blocksize);
>  			usage();
>  		}
> -		if (rtextbytes > XFS_MAX_RTEXTSIZE) {
> -			fprintf(stderr,
> -				_("rt extent size %s too large, maximum %d\n"),
> -				rtextsize, XFS_MAX_RTEXTSIZE);
> -			usage();
> -		}
> -		if (rtextbytes < XFS_MIN_RTEXTSIZE) {
> -			fprintf(stderr,
> -				_("rt extent size %s too small, minimum %d\n"),
> -				rtextsize, XFS_MIN_RTEXTSIZE);
> -			usage();
> -		}
>  		rtextblocks = (xfs_extlen_t)(rtextbytes >> blocklog);
>  	} else {
>  		/*
> -- 
> 2.1.0
> 
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs

_______________________________________________
xfs mailing list
xfs@xxxxxxxxxxx
http://oss.sgi.com/mailman/listinfo/xfs




[Index of Archives]     [Linux XFS Devel]     [Linux Filesystem Development]     [Filesystem Testing]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux