public inbox for linux-xfs@vger.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 11/17] mkfs: table based parsing for converted parameters
Date: Fri, 26 Jun 2015 13:17:21 -0400	[thread overview]
Message-ID: <20150626171720.GG40750@bfoster.bfoster> (raw)
In-Reply-To: <1434711726-13092-12-git-send-email-jtulak@redhat.com>

On Fri, Jun 19, 2015 at 01:02:00PM +0200, Jan Ťulák wrote:
> From: Dave Chinner <dchinner@redhat.com>
> 
> 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@redhat.com>
> Signed-off-by: Jan Ťulák <jtulak@redhat.com>
> ---

Reviewed-by: Brian Foster <bfoster@redhat.com>

>  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@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-26 17:17 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
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 [this message]
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=20150626171720.GG40750@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox