All of lore.kernel.org
 help / color / mirror / Atom feed
From: Brian Foster <bfoster@redhat.com>
To: "Jan Ťulák" <jtulak@redhat.com>
Cc: Dave Chinner <dchinner@redhat.com>, xfs@oss.sgi.com
Subject: Re: [PATCH 03/17] mkfs: Sanitise the superblock feature macros
Date: Thu, 25 Jun 2015 15:38:08 -0400	[thread overview]
Message-ID: <20150625193807.GG36162@bfoster.bfoster> (raw)
In-Reply-To: <1434711726-13092-4-git-send-email-jtulak@redhat.com>

On Fri, Jun 19, 2015 at 01:01:52PM +0200, Jan Ťulák wrote:
> From: Dave Chinner <dchinner@redhat.com>
> 
> They are horrible macros that simply obfuscate the code, so
> let's factor the code and make them nice functions.
> 
> To do this, add a sb_feat_args structure that carries around the
> variables rather than a strange assortment of variables. This means
> all the default can be clearly defined in a structure
> initialisation, and dependent feature bits are easy to check.
> 
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> Signed-off-by: Jan Ťulák <jtulak@redhat.com>
> ---
>  include/xfs_mkfs.h |  25 +----
>  mkfs/xfs_mkfs.c    | 293 ++++++++++++++++++++++++++++++++---------------------
>  2 files changed, 181 insertions(+), 137 deletions(-)
> 
> diff --git a/include/xfs_mkfs.h b/include/xfs_mkfs.h
> index 3388f6d..3af9cb1 100644
> --- a/include/xfs_mkfs.h
> +++ b/include/xfs_mkfs.h
> @@ -23,36 +23,13 @@
>                   XFS_SB_VERSION_EXTFLGBIT | \
>                   XFS_SB_VERSION_DIRV2BIT)
>  
> -#define XFS_SB_VERSION_MKFS(crc,ia,dia,log2,attr1,sflag,ci,more) (\
> -	((crc)||(ia)||(dia)||(log2)||(attr1)||(sflag)||(ci)||(more)) ? \
> -	(((crc) ? XFS_SB_VERSION_5 : XFS_SB_VERSION_4) |		\
> -		((ia) ? XFS_SB_VERSION_ALIGNBIT : 0) |			\
> -		((dia) ? XFS_SB_VERSION_DALIGNBIT : 0) |		\
> -		((log2) ? XFS_SB_VERSION_LOGV2BIT : 0) |		\
> -		((attr1) ? XFS_SB_VERSION_ATTRBIT : 0) |		\
> -		((sflag) ? XFS_SB_VERSION_SECTORBIT : 0) |		\
> -		((ci) ? XFS_SB_VERSION_BORGBIT : 0) |			\
> -		((more) ? XFS_SB_VERSION_MOREBITSBIT : 0) |		\
> -	        XFS_DFL_SB_VERSION_BITS |                               \
> -	0 ) : XFS_SB_VERSION_1 )
> -
> -#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent, \
> -			     ftype) (\
> -	((lazycount) ? XFS_SB_VERSION2_LAZYSBCOUNTBIT : 0) |		\
> -	((attr2) ? XFS_SB_VERSION2_ATTR2BIT : 0) |			\
> -	((projid32bit) ? XFS_SB_VERSION2_PROJID32BIT : 0) |		\
> -	((parent) ? XFS_SB_VERSION2_PARENTBIT : 0) |			\
> -	((crc) ? XFS_SB_VERSION2_CRCBIT : 0) |				\
> -	((ftype) ? XFS_SB_VERSION2_FTYPE : 0) |				\
> -	0 )
> -
>  #define	XFS_DFL_BLOCKSIZE_LOG	12		/* 4096 byte blocks */
>  #define	XFS_DINODE_DFL_LOG	8		/* 256 byte inodes */
>  #define	XFS_DINODE_DFL_CRC_LOG	9		/* 512 byte inodes for CRCs */
>  #define	XFS_MIN_DATA_BLOCKS	100
>  #define	XFS_MIN_INODE_PERBLOCK	2		/* min inodes per block */
>  #define	XFS_DFL_IMAXIMUM_PCT	25		/* max % of space for inodes */
> -#define	XFS_IFLAG_ALIGN		1		/* -i align defaults on */
> +#define	XFS_IFLAG_ALIGN		true		/* -i align defaults on */
>  #define	XFS_MIN_REC_DIRSIZE	12		/* 4096 byte dirblocks (V2) */
>  #define	XFS_DFL_DIR_VERSION	2		/* default directory version */
>  #define	XFS_DFL_LOG_SIZE	1000		/* default log size, blocks */
> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
> index 1652903..10276e4 100644
> --- a/mkfs/xfs_mkfs.c
> +++ b/mkfs/xfs_mkfs.c
> @@ -903,6 +903,107 @@ discard_blocks(dev_t dev, __uint64_t nsectors)
>  		platform_discard_blocks(fd, 0, nsectors << 9);
>  }
>  
> +struct sb_feat_args {
> +	int	log_version;
> +	int	attr_version;
> +	int	dir_version;
> +	int	spinodes;
> +	int	finobt;
> +	bool	finobtflag;
> +	bool	inode_align;
> +	bool	nci;
> +	bool	lazy_sb_counters;
> +	bool	projid16bit;
> +	bool	crcs_enabled;
> +	bool	dirftype;
> +	bool	parent_pointers;
> +};
> +
> +static void
> +sb_set_features(
> +	struct xfs_sb		*sbp,
> +	struct sb_feat_args	*fp,
> +	int			sectsize,
> +	int			lsectsize,
> +	int			dsunit)
> +{
> +
> +	sbp->sb_versionnum = XFS_DFL_SB_VERSION_BITS;
> +	if (fp->crcs_enabled)
> +		sbp->sb_versionnum |= XFS_SB_VERSION_5;
> +	else
> +		sbp->sb_versionnum |= XFS_SB_VERSION_4;
> +
> +	if (fp->inode_align)
> +		sbp->sb_versionnum |= XFS_SB_VERSION_ALIGNBIT;
> +	if (dsunit)
> +		sbp->sb_versionnum |= XFS_SB_VERSION_DALIGNBIT;
> +	if (fp->log_version == 2)
> +		sbp->sb_versionnum |= XFS_SB_VERSION_LOGV2BIT;
> +	if (fp->attr_version == 1)
> +		sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT;
> +	if (sectsize > BBSIZE || lsectsize > BBSIZE)
> +		sbp->sb_versionnum |= XFS_SB_VERSION_SECTORBIT;
> +	if (fp->nci)
> +		sbp->sb_versionnum |= XFS_SB_VERSION_BORGBIT;
> +
> +
> +	sbp->sb_features2 = 0;
> +	if (fp->lazy_sb_counters)
> +		sbp->sb_features2 |= XFS_SB_VERSION2_LAZYSBCOUNTBIT;
> +	if (!fp->projid16bit)
> +		sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT;
> +	if (fp->parent_pointers)
> +		sbp->sb_features2 |= XFS_SB_VERSION2_PARENTBIT;
> +	if (fp->crcs_enabled)
> +		sbp->sb_features2 |= XFS_SB_VERSION2_CRCBIT;
> +	if (fp->attr_version == 2)
> +		sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT;
> +
> +	/* v5 superblocks have their own feature bit for dirftype */
> +	if (fp->dirftype && !fp->crcs_enabled)
> +		sbp->sb_features2 |= XFS_SB_VERSION2_FTYPE;
> +
> +	/* update whether extended features are in use */
> +	if (sbp->sb_features2 != 0)
> +		sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
> +
> +	/*
> +	 * Due to a structure alignment issue, sb_features2 ended up in one
> +	 * of two locations, the second "incorrect" location represented by
> +	 * the sb_bad_features2 field. To avoid older kernels mounting
> +	 * filesystems they shouldn't, set both field to the same value.
> +	 */
> +	sbp->sb_bad_features2 = sbp->sb_features2;
> +
> +	if (!fp->crcs_enabled)
> +		return;
> +
> +	/* default features for v5 filesystems */
> +	sbp->sb_features_compat = 0;
> +	sbp->sb_features_ro_compat = 0;
> +	sbp->sb_features_incompat = XFS_SB_FEAT_INCOMPAT_FTYPE;
> +	sbp->sb_features_log_incompat = 0;
> +
> +	if (fp->finobt)
> +		sbp->sb_features_ro_compat = XFS_SB_FEAT_RO_COMPAT_FINOBT;
> +
> +	/*
> +	 * Sparse inode chunk support has two main inode alignment requirements.
> +	 * First, sparse chunk alignment must match the cluster size. Second,
> +	 * full chunk alignment must match the inode chunk size.
> +	 *
> +	 * Copy the already calculated/scaled inoalignmt to spino_align and
> +	 * update the former to the full inode chunk size.
> +	 */
> +	if (fp->spinodes) {
> +		sbp->sb_spino_align = sbp->sb_inoalignmt;
> +		sbp->sb_inoalignmt = XFS_INODES_PER_CHUNK * sbp->sb_inodesize >> sbp->sb_blocklog;

Line above exceeds 80 chars.

> +		sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_SPINODES;
> +	}
> +
> +}
> +
>  int
>  main(
>  	int			argc,
> @@ -914,8 +1015,6 @@ main(
>  	xfs_agnumber_t		agno;
>  	__uint64_t		agsize;
>  	xfs_alloc_rec_t		*arec;
> -	int			attrversion;
> -	int			projid16bit;
>  	struct xfs_btree_block	*block;
>  	int			blflag;
>  	int			blocklog;
> @@ -930,8 +1029,6 @@ main(
>  	char			*dfile;
>  	int			dirblocklog;
>  	int			dirblocksize;
> -	int			dirftype;
> -	int			dirversion;
>  	char			*dsize;
>  	int			dsu;
>  	int			dsw;
> @@ -939,7 +1036,6 @@ main(
>  	int			dswidth;
>  	int			force_overwrite;
>  	struct fsxattr		fsx;
> -	int			iaflag;
>  	int			ilflag;
>  	int			imaxpct;
>  	int			imflag;
> @@ -981,7 +1077,6 @@ main(
>  	int			nftype;
>  	int			nsflag;
>  	int			nvflag;
> -	int			nci;
>  	int			Nflag;
>  	int			discard = 1;
>  	char			*p;
> @@ -1005,19 +1100,27 @@ main(
>  	int			worst_freelist;
>  	libxfs_init_t		xi;
>  	struct fs_topology	ft;
> -	int			lazy_sb_counters;
> -	int			crcs_enabled;
> -	int			finobt;
> -	bool			finobtflag;
> -	int			spinodes;
> +	struct sb_feat_args	sb_feat = {
> +		.finobt = 1,
> +		.finobtflag = false,
> +		.spinodes = 0,
> +		.log_version = 2,
> +		.attr_version = 2,
> +		.dir_version = XFS_DFL_DIR_VERSION,
> +		.inode_align = XFS_IFLAG_ALIGN,
> +		.nci = false,
> +		.lazy_sb_counters = true,
> +		.projid16bit = false,
> +		.crcs_enabled = true,
> +		.dirftype = false,
> +		.parent_pointers = false,
> +	};
>  

FYI...

Building mkfs
    [CC]     xfs_mkfs.o
xfs_mkfs.c: In function ‘main’:
xfs_mkfs.c:1058:8: warning: unused variable ‘logversion’ [-Wunused-variable]
  int   logversion;
        ^

>  	progname = basename(argv[0]);
>  	setlocale(LC_ALL, "");
>  	bindtextdomain(PACKAGE, LOCALEDIR);
>  	textdomain(PACKAGE);
>  
> -	attrversion = 2;
> -	projid16bit = 0;
>  	blflag = bsflag = slflag = ssflag = lslflag = lssflag = 0;
>  	blocklog = blocksize = 0;
>  	sectorlog = lsectorlog = XFS_MIN_SECTORSIZE_LOG;
> @@ -1026,26 +1129,18 @@ main(
>  	ilflag = imflag = ipflag = isflag = 0;
>  	liflag = laflag = lsflag = lsuflag = lsunitflag = ldflag = lvflag = 0;
>  	loginternal = 1;
> -	logversion = 2;
>  	logagno = logblocks = rtblocks = rtextblocks = 0;
> -	Nflag = nlflag = nsflag = nvflag = nci = 0;
> -	nftype = dirftype = 0;		/* inode type information in the dir */
> +	Nflag = nlflag = nsflag = nvflag = 0;
> +	nftype = 0;
>  	dirblocklog = dirblocksize = 0;
> -	dirversion = XFS_DFL_DIR_VERSION;
>  	qflag = 0;
>  	imaxpct = inodelog = inopblock = isize = 0;
> -	iaflag = XFS_IFLAG_ALIGN;
>  	dfile = logfile = rtfile = NULL;
>  	dsize = logsize = rtsize = rtextsize = protofile = NULL;
>  	dsu = dsw = dsunit = dswidth = lalign = lsu = lsunit = 0;
>  	nodsflag = norsflag = 0;
>  	force_overwrite = 0;
>  	worst_freelist = 0;
> -	lazy_sb_counters = 1;
> -	crcs_enabled = 1;
> -	finobt = 1;
> -	finobtflag = false;
> -	spinodes = 0;
>  	memset(&fsx, 0, sizeof(fsx));
>  
>  	memset(&xi, 0, sizeof(xi));
> @@ -1284,10 +1379,11 @@ main(
>  				switch (getsubopt(&p, (constpp)iopts, &value)) {
>  				case I_ALIGN:
>  					if (!value || *value == '\0')
> -						value = "1";
> -					iaflag = atoi(value);
> -					if (iaflag < 0 || iaflag > 1)
> +						break;

reqval() ?

> +					c = atoi(value);
> +					if (c < 0 || c > 1)
>  						illegal(value, "i align");
> +					sb_feat.inode_align = c ? true : false;
>  					break;
>  				case I_LOG:
>  					if (!value || *value == '\0')
> @@ -1357,7 +1453,7 @@ main(
>  					c = atoi(value);
>  					if (c < 0 || c > 2)
>  						illegal(value, "i attr");
> -					attrversion = c;
> +					sb_feat.attr_version = c;
>  					break;
>  				case I_PROJID32BIT:
>  					if (!value || *value == '\0')
> @@ -1365,13 +1461,13 @@ main(
>  					c = atoi(value);
>  					if (c < 0 || c > 1)
>  						illegal(value, "i projid32bit");
> -					projid16bit = c ? 0 : 1;
> +					sb_feat.projid16bit = c ? false : true;
>  					break;
>  				case I_SPINODES:
>  					if (!value || *value == '\0')
>  						value = "1";
> -					spinodes = atoi(value);
> -					if (spinodes < 0 || spinodes > 1)
> +					sb_feat.spinodes = atoi(value);
> +					if (sb_feat.spinodes < 0 || sb_feat.spinodes > 1)

Why not use 'c' here like everywhere else?

>  						illegal(value, "i spinodes");
>  					break;
>  				default:
> @@ -1464,9 +1560,10 @@ main(
>  						reqval('l', lopts, L_VERSION);
>  					if (lvflag)
>  						respec('l', lopts, L_VERSION);
> -					logversion = atoi(value);
> -					if (logversion < 1 || logversion > 2)
> +					c = atoi(value);
> +					if (c < 1 || c > 2)
>  						illegal(value, "l version");
> +					sb_feat.log_version = c;
>  					lvflag = 1;
>  					break;
>  				case L_SIZE:
> @@ -1515,7 +1612,8 @@ main(
>  					c = atoi(value);
>  					if (c < 0 || c > 1)
>  						illegal(value, "l lazy-count");
> -					lazy_sb_counters = c;
> +					sb_feat.lazy_sb_counters = c ? true
> +								     : false;
>  					break;
>  				default:
>  					unknown('l', value);
> @@ -1539,12 +1637,14 @@ main(
>  					c = atoi(value);
>  					if (c < 0 || c > 1)
>  						illegal(value, "m crc");
> -					crcs_enabled = c;
> -					if (nftype && crcs_enabled) {
> +					if (c && nftype) {
>  						fprintf(stderr,
>  _("cannot specify both crc and ftype\n"));
>  						usage();
>  					}
> +					sb_feat.crcs_enabled = c ? true : false;
> +					if (c)
> +						sb_feat.dirftype = true;
>  					break;
>  				case M_FINOBT:
>  					if (!value || *value == '\0')
> @@ -1552,8 +1652,7 @@ _("cannot specify both crc and ftype\n"));
>  					c = atoi(value);
>  					if (c < 0 || c > 1)
>  						illegal(value, "m finobt");
> -					finobt = c;
> -					finobtflag = true;
> +					sb_feat.finobt = c;

What happened to finobtflag (see below)?

>  					break;
>  				default:
>  					unknown('m', value);
> @@ -1603,12 +1702,14 @@ _("cannot specify both crc and ftype\n"));
>  					if (nvflag)
>  						respec('n', nopts, N_VERSION);
>  					if (!strcasecmp(value, "ci")) {
> -						nci = 1; /* ASCII CI mode */
> +						/* ASCII CI mode */
> +						sb_feat.nci = true;
>  					} else {
> -						dirversion = atoi(value);
> -						if (dirversion != 2)
> +						c = atoi(value);
> +						if (c != 2)
>  							illegal(value,
>  								"n version");
> +						sb_feat.dir_version = c;
>  					}
>  					nvflag = 1;
>  					break;
> @@ -1620,12 +1721,12 @@ _("cannot specify both crc and ftype\n"));
>  					c = atoi(value);
>  					if (c < 0 || c > 1)
>  						illegal(value, "n ftype");
> -					if (crcs_enabled) {
> +					if (sb_feat.crcs_enabled) {
>  						fprintf(stderr,
>  _("cannot specify both crc and ftype\n"));
>  						usage();
>  					}
> -					dirftype = c;
> +					sb_feat.dirftype = c ? true : false;
>  					nftype = 1;
>  					break;
>  				default:
> @@ -1774,7 +1875,7 @@ _("cannot specify both crc and ftype\n"));
>  		fprintf(stderr, _("illegal block size %d\n"), blocksize);
>  		usage();
>  	}
> -	if (crcs_enabled && blocksize < XFS_MIN_CRC_BLOCKSIZE) {
> +	if (sb_feat.crcs_enabled && blocksize < XFS_MIN_CRC_BLOCKSIZE) {
>  		fprintf(stderr,
>  _("Minimum block size for CRC enabled filesystems is %d bytes.\n"),
>  			XFS_MIN_CRC_BLOCKSIZE);
> @@ -1851,7 +1952,7 @@ _("block size %d cannot be smaller than logical sector size %d\n"),
>  		usage();
>  	} else if (lsectorsize > XFS_MIN_SECTORSIZE && !lsu && !lsunit) {
>  		lsu = blocksize;
> -		logversion = 2;
> +		sb_feat.log_version = 2;
>  	}
>  
>  	/*
> @@ -1859,7 +1960,7 @@ _("block size %d cannot be smaller than logical sector size %d\n"),
>  	 * no longer optional for CRC enabled filesystems.  Catch them up front
>  	 * here before doing anything else.
>  	 */
> -	if (crcs_enabled) {
> +	if (sb_feat.crcs_enabled) {
>  		/* minimum inode size is 512 bytes, ipflag checked later */
>  		if ((isflag || ilflag) && inodelog < XFS_DINODE_DFL_CRC_LOG) {
>  			fprintf(stderr,
> @@ -1869,28 +1970,28 @@ _("Minimum inode size for CRCs is %d bytes\n"),
>  		}
>  
>  		/* inodes always aligned */
> -		if (iaflag != 1) {
> +		if (!sb_feat.inode_align) {
>  			fprintf(stderr,
>  _("Inodes always aligned for CRC enabled filesytems\n"));
>  			usage();
>  		}
>  
>  		/* lazy sb counters always on */
> -		if (lazy_sb_counters != 1) {
> +		if (!sb_feat.lazy_sb_counters) {
>  			fprintf(stderr,
>  _("Lazy superblock counted always enabled for CRC enabled filesytems\n"));
>  			usage();
>  		}
>  
>  		/* version 2 logs always on */
> -		if (logversion != 2) {
> +		if (sb_feat.log_version != 2) {
>  			fprintf(stderr,
>  _("V2 logs always enabled for CRC enabled filesytems\n"));
>  			usage();
>  		}
>  
>  		/* attr2 always on */
> -		if (attrversion != 2) {
> +		if (sb_feat.attr_version != 2) {
>  			fprintf(stderr,
>  _("V2 attribute format always enabled on CRC enabled filesytems\n"));
>  			usage();
> @@ -1898,7 +1999,7 @@ _("V2 attribute format always enabled on CRC enabled filesytems\n"));
>  
>  		/* 32 bit project quota always on */
>  		/* attr2 always on */
> -		if (projid16bit == 1) {
> +		if (sb_feat.projid16bit) {
>  			fprintf(stderr,
>  _("32 bit Project IDs always enabled on CRC enabled filesytems\n"));
>  			usage();
> @@ -1912,17 +2013,17 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n"));
>  		 * tried to use crc=0,finobt=1, then issue a warning before
>  		 * turning them off.
>  		 */
> -		if (finobt && finobtflag) {
> +		if (sb_feat.finobt && sb_feat.finobtflag) {

Since the code above drops finobtflag, I don't think we'll ever hit
this. Indeed, I can now create a crc=0,finobt=1 fs, which shouldn't
happen.

Brian

>  			fprintf(stderr,
>  _("warning: finobt not supported without CRC support, disabled.\n"));
> +			sb_feat.finobt = 0;
>  		}
> -		finobt = 0;
>  	}
>  
> -	if (spinodes && !crcs_enabled) {
> +	if (sb_feat.spinodes && !sb_feat.crcs_enabled) {
>  		fprintf(stderr,
>  _("warning: sparse inodes not supported without CRC support, disabled.\n"));
> -		spinodes = 0;
> +		sb_feat.spinodes = 0;
>  	}
>  
>  	if (nsflag || nlflag) {
> @@ -1972,11 +2073,11 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n"));
>  		inodelog = blocklog - libxfs_highbit32(inopblock);
>  		isize = 1 << inodelog;
>  	} else if (!ilflag && !isflag) {
> -		inodelog = crcs_enabled ? XFS_DINODE_DFL_CRC_LOG
> -					: XFS_DINODE_DFL_LOG;
> +		inodelog = sb_feat.crcs_enabled ? XFS_DINODE_DFL_CRC_LOG
> +						: XFS_DINODE_DFL_LOG;
>  		isize = 1 << inodelog;
>  	}
> -	if (crcs_enabled && inodelog < XFS_DINODE_DFL_CRC_LOG) {
> +	if (sb_feat.crcs_enabled && inodelog < XFS_DINODE_DFL_CRC_LOG) {
>  		fprintf(stderr,
>  		_("Minimum inode size for CRCs is %d bytes\n"),
>  			1 << XFS_DINODE_DFL_CRC_LOG);
> @@ -2106,10 +2207,10 @@ _("warning: sparse inodes not supported without CRC support, disabled.\n"));
>  	}
>  
>  	/* if lsu or lsunit was specified, automatically use v2 logs */
> -	if ((lsu || lsunit) && logversion == 1) {
> +	if ((lsu || lsunit) && sb_feat.log_version == 1) {
>  		fprintf(stderr,
>  			_("log stripe unit specified, using v2 logs\n"));
> -		logversion = 2;
> +		sb_feat.log_version = 2;
>  	}
>  
>  	calc_stripe_factors(dsu, dsw, sectorsize, lsu, lsectorsize,
> @@ -2424,12 +2525,12 @@ an AG size that is one stripe unit smaller, for example %llu.\n"),
>  		}
>  		/* convert from 512 byte blocks to fs blocks */
>  		lsunit = DTOBT(lsunit);
> -	} else if (logversion == 2 && loginternal && dsunit) {
> +	} else if (sb_feat.log_version == 2 && loginternal && dsunit) {
>  		/* lsunit and dsunit now in fs blocks */
>  		lsunit = dsunit;
>  	}
>  
> -	if (logversion == 2 && (lsunit * blocksize) > 256 * 1024) {
> +	if (sb_feat.log_version == 2 && (lsunit * blocksize) > 256 * 1024) {
>  		/* Warn only if specified on commandline */
>  		if (lsuflag || lsunitflag) {
>  			fprintf(stderr,
> @@ -2441,9 +2542,9 @@ an AG size that is one stripe unit smaller, for example %llu.\n"),
>  		lsunit = (32 * 1024) >> blocklog;
>  	}
>  
> -	min_logblocks = max_trans_res(crcs_enabled, dirversion,
> +	min_logblocks = max_trans_res(sb_feat.crcs_enabled, sb_feat.dir_version,
>  				   sectorlog, blocklog, inodelog, dirblocklog,
> -				   logversion, lsunit);
> +				   sb_feat.log_version, lsunit);
>  	ASSERT(min_logblocks);
>  	min_logblocks = MAX(XFS_MIN_LOG_BLOCKS, min_logblocks);
>  	if (!logsize && dblocks >= (1024*1024*1024) >> blocklog)
> @@ -2521,25 +2622,8 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
>  	 * sb_versionnum and finobt flags must be set before we use
>  	 * XFS_PREALLOC_BLOCKS().
>  	 */
> -	sbp->sb_features2 = XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters,
> -					attrversion == 2, !projid16bit, 0,
> -					(!crcs_enabled && dirftype));
> -	sbp->sb_versionnum = XFS_SB_VERSION_MKFS(crcs_enabled, iaflag,
> -					dsunit != 0,
> -					logversion == 2, attrversion == 1,
> -					(sectorsize != BBSIZE ||
> -							lsectorsize != BBSIZE),
> -					nci, sbp->sb_features2 != 0);
> -	/*
> -	 * Due to a structure alignment issue, sb_features2 ended up in one
> -	 * of two locations, the second "incorrect" location represented by
> -	 * the sb_bad_features2 field. To avoid older kernels mounting
> -	 * filesystems they shouldn't, set both field to the same value.
> -	 */
> -	sbp->sb_bad_features2 = sbp->sb_features2;
> +	sb_set_features(&mp->m_sb, &sb_feat, sectorsize, lsectorsize, dsunit);
>  
> -	if (finobt)
> -		sbp->sb_features_ro_compat = XFS_SB_FEAT_RO_COMPAT_FINOBT;
>  
>  	if (loginternal) {
>  		/*
> @@ -2591,14 +2675,6 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
>  	}
>  	validate_log_size(logblocks, blocklog, min_logblocks);
>  
> -	/*
> -	 * dirent filetype field always enabled on v5 superblocks
> -	 */
> -	if (crcs_enabled) {
> -		sbp->sb_features_incompat = XFS_SB_FEAT_INCOMPAT_FTYPE;
> -		dirftype = 1;
> -	}
> -
>  	if (!qflag || Nflag) {
>  		printf(_(
>  		   "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n"
> @@ -2611,13 +2687,16 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
>  		   "         =%-22s sectsz=%-5u sunit=%d blks, lazy-count=%d\n"
>  		   "realtime =%-22s extsz=%-6d blocks=%lld, rtextents=%lld\n"),
>  			dfile, isize, (long long)agcount, (long long)agsize,
> -			"", sectorsize, attrversion, !projid16bit,
> -			"", crcs_enabled, finobt, spinodes,
> +			"", sectorsize, sb_feat.attr_version,
> +				    !sb_feat.projid16bit,
> +			"", sb_feat.crcs_enabled, sb_feat.finobt, sb_feat.spinodes,
>  			"", blocksize, (long long)dblocks, imaxpct,
>  			"", dsunit, dswidth,
> -			dirversion, dirblocksize, nci, dirftype,
> +			sb_feat.dir_version, dirblocksize, sb_feat.nci,
> +				sb_feat.dirftype,
>  			logfile, 1 << blocklog, (long long)logblocks,
> -			logversion, "", lsectorsize, lsunit, lazy_sb_counters,
> +			sb_feat.log_version, "", lsectorsize, lsunit,
> +				sb_feat.lazy_sb_counters,
>  			rtfile, rtextblocks << blocklog,
>  			(long long)rtblocks, (long long)rtextents);
>  		if (Nflag)
> @@ -2660,17 +2739,17 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
>  	sbp->sb_unit = dsunit;
>  	sbp->sb_width = dswidth;
>  	sbp->sb_dirblklog = dirblocklog - blocklog;
> -	if (logversion == 2) {	/* This is stored in bytes */
> +	if (sb_feat.log_version == 2) {	/* This is stored in bytes */
>  		lsunit = (lsunit == 0) ? 1 : XFS_FSB_TO_B(mp, lsunit);
>  		sbp->sb_logsunit = lsunit;
>  	} else
>  		sbp->sb_logsunit = 0;
> -	if (iaflag) {
> +	if (sb_feat.inode_align) {
>  		int	cluster_size = XFS_INODE_BIG_CLUSTER_SIZE;
> -		if (crcs_enabled)
> +		if (sb_feat.crcs_enabled)
>  			cluster_size *= isize / XFS_DINODE_MIN_SIZE;
>  		sbp->sb_inoalignmt = cluster_size >> blocklog;
> -		iaflag = sbp->sb_inoalignmt != 0;
> +		sb_feat.inode_align = sbp->sb_inoalignmt != 0;
>  	} else
>  		sbp->sb_inoalignmt = 0;
>  	if (lsectorsize != BBSIZE || sectorsize != BBSIZE) {
> @@ -2681,19 +2760,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
>  		sbp->sb_logsectsize = 0;
>  	}
>  
> -	/*
> -	 * Sparse inode chunk support has two main inode alignment requirements.
> -	 * First, sparse chunk alignment must match the cluster size. Second,
> -	 * full chunk alignment must match the inode chunk size.
> -	 *
> -	 * Copy the already calculated/scaled inoalignmt to spino_align and
> -	 * update the former to the full inode chunk size.
> -	 */
> -	if (spinodes) {
> -		sbp->sb_spino_align = sbp->sb_inoalignmt;
> -		sbp->sb_inoalignmt = XFS_INODES_PER_CHUNK * isize >> blocklog;
> -		sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_SPINODES;
> -	}
> +	sb_set_features(&mp->m_sb, &sb_feat, sectorsize, lsectorsize, dsunit);
>  
>  	if (force_overwrite)
>  		zero_old_xfs_structures(&xi, sbp);
> @@ -2749,7 +2816,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
>  	libxfs_log_clear(mp->m_logdev_targp,
>  		XFS_FSB_TO_DADDR(mp, logstart),
>  		(xfs_extlen_t)XFS_FSB_TO_BB(mp, logblocks),
> -		&sbp->sb_uuid, logversion, lsunit, XLOG_FMT);
> +		&sbp->sb_uuid, sb_feat.log_version, lsunit, XLOG_FMT);
>  
>  	mp = libxfs_mount(mp, sbp, xi.ddev, xi.logdev, xi.rtdev, 0);
>  	if (mp == NULL) {
> @@ -2851,7 +2918,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
>  		agi->agi_count = 0;
>  		agi->agi_root = cpu_to_be32(XFS_IBT_BLOCK(mp));
>  		agi->agi_level = cpu_to_be32(1);
> -		if (finobt) {
> +		if (sb_feat.finobt) {
>  			agi->agi_free_root = cpu_to_be32(XFS_FIBT_BLOCK(mp));
>  			agi->agi_free_level = cpu_to_be32(1);
>  		}
> @@ -2984,7 +3051,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
>  		/*
>  		 * Free INO btree root block
>  		 */
> -		if (!finobt)
> +		if (!sb_feat.finobt)
>  			continue;
>  
>  		buf = libxfs_getbuf(mp->m_ddev_targp,
> -- 
> 2.1.0
> 
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs

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

  reply	other threads:[~2015-06-25 19:38 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-19 11:01 [PATCH 00/17] mkfs: sanitise input parameters Jan Ťulák
2015-06-19 11:01 ` [PATCH 01/17] xfsprogs: use common code for multi-disk detection Jan Ťulák
2015-06-19 11:10   ` Christoph Hellwig
2015-06-19 11:51     ` Jan Tulak
2015-06-25 19:37   ` Brian Foster
2015-07-02 12:47     ` Jan Tulak
2015-07-02 14:14       ` Brian Foster
2015-07-02 23:05         ` Dave Chinner
2015-07-03 13:22           ` Brian Foster
2015-07-08 16:14           ` Jan Tulak
2015-07-09  0:45             ` Dave Chinner
2015-07-09  8:24               ` Jan Tulak
2015-07-03 10:06         ` Jan Tulak
2015-06-19 11:01 ` [PATCH 02/17] mkfs: sanitise ftype parameter values Jan Ťulák
2015-06-25 19:37   ` Brian Foster
2015-06-19 11:01 ` [PATCH 03/17] mkfs: Sanitise the superblock feature macros Jan Ťulák
2015-06-25 19:38   ` Brian Foster [this message]
2015-07-03  9:53     ` Jan Tulak
2015-07-03 13:24       ` Brian Foster
2015-06-19 11:01 ` [PATCH 04/17] mkfs: validate all input values Jan Ťulák
2015-06-25 19:38   ` Brian Foster
2015-06-19 11:01 ` [PATCH 05/17] mkfs: factor boolean option parsing Jan Ťulák
2015-06-25 19:38   ` Brian Foster
2015-06-19 11:01 ` [PATCH 06/17] mkfs: validate logarithmic parameters sanely Jan Ťulák
2015-06-26 17:16   ` Brian Foster
2015-06-19 11:01 ` [PATCH 07/17] mkfs: structify input parameter passing Jan Ťulák
2015-06-26 17:16   ` Brian Foster
2015-06-19 11:01 ` [PATCH 08/17] mkfs: getbool is redundant Jan Ťulák
2015-06-26 17:17   ` Brian Foster
2015-06-30  1:32     ` Dave Chinner
2015-06-19 11:01 ` [PATCH 09/17] mkfs: use getnum_checked for all ranged parameters Jan Ťulák
2015-06-26 17:17   ` Brian Foster
2015-06-19 11:01 ` [PATCH 10/17] mkfs: add respecification detection to generic parsing Jan Ťulák
2015-06-26 17:17   ` Brian Foster
2015-06-19 11:02 ` [PATCH 11/17] mkfs: table based parsing for converted parameters Jan Ťulák
2015-06-26 17:17   ` Brian Foster
2015-06-19 11:02 ` [PATCH 12/17] mkfs: merge getnum Jan Ťulák
2015-06-26 17:17   ` Brian Foster
2015-06-19 11:02 ` [PATCH 13/17] mkfs: encode conflicts into parsing table Jan Ťulák
2015-06-26 17:17   ` Brian Foster
2015-06-30  3:57     ` Dave Chinner
2015-06-30 11:27       ` Brian Foster
2015-07-01  8:30         ` Jan Tulak
2015-06-19 11:02 ` [PATCH 14/17] mkfs: add string options to generic parsing Jan Ťulák
2015-06-26 19:32   ` Brian Foster
2015-06-19 11:02 ` [PATCH 15/17] mkfs: don't treat files as though they are block devices Jan Ťulák
2015-06-26 19:32   ` Brian Foster
2015-06-19 11:02 ` [PATCH 16/17] mkfs fix: handling of files Jan Ťulák
2015-06-26 19:32   ` Brian Foster
2015-06-19 11:02 ` [PATCH 17/17] mkfs: move spinodes crc check Jan Ťulák
2015-06-26 19:32   ` Brian Foster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150625193807.GG36162@bfoster.bfoster \
    --to=bfoster@redhat.com \
    --cc=dchinner@redhat.com \
    --cc=jtulak@redhat.com \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.