diff mbox

[03/22] mkfs: extend opt_params with a value field

Message ID 1481117249-21273-4-git-send-email-jtulak@redhat.com (mailing list archive)
State Superseded, archived
Headers show

Commit Message

Jan Tulak Dec. 7, 2016, 1:27 p.m. UTC
Add a new field int opt_params - value, which is filled with user input.

Signed-off-by: Jan Tulak <jtulak@redhat.com>
---
 mkfs/xfs_mkfs.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 132 insertions(+)

Comments

Bill O'Donnell Jan. 13, 2017, 4:55 p.m. UTC | #1
On Wed, Dec 07, 2016 at 02:27:10PM +0100, Jan Tulak wrote:
> Add a new field int opt_params - value, which is filled with user input.
> 
> Signed-off-by: Jan Tulak <jtulak@redhat.com>

Despite a very minor whitespace issue...

Reviewed-by: Bill O'Donnell <billodo@redhat.com>

> ---
>  mkfs/xfs_mkfs.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 132 insertions(+)
> 
> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
> index 372c620..edcfdc0 100644
> --- a/mkfs/xfs_mkfs.c
> +++ b/mkfs/xfs_mkfs.c
> @@ -115,6 +115,12 @@ unsigned int		sectorsize;
>   *     sets what is used with simple specifying the subopt (-d file).
>   *     A special SUBOPT_NEEDS_VAL can be used to require a user-given
>   *     value in any case.
> + *
> + *   value INTERNAL
> + *     Do not set this on initialization. Use defaultval for what you want
> + *     to do. This is filled with user input and anything you write here now
> + *     is overwritten. (If the user input is a string and not a number, this
> + *     value is set to a positive non-zero number.)
>   */
>  struct opt_params {
>  	int		index;
> @@ -131,6 +137,7 @@ struct opt_params {
>  		long long	minval;
>  		long long	maxval;
>  		long long	defaultval;
> +		long long	value;
>  	}		subopt_params[MAX_SUBOPTS];
>  } opts[MAX_OPTS] = {
>  #define OPT_B	0
> @@ -1566,12 +1573,20 @@ main(
>  								B_LOG);
>  					blocksize = 1 << blocklog;
>  					blflag = 1;
> +					opts[OPT_B].subopt_params[B_LOG].value =
> +							blocklog;
> +					opts[OPT_B].subopt_params[B_SIZE].value =
> +							blocksize;
>  					break;
>  				case B_SIZE:
>  					blocksize = getnum(value, &opts[OPT_B],
>  							   B_SIZE);
>  					blocklog = libxfs_highbit32(blocksize);
>  					bsflag = 1;
> +					opts[OPT_B].subopt_params[B_LOG].value =
> +							blocklog;
> +					opts[OPT_B].subopt_params[B_SIZE].value =
> +							blocksize;
>  					break;
>  				default:
>  					unknown('b', value);
> @@ -1589,47 +1604,70 @@ main(
>  					agcount = getnum(value, &opts[OPT_D],
>  							 D_AGCOUNT);
>  					daflag = 1;
> +					opts[OPT_D].subopt_params[D_AGCOUNT].value =
> +							agcount;
>  					break;
>  				case D_AGSIZE:
>  					agsize = getnum(value, &opts[OPT_D],
>  								D_AGSIZE);
>  					dasize = 1;
> +					opts[OPT_D].subopt_params[D_AGSIZE].value =
> +							agsize;
>  					break;
>  				case D_FILE:
>  					xi.disfile = getnum(value, &opts[OPT_D],
>  							    D_FILE);
> +					opts[OPT_D].subopt_params[D_FILE].value =
> +							xi.disfile;
>  					break;
>  				case D_NAME:
>  					xi.dname = getstr(value, &opts[OPT_D],
>  								D_NAME);
> +					opts[OPT_D].subopt_params[D_NAME].value = 1;
>  					break;
>  				case D_SIZE:
>  					dbytes = getnum(value, &opts[OPT_D],
>  								D_SIZE);
> +					opts[OPT_D].subopt_params[D_SIZE].value =
> +							dbytes;
>  					break;
>  				case D_SUNIT:
>  					dsunit = getnum(value, &opts[OPT_D],
>  								D_SUNIT);
> +					opts[OPT_D].subopt_params[D_SUNIT].value =
> +							dsunit;
>  					break;
>  				case D_SWIDTH:
>  					dswidth = getnum(value, &opts[OPT_D],
>  							 D_SWIDTH);
> +					opts[OPT_D].subopt_params[D_SWIDTH].value =
> +							dswidth;
>  					break;
>  				case D_SU:
>  					dsu = getnum(value, &opts[OPT_D], D_SU);
> +					opts[OPT_D].subopt_params[D_SU].value =
> +							dsu;
>  					break;
>  				case D_SW:
>  					dsw = getnum(value, &opts[OPT_D], D_SW);
> +					opts[OPT_D].subopt_params[D_SW].value =
> +							dsw;
>  					break;
>  				case D_NOALIGN:
>  					nodsflag = getnum(value, &opts[OPT_D],
>  								D_NOALIGN);
> +					opts[OPT_D].subopt_params[D_NOALIGN].value =
> +							nodsflag;
>  					break;
>  				case D_SECTLOG:
>  					sectorlog = getnum(value, &opts[OPT_D],
>  							   D_SECTLOG);
>  					sectorsize = 1 << sectorlog;
>  					slflag = 1;
> +					opts[OPT_D].subopt_params[D_SECTSIZE].value =
> +							sectorsize;
> +					opts[OPT_D].subopt_params[D_SECTLOG].value =
> +							sectorlog;
>  					break;
>  				case D_SECTSIZE:
>  					sectorsize = getnum(value, &opts[OPT_D],
> @@ -1637,6 +1675,10 @@ main(
>  					sectorlog =
>  						libxfs_highbit32(sectorsize);
>  					ssflag = 1;
> +					opts[OPT_D].subopt_params[D_SECTSIZE].value =
> +							sectorsize;
> +					opts[OPT_D].subopt_params[D_SECTLOG].value =
> +							sectorlog;
>  					break;
>  				case D_RTINHERIT:
>  					c = getnum(value, &opts[OPT_D],
> @@ -1644,18 +1686,24 @@ main(
>  					if (c)
>  						fsx.fsx_xflags |=
>  							XFS_DIFLAG_RTINHERIT;
> +					opts[OPT_D].subopt_params[D_RTINHERIT].value =
> +							c;
>  					break;
>  				case D_PROJINHERIT:
>  					fsx.fsx_projid = getnum(value, &opts[OPT_D],
>  								D_PROJINHERIT);
>  					fsx.fsx_xflags |=
>  						XFS_DIFLAG_PROJINHERIT;
> +					opts[OPT_D].subopt_params[D_PROJINHERIT].value =
> +							fsx.fsx_projid;
>  					break;
>  				case D_EXTSZINHERIT:
>  					fsx.fsx_extsize = getnum(value, &opts[OPT_D],
>  								 D_EXTSZINHERIT);
>  					fsx.fsx_xflags |=
>  						XFS_DIFLAG_EXTSZINHERIT;
> +					opts[OPT_D].subopt_params[D_EXTSZINHERIT].value =
> +							fsx.fsx_extsize;
>  					break;
>  				default:
>  					unknown('d', value);
> @@ -1673,43 +1721,64 @@ main(
>  					sb_feat.inode_align = getnum(value,
>  								&opts[OPT_I],
>  								I_ALIGN);
> +					opts[OPT_I].subopt_params[I_ALIGN].value =
> +							sb_feat.inode_align;
>  					break;
>  				case I_LOG:
>  					inodelog = getnum(value, &opts[OPT_I],
>  								I_LOG);
>  					isize = 1 << inodelog;
>  					ilflag = 1;
> +					opts[OPT_I].subopt_params[I_SIZE].value =
> +							isize;
> +					opts[OPT_I].subopt_params[I_LOG].value =
> +							inodelog;
>  					break;
>  				case I_MAXPCT:
>  					imaxpct = getnum(value, &opts[OPT_I],
>  							 I_MAXPCT);
>  					imflag = 1;
> +					opts[OPT_I].subopt_params[I_MAXPCT].value =
> +							imaxpct;
>  					break;
>  				case I_PERBLOCK:
>  					inopblock = getnum(value, &opts[OPT_I],
>  							   I_PERBLOCK);
>  					ipflag = 1;
> +					opts[OPT_I].subopt_params[I_PERBLOCK].value =
> +							inopblock;
>  					break;
>  				case I_SIZE:
>  					isize = getnum(value, &opts[OPT_I],
>  								I_SIZE);
>  					inodelog = libxfs_highbit32(isize);
>  					isflag = 1;
> +					opts[OPT_I].subopt_params[I_SIZE].value =
> +							isize;
> +					opts[OPT_I].subopt_params[I_LOG].value =
> +							inodelog;
>  					break;
>  				case I_ATTR:
>  					sb_feat.attr_version =
> +
>  						getnum(value, &opts[OPT_I],
>  								I_ATTR);
> +					opts[OPT_I].subopt_params[I_ATTR].value =
> +							sb_feat.attr_version;
>  					break;
>  				case I_PROJID32BIT:
>  					sb_feat.projid16bit =
>  						!getnum(value, &opts[OPT_I],
>  							I_PROJID32BIT);
> +					opts[OPT_I].subopt_params[I_PROJID32BIT].value =
> +							sb_feat.projid16bit;
>  					break;
>  				case I_SPINODES:
>  					sb_feat.spinodes = getnum(value,
>  								&opts[OPT_I],
>  								I_SPINODES);
> +					opts[OPT_I].subopt_params[I_SPINODES].value =
> +							sb_feat.spinodes;
>  					break;
>  				default:
>  					unknown('i', value);
> @@ -1727,24 +1796,34 @@ main(
>  					logagno = getnum(value, &opts[OPT_L],
>  								L_AGNUM);
>  					laflag = 1;
> +					opts[OPT_L].subopt_params[L_AGNUM].value =
> +							logagno;
>  					break;
>  				case L_FILE:
>  					xi.lisfile = getnum(value, &opts[OPT_L],
>  							    L_FILE);
> +					opts[OPT_L].subopt_params[L_FILE].value =
> +							xi.lisfile;
>  					break;
>  				case L_INTERNAL:
>  					loginternal = getnum(value, &opts[OPT_L],
>  							     L_INTERNAL);
>  					liflag = 1;
> +					opts[OPT_L].subopt_params[L_INTERNAL].value =
> +							loginternal;
>  					break;
>  				case L_SU:
>  					lsu = getnum(value, &opts[OPT_L], L_SU);
>  					lsuflag = 1;
> +					opts[OPT_L].subopt_params[L_SU].value =
> +							lsu;
>  					break;
>  				case L_SUNIT:
>  					lsunit = getnum(value, &opts[OPT_L],
>  								L_SUNIT);
>  					lsunitflag = 1;
> +					opts[OPT_L].subopt_params[L_SUNIT].value =
> +							lsunit;
>  					break;
>  				case L_NAME:
>  				case L_DEV:
> @@ -1753,22 +1832,32 @@ main(
>  					xi.logname = logfile;
>  					ldflag = 1;
>  					loginternal = 0;
> +					opts[OPT_L].subopt_params[L_NAME].value = 1;
> +					opts[OPT_L].subopt_params[L_DEV].value = 1;
>  					break;
>  				case L_VERSION:
>  					sb_feat.log_version =
>  						getnum(value, &opts[OPT_L],
>  								L_VERSION);
>  					lvflag = 1;
> +					opts[OPT_L].subopt_params[L_VERSION].value =
> +							sb_feat.log_version;
>  					break;
>  				case L_SIZE:
>  					logbytes = getnum(value, &opts[OPT_L],
>  								L_SIZE);
> +					opts[OPT_L].subopt_params[L_SIZE].value =
> +							logbytes;
>  					break;
>  				case L_SECTLOG:
>  					lsectorlog = getnum(value, &opts[OPT_L],
>  							    L_SECTLOG);
>  					lsectorsize = 1 << lsectorlog;
>  					lslflag = 1;
> +					opts[OPT_L].subopt_params[L_SECTSIZE].value =
> +							lsectorsize;
> +					opts[OPT_L].subopt_params[L_SECTLOG].value =
> +							lsectorlog;
>  					break;
>  				case L_SECTSIZE:
>  					lsectorsize = getnum(value, &opts[OPT_L],
> @@ -1776,11 +1865,17 @@ main(
>  					lsectorlog =
>  						libxfs_highbit32(lsectorsize);
>  					lssflag = 1;
> +					opts[OPT_L].subopt_params[L_SECTSIZE].value =
> +							lsectorsize;
> +					opts[OPT_L].subopt_params[L_SECTLOG].value =
> +							lsectorlog;
>  					break;
>  				case L_LAZYSBCNTR:
>  					sb_feat.lazy_sb_counters =
>  							getnum(value, &opts[OPT_L],
>  							       L_LAZYSBCNTR);
> +					opts[OPT_L].subopt_params[L_LAZYSBCNTR].value =
> +							sb_feat.lazy_sb_counters;
>  					break;
>  				default:
>  					unknown('l', value);
> @@ -1805,20 +1900,27 @@ main(
>  								M_CRC);
>  					if (sb_feat.crcs_enabled)
>  						sb_feat.dirftype = true;
> +					opts[OPT_M].subopt_params[M_CRC].value =
> +							sb_feat.crcs_enabled;
>  					break;
>  				case M_FINOBT:
>  					sb_feat.finobt = getnum(
>  						value, &opts[OPT_M], M_FINOBT);
> +					opts[OPT_M].subopt_params[M_FINOBT].value =
> +							sb_feat.finobt;
>  					break;
>  				case M_UUID:
>  					if (!value || *value == '\0')
>  						reqval('m', subopts, M_UUID);
>  					if (platform_uuid_parse(value, &uuid))
>  						illegal(optarg, "m uuid");
> +					opts[OPT_M].subopt_params[M_UUID].value = 1;
>  					break;
>  				case M_RMAPBT:
>  					sb_feat.rmapbt = getnum(
>  						value, &opts[OPT_M], M_RMAPBT);
> +					opts[OPT_M].subopt_params[M_RMAPBT].value = 

trailing whitespace above ^^^

> +						sb_feat.rmapbt;
>  					break;
>  				case M_REFLINK:
>  					sb_feat.reflink = getnum(
> @@ -1841,6 +1943,10 @@ main(
>  							     N_LOG);
>  					dirblocksize = 1 << dirblocklog;
>  					nlflag = 1;
> +					opts[OPT_N].subopt_params[N_SIZE].value =
> +							dirblocksize;
> +					opts[OPT_N].subopt_params[N_LOG].value =
> +							dirblocklog;
>  					break;
>  				case N_SIZE:
>  					dirblocksize = getnum(value, &opts[OPT_N],
> @@ -1848,6 +1954,10 @@ main(
>  					dirblocklog =
>  						libxfs_highbit32(dirblocksize);
>  					nsflag = 1;
> +					opts[OPT_N].subopt_params[N_SIZE].value =
> +							dirblocksize;
> +					opts[OPT_N].subopt_params[N_LOG].value =
> +							dirblocklog;
>  					break;
>  				case N_VERSION:
>  					value = getstr(value, &opts[OPT_N],
> @@ -1861,10 +1971,14 @@ main(
>  							       N_VERSION);
>  					}
>  					nvflag = 1;
> +					opts[OPT_N].subopt_params[N_VERSION].value =
> +							sb_feat.dir_version;
>  					break;
>  				case N_FTYPE:
>  					sb_feat.dirftype = getnum(value, &opts[OPT_N],
>  								  N_FTYPE);
> +					opts[OPT_N].subopt_params[N_FTYPE].value =
> +							sb_feat.dirftype;
>  					break;
>  				default:
>  					unknown('n', value);
> @@ -1895,23 +2009,33 @@ main(
>  				case R_EXTSIZE:
>  					rtextbytes = getnum(value, &opts[OPT_R],
>  								R_EXTSIZE);
> +					opts[OPT_R].subopt_params[R_EXTSIZE].value =
> +							rtextbytes;
>  					break;
>  				case R_FILE:
>  					xi.risfile = getnum(value, &opts[OPT_R],
>  							    R_FILE);
> +					opts[OPT_R].subopt_params[R_FILE].value =
> +							xi.risfile;
>  					break;
>  				case R_NAME:
>  				case R_DEV:
>  					xi.rtname = getstr(value, &opts[OPT_R],
>  							   R_NAME);
> +					opts[OPT_R].subopt_params[R_NAME].value = 1;
> +					opts[OPT_R].subopt_params[R_DEV].value = 1;
>  					break;
>  				case R_SIZE:
>  					rtbytes = getnum(value, &opts[OPT_R],
>  								R_SIZE);
> +					opts[OPT_R].subopt_params[R_SIZE].value =
> +							rtbytes;
>  					break;
>  				case R_NOALIGN:
>  					norsflag = getnum(value, &opts[OPT_R],
>  								R_NOALIGN);
> +					opts[OPT_R].subopt_params[R_NOALIGN].value =
> +							norsflag;
>  					break;
>  				default:
>  					unknown('r', value);
> @@ -1936,6 +2060,10 @@ main(
>  					sectorsize = 1 << sectorlog;
>  					lsectorsize = sectorsize;
>  					lslflag = slflag = 1;
> +					opts[OPT_S].subopt_params[S_LOG].value =
> +							sectorsize;
> +					opts[OPT_S].subopt_params[S_SECTLOG].value =
> +							sectorsize;
>  					break;
>  				case S_SIZE:
>  				case S_SECTSIZE:
> @@ -1949,6 +2077,10 @@ main(
>  						libxfs_highbit32(sectorsize);
>  					lsectorlog = sectorlog;
>  					lssflag = ssflag = 1;
> +					opts[OPT_S].subopt_params[S_SIZE].value =
> +							sectorlog;
> +					opts[OPT_S].subopt_params[S_SECTSIZE].value =
> +							sectorlog;
>  					break;
>  				default:
>  					unknown('s', value);
> -- 
> 2.8.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jan Tulak Jan. 16, 2017, 12:42 p.m. UTC | #2
On Fri, Jan 13, 2017 at 5:55 PM, Bill O'Donnell <billodo@redhat.com> wrote:
> On Wed, Dec 07, 2016 at 02:27:10PM +0100, Jan Tulak wrote:
>> Add a new field int opt_params - value, which is filled with user input.
>>
>> Signed-off-by: Jan Tulak <jtulak@redhat.com>
>
> Despite a very minor whitespace issue...
>
> Reviewed-by: Bill O'Donnell <billodo@redhat.com>
>

Whitespace fixed. Thanks for the review. :-)
diff mbox

Patch

diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index 372c620..edcfdc0 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -115,6 +115,12 @@  unsigned int		sectorsize;
  *     sets what is used with simple specifying the subopt (-d file).
  *     A special SUBOPT_NEEDS_VAL can be used to require a user-given
  *     value in any case.
+ *
+ *   value INTERNAL
+ *     Do not set this on initialization. Use defaultval for what you want
+ *     to do. This is filled with user input and anything you write here now
+ *     is overwritten. (If the user input is a string and not a number, this
+ *     value is set to a positive non-zero number.)
  */
 struct opt_params {
 	int		index;
@@ -131,6 +137,7 @@  struct opt_params {
 		long long	minval;
 		long long	maxval;
 		long long	defaultval;
+		long long	value;
 	}		subopt_params[MAX_SUBOPTS];
 } opts[MAX_OPTS] = {
 #define OPT_B	0
@@ -1566,12 +1573,20 @@  main(
 								B_LOG);
 					blocksize = 1 << blocklog;
 					blflag = 1;
+					opts[OPT_B].subopt_params[B_LOG].value =
+							blocklog;
+					opts[OPT_B].subopt_params[B_SIZE].value =
+							blocksize;
 					break;
 				case B_SIZE:
 					blocksize = getnum(value, &opts[OPT_B],
 							   B_SIZE);
 					blocklog = libxfs_highbit32(blocksize);
 					bsflag = 1;
+					opts[OPT_B].subopt_params[B_LOG].value =
+							blocklog;
+					opts[OPT_B].subopt_params[B_SIZE].value =
+							blocksize;
 					break;
 				default:
 					unknown('b', value);
@@ -1589,47 +1604,70 @@  main(
 					agcount = getnum(value, &opts[OPT_D],
 							 D_AGCOUNT);
 					daflag = 1;
+					opts[OPT_D].subopt_params[D_AGCOUNT].value =
+							agcount;
 					break;
 				case D_AGSIZE:
 					agsize = getnum(value, &opts[OPT_D],
 								D_AGSIZE);
 					dasize = 1;
+					opts[OPT_D].subopt_params[D_AGSIZE].value =
+							agsize;
 					break;
 				case D_FILE:
 					xi.disfile = getnum(value, &opts[OPT_D],
 							    D_FILE);
+					opts[OPT_D].subopt_params[D_FILE].value =
+							xi.disfile;
 					break;
 				case D_NAME:
 					xi.dname = getstr(value, &opts[OPT_D],
 								D_NAME);
+					opts[OPT_D].subopt_params[D_NAME].value = 1;
 					break;
 				case D_SIZE:
 					dbytes = getnum(value, &opts[OPT_D],
 								D_SIZE);
+					opts[OPT_D].subopt_params[D_SIZE].value =
+							dbytes;
 					break;
 				case D_SUNIT:
 					dsunit = getnum(value, &opts[OPT_D],
 								D_SUNIT);
+					opts[OPT_D].subopt_params[D_SUNIT].value =
+							dsunit;
 					break;
 				case D_SWIDTH:
 					dswidth = getnum(value, &opts[OPT_D],
 							 D_SWIDTH);
+					opts[OPT_D].subopt_params[D_SWIDTH].value =
+							dswidth;
 					break;
 				case D_SU:
 					dsu = getnum(value, &opts[OPT_D], D_SU);
+					opts[OPT_D].subopt_params[D_SU].value =
+							dsu;
 					break;
 				case D_SW:
 					dsw = getnum(value, &opts[OPT_D], D_SW);
+					opts[OPT_D].subopt_params[D_SW].value =
+							dsw;
 					break;
 				case D_NOALIGN:
 					nodsflag = getnum(value, &opts[OPT_D],
 								D_NOALIGN);
+					opts[OPT_D].subopt_params[D_NOALIGN].value =
+							nodsflag;
 					break;
 				case D_SECTLOG:
 					sectorlog = getnum(value, &opts[OPT_D],
 							   D_SECTLOG);
 					sectorsize = 1 << sectorlog;
 					slflag = 1;
+					opts[OPT_D].subopt_params[D_SECTSIZE].value =
+							sectorsize;
+					opts[OPT_D].subopt_params[D_SECTLOG].value =
+							sectorlog;
 					break;
 				case D_SECTSIZE:
 					sectorsize = getnum(value, &opts[OPT_D],
@@ -1637,6 +1675,10 @@  main(
 					sectorlog =
 						libxfs_highbit32(sectorsize);
 					ssflag = 1;
+					opts[OPT_D].subopt_params[D_SECTSIZE].value =
+							sectorsize;
+					opts[OPT_D].subopt_params[D_SECTLOG].value =
+							sectorlog;
 					break;
 				case D_RTINHERIT:
 					c = getnum(value, &opts[OPT_D],
@@ -1644,18 +1686,24 @@  main(
 					if (c)
 						fsx.fsx_xflags |=
 							XFS_DIFLAG_RTINHERIT;
+					opts[OPT_D].subopt_params[D_RTINHERIT].value =
+							c;
 					break;
 				case D_PROJINHERIT:
 					fsx.fsx_projid = getnum(value, &opts[OPT_D],
 								D_PROJINHERIT);
 					fsx.fsx_xflags |=
 						XFS_DIFLAG_PROJINHERIT;
+					opts[OPT_D].subopt_params[D_PROJINHERIT].value =
+							fsx.fsx_projid;
 					break;
 				case D_EXTSZINHERIT:
 					fsx.fsx_extsize = getnum(value, &opts[OPT_D],
 								 D_EXTSZINHERIT);
 					fsx.fsx_xflags |=
 						XFS_DIFLAG_EXTSZINHERIT;
+					opts[OPT_D].subopt_params[D_EXTSZINHERIT].value =
+							fsx.fsx_extsize;
 					break;
 				default:
 					unknown('d', value);
@@ -1673,43 +1721,64 @@  main(
 					sb_feat.inode_align = getnum(value,
 								&opts[OPT_I],
 								I_ALIGN);
+					opts[OPT_I].subopt_params[I_ALIGN].value =
+							sb_feat.inode_align;
 					break;
 				case I_LOG:
 					inodelog = getnum(value, &opts[OPT_I],
 								I_LOG);
 					isize = 1 << inodelog;
 					ilflag = 1;
+					opts[OPT_I].subopt_params[I_SIZE].value =
+							isize;
+					opts[OPT_I].subopt_params[I_LOG].value =
+							inodelog;
 					break;
 				case I_MAXPCT:
 					imaxpct = getnum(value, &opts[OPT_I],
 							 I_MAXPCT);
 					imflag = 1;
+					opts[OPT_I].subopt_params[I_MAXPCT].value =
+							imaxpct;
 					break;
 				case I_PERBLOCK:
 					inopblock = getnum(value, &opts[OPT_I],
 							   I_PERBLOCK);
 					ipflag = 1;
+					opts[OPT_I].subopt_params[I_PERBLOCK].value =
+							inopblock;
 					break;
 				case I_SIZE:
 					isize = getnum(value, &opts[OPT_I],
 								I_SIZE);
 					inodelog = libxfs_highbit32(isize);
 					isflag = 1;
+					opts[OPT_I].subopt_params[I_SIZE].value =
+							isize;
+					opts[OPT_I].subopt_params[I_LOG].value =
+							inodelog;
 					break;
 				case I_ATTR:
 					sb_feat.attr_version =
+
 						getnum(value, &opts[OPT_I],
 								I_ATTR);
+					opts[OPT_I].subopt_params[I_ATTR].value =
+							sb_feat.attr_version;
 					break;
 				case I_PROJID32BIT:
 					sb_feat.projid16bit =
 						!getnum(value, &opts[OPT_I],
 							I_PROJID32BIT);
+					opts[OPT_I].subopt_params[I_PROJID32BIT].value =
+							sb_feat.projid16bit;
 					break;
 				case I_SPINODES:
 					sb_feat.spinodes = getnum(value,
 								&opts[OPT_I],
 								I_SPINODES);
+					opts[OPT_I].subopt_params[I_SPINODES].value =
+							sb_feat.spinodes;
 					break;
 				default:
 					unknown('i', value);
@@ -1727,24 +1796,34 @@  main(
 					logagno = getnum(value, &opts[OPT_L],
 								L_AGNUM);
 					laflag = 1;
+					opts[OPT_L].subopt_params[L_AGNUM].value =
+							logagno;
 					break;
 				case L_FILE:
 					xi.lisfile = getnum(value, &opts[OPT_L],
 							    L_FILE);
+					opts[OPT_L].subopt_params[L_FILE].value =
+							xi.lisfile;
 					break;
 				case L_INTERNAL:
 					loginternal = getnum(value, &opts[OPT_L],
 							     L_INTERNAL);
 					liflag = 1;
+					opts[OPT_L].subopt_params[L_INTERNAL].value =
+							loginternal;
 					break;
 				case L_SU:
 					lsu = getnum(value, &opts[OPT_L], L_SU);
 					lsuflag = 1;
+					opts[OPT_L].subopt_params[L_SU].value =
+							lsu;
 					break;
 				case L_SUNIT:
 					lsunit = getnum(value, &opts[OPT_L],
 								L_SUNIT);
 					lsunitflag = 1;
+					opts[OPT_L].subopt_params[L_SUNIT].value =
+							lsunit;
 					break;
 				case L_NAME:
 				case L_DEV:
@@ -1753,22 +1832,32 @@  main(
 					xi.logname = logfile;
 					ldflag = 1;
 					loginternal = 0;
+					opts[OPT_L].subopt_params[L_NAME].value = 1;
+					opts[OPT_L].subopt_params[L_DEV].value = 1;
 					break;
 				case L_VERSION:
 					sb_feat.log_version =
 						getnum(value, &opts[OPT_L],
 								L_VERSION);
 					lvflag = 1;
+					opts[OPT_L].subopt_params[L_VERSION].value =
+							sb_feat.log_version;
 					break;
 				case L_SIZE:
 					logbytes = getnum(value, &opts[OPT_L],
 								L_SIZE);
+					opts[OPT_L].subopt_params[L_SIZE].value =
+							logbytes;
 					break;
 				case L_SECTLOG:
 					lsectorlog = getnum(value, &opts[OPT_L],
 							    L_SECTLOG);
 					lsectorsize = 1 << lsectorlog;
 					lslflag = 1;
+					opts[OPT_L].subopt_params[L_SECTSIZE].value =
+							lsectorsize;
+					opts[OPT_L].subopt_params[L_SECTLOG].value =
+							lsectorlog;
 					break;
 				case L_SECTSIZE:
 					lsectorsize = getnum(value, &opts[OPT_L],
@@ -1776,11 +1865,17 @@  main(
 					lsectorlog =
 						libxfs_highbit32(lsectorsize);
 					lssflag = 1;
+					opts[OPT_L].subopt_params[L_SECTSIZE].value =
+							lsectorsize;
+					opts[OPT_L].subopt_params[L_SECTLOG].value =
+							lsectorlog;
 					break;
 				case L_LAZYSBCNTR:
 					sb_feat.lazy_sb_counters =
 							getnum(value, &opts[OPT_L],
 							       L_LAZYSBCNTR);
+					opts[OPT_L].subopt_params[L_LAZYSBCNTR].value =
+							sb_feat.lazy_sb_counters;
 					break;
 				default:
 					unknown('l', value);
@@ -1805,20 +1900,27 @@  main(
 								M_CRC);
 					if (sb_feat.crcs_enabled)
 						sb_feat.dirftype = true;
+					opts[OPT_M].subopt_params[M_CRC].value =
+							sb_feat.crcs_enabled;
 					break;
 				case M_FINOBT:
 					sb_feat.finobt = getnum(
 						value, &opts[OPT_M], M_FINOBT);
+					opts[OPT_M].subopt_params[M_FINOBT].value =
+							sb_feat.finobt;
 					break;
 				case M_UUID:
 					if (!value || *value == '\0')
 						reqval('m', subopts, M_UUID);
 					if (platform_uuid_parse(value, &uuid))
 						illegal(optarg, "m uuid");
+					opts[OPT_M].subopt_params[M_UUID].value = 1;
 					break;
 				case M_RMAPBT:
 					sb_feat.rmapbt = getnum(
 						value, &opts[OPT_M], M_RMAPBT);
+					opts[OPT_M].subopt_params[M_RMAPBT].value = 
+						sb_feat.rmapbt;
 					break;
 				case M_REFLINK:
 					sb_feat.reflink = getnum(
@@ -1841,6 +1943,10 @@  main(
 							     N_LOG);
 					dirblocksize = 1 << dirblocklog;
 					nlflag = 1;
+					opts[OPT_N].subopt_params[N_SIZE].value =
+							dirblocksize;
+					opts[OPT_N].subopt_params[N_LOG].value =
+							dirblocklog;
 					break;
 				case N_SIZE:
 					dirblocksize = getnum(value, &opts[OPT_N],
@@ -1848,6 +1954,10 @@  main(
 					dirblocklog =
 						libxfs_highbit32(dirblocksize);
 					nsflag = 1;
+					opts[OPT_N].subopt_params[N_SIZE].value =
+							dirblocksize;
+					opts[OPT_N].subopt_params[N_LOG].value =
+							dirblocklog;
 					break;
 				case N_VERSION:
 					value = getstr(value, &opts[OPT_N],
@@ -1861,10 +1971,14 @@  main(
 							       N_VERSION);
 					}
 					nvflag = 1;
+					opts[OPT_N].subopt_params[N_VERSION].value =
+							sb_feat.dir_version;
 					break;
 				case N_FTYPE:
 					sb_feat.dirftype = getnum(value, &opts[OPT_N],
 								  N_FTYPE);
+					opts[OPT_N].subopt_params[N_FTYPE].value =
+							sb_feat.dirftype;
 					break;
 				default:
 					unknown('n', value);
@@ -1895,23 +2009,33 @@  main(
 				case R_EXTSIZE:
 					rtextbytes = getnum(value, &opts[OPT_R],
 								R_EXTSIZE);
+					opts[OPT_R].subopt_params[R_EXTSIZE].value =
+							rtextbytes;
 					break;
 				case R_FILE:
 					xi.risfile = getnum(value, &opts[OPT_R],
 							    R_FILE);
+					opts[OPT_R].subopt_params[R_FILE].value =
+							xi.risfile;
 					break;
 				case R_NAME:
 				case R_DEV:
 					xi.rtname = getstr(value, &opts[OPT_R],
 							   R_NAME);
+					opts[OPT_R].subopt_params[R_NAME].value = 1;
+					opts[OPT_R].subopt_params[R_DEV].value = 1;
 					break;
 				case R_SIZE:
 					rtbytes = getnum(value, &opts[OPT_R],
 								R_SIZE);
+					opts[OPT_R].subopt_params[R_SIZE].value =
+							rtbytes;
 					break;
 				case R_NOALIGN:
 					norsflag = getnum(value, &opts[OPT_R],
 								R_NOALIGN);
+					opts[OPT_R].subopt_params[R_NOALIGN].value =
+							norsflag;
 					break;
 				default:
 					unknown('r', value);
@@ -1936,6 +2060,10 @@  main(
 					sectorsize = 1 << sectorlog;
 					lsectorsize = sectorsize;
 					lslflag = slflag = 1;
+					opts[OPT_S].subopt_params[S_LOG].value =
+							sectorsize;
+					opts[OPT_S].subopt_params[S_SECTLOG].value =
+							sectorsize;
 					break;
 				case S_SIZE:
 				case S_SECTSIZE:
@@ -1949,6 +2077,10 @@  main(
 						libxfs_highbit32(sectorsize);
 					lsectorlog = sectorlog;
 					lssflag = ssflag = 1;
+					opts[OPT_S].subopt_params[S_SIZE].value =
+							sectorlog;
+					opts[OPT_S].subopt_params[S_SECTSIZE].value =
+							sectorlog;
 					break;
 				default:
 					unknown('s', value);