diff mbox

[RFC,1/1] xfsprogs: add inode inline data support

Message ID 1530846750-6686-10-git-send-email-shan.hai@oracle.com (mailing list archive)
State New, archived
Headers show

Commit Message

Shan Hai July 6, 2018, 3:12 a.m. UTC
Add a new mkfs command line option to enable the inode inline data
feature. The mkfs set a bit in the superblock to notify the kernel
that the data inlining is enabled, there is no extra options for
mount.

Signed-off-by: Shan Hai <shan.hai@oracle.com>
---
 growfs/xfs_growfs.c | 14 +++++++++-----
 libxfs/xfs_format.h |  4 +++-
 libxfs/xfs_fs.h     |  1 +
 mkfs/xfs_mkfs.c     | 20 +++++++++++++++++---
 4 files changed, 30 insertions(+), 9 deletions(-)

Comments

Darrick J. Wong July 6, 2018, 3:35 a.m. UTC | #1
On Fri, Jul 06, 2018 at 11:12:30AM +0800, Shan Hai wrote:
> Add a new mkfs command line option to enable the inode inline data
> feature. The mkfs set a bit in the superblock to notify the kernel
> that the data inlining is enabled, there is no extra options for
> mount.
> 
> Signed-off-by: Shan Hai <shan.hai@oracle.com>
> ---
>  growfs/xfs_growfs.c | 14 +++++++++-----
>  libxfs/xfs_format.h |  4 +++-
>  libxfs/xfs_fs.h     |  1 +
>  mkfs/xfs_mkfs.c     | 20 +++++++++++++++++---
>  4 files changed, 30 insertions(+), 9 deletions(-)
> 
> diff --git a/growfs/xfs_growfs.c b/growfs/xfs_growfs.c
> index 366176b7..a370bf9d 100644
> --- a/growfs/xfs_growfs.c
> +++ b/growfs/xfs_growfs.c
> @@ -60,13 +60,14 @@ report_info(
>  	int		finobt_enabled,
>  	int		spinodes,
>  	int		rmapbt_enabled,
> -	int		reflink_enabled)
> +	int		reflink_enabled,
> +	int		inlinedata_enabled)
>  {
>  	printf(_(
>  	    "meta-data=%-22s isize=%-6u agcount=%u, agsize=%u blks\n"
>  	    "         =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n"
>  	    "         =%-22s crc=%-8u finobt=%u spinodes=%u rmapbt=%u\n"
> -	    "         =%-22s reflink=%u\n"
> +	    "         =%-22s reflink=%u inline=%u\n"

I coulda sworn we refactored this into a library function...

Do xfs_db or xfs_repair require any changes?

Did xfstests have anything exciting to say about this feature?

--D

>  	    "data     =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n"
>  	    "         =%-22s sunit=%-6u swidth=%u blks\n"
>  	    "naming   =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n"
> @@ -77,7 +78,7 @@ report_info(
>  		mntpoint, geo.inodesize, geo.agcount, geo.agblocks,
>  		"", geo.sectsize, attrversion, projid32bit,
>  		"", crcs_enabled, finobt_enabled, spinodes, rmapbt_enabled,
> -		"", reflink_enabled,
> +		"", reflink_enabled, inlinedata_enabled,
>  		"", geo.blocksize, (unsigned long long)geo.datablocks,
>  			geo.imaxpct,
>  		"", geo.sunit, geo.swidth,
> @@ -133,6 +134,7 @@ main(int argc, char **argv)
>  	int			spinodes;
>  	int			rmapbt_enabled;
>  	int			reflink_enabled;
> +	int			inlinedata_enabled;
>  	char			rpath[PATH_MAX];
>  
>  	progname = basename(argv[0]);
> @@ -266,12 +268,14 @@ main(int argc, char **argv)
>  	spinodes = geo.flags & XFS_FSOP_GEOM_FLAGS_SPINODES ? 1 : 0;
>  	rmapbt_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_RMAPBT ? 1 : 0;
>  	reflink_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_REFLINK ? 1 : 0;
> +	inlinedata_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_INLINE ? 1 : 0;
>  	if (nflag) {
>  		report_info(geo, datadev, isint, logdev, rtdev,
>  				lazycount, dirversion, logversion,
>  				attrversion, projid32bit, crcs_enabled, ci,
>  				ftype_enabled, finobt_enabled, spinodes,
> -				rmapbt_enabled, reflink_enabled);
> +				rmapbt_enabled, reflink_enabled,
> +				inlinedata_enabled);
>  		exit(0);
>  	}
>  
> @@ -310,7 +314,7 @@ main(int argc, char **argv)
>  			lazycount, dirversion, logversion,
>  			attrversion, projid32bit, crcs_enabled, ci, ftype_enabled,
>  			finobt_enabled, spinodes, rmapbt_enabled,
> -			reflink_enabled);
> +			reflink_enabled, inlinedata_enabled);
>  
>  	ddsize = xi.dsize;
>  	dlsize = ( xi.logBBsize? xi.logBBsize :
> diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h
> index 48548933..2a765d12 100644
> --- a/libxfs/xfs_format.h
> +++ b/libxfs/xfs_format.h
> @@ -478,10 +478,12 @@ xfs_sb_has_ro_compat_feature(
>  #define XFS_SB_FEAT_INCOMPAT_FTYPE	(1 << 0)	/* filetype in dirent */
>  #define XFS_SB_FEAT_INCOMPAT_SPINODES	(1 << 1)	/* sparse inode chunks */
>  #define XFS_SB_FEAT_INCOMPAT_META_UUID	(1 << 2)	/* metadata UUID */
> +#define XFS_SB_FEAT_INCOMPAT_INLINEDATA	(1 << 3)	/* inline inode data */
>  #define XFS_SB_FEAT_INCOMPAT_ALL \
>  		(XFS_SB_FEAT_INCOMPAT_FTYPE|	\
>  		 XFS_SB_FEAT_INCOMPAT_SPINODES|	\
> -		 XFS_SB_FEAT_INCOMPAT_META_UUID)
> +		 XFS_SB_FEAT_INCOMPAT_META_UUID| \
> +		 XFS_SB_FEAT_INCOMPAT_INLINEDATA)
>  
>  #define XFS_SB_FEAT_INCOMPAT_UNKNOWN	~XFS_SB_FEAT_INCOMPAT_ALL
>  static inline bool
> diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h
> index 86a379f6..40737fb9 100644
> --- a/libxfs/xfs_fs.h
> +++ b/libxfs/xfs_fs.h
> @@ -243,6 +243,7 @@ typedef struct xfs_fsop_resblks {
>  #define XFS_FSOP_GEOM_FLAGS_SPINODES	0x40000	/* sparse inode chunks	*/
>  #define XFS_FSOP_GEOM_FLAGS_RMAPBT	0x80000	/* reverse mapping btree */
>  #define XFS_FSOP_GEOM_FLAGS_REFLINK	0x100000 /* files can share blocks */
> +#define XFS_FSOP_GEOM_FLAGS_INLINE	0x200000 /* inline data into inode */
>  
>  /*
>   * Minimum and maximum sizes need for growth checks.
> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
> index 78d0ce5d..b321761b 100644
> --- a/mkfs/xfs_mkfs.c
> +++ b/mkfs/xfs_mkfs.c
> @@ -82,6 +82,7 @@ enum {
>  	I_ATTR,
>  	I_PROJID32BIT,
>  	I_SPINODES,
> +	I_INLINE,
>  	I_MAX_OPTS,
>  };
>  
> @@ -394,6 +395,7 @@ struct opt_params iopts = {
>  		[I_ATTR] = "attr",
>  		[I_PROJID32BIT] = "projid32bit",
>  		[I_SPINODES] = "sparse",
> +		[I_INLINE] = "inline",
>  	},
>  	.subopt_params = {
>  		{ .index = I_ALIGN,
> @@ -442,6 +444,12 @@ struct opt_params iopts = {
>  		  .maxval = 1,
>  		  .defaultval = 1,
>  		},
> +		{ .index = I_INLINE,
> +		  .conflicts = { { NULL, LAST_CONFLICT } },
> +		  .minval = 0,
> +		  .maxval = 1,
> +		  .defaultval = 0,
> +		},
>  	},
>  };
>  
> @@ -743,6 +751,7 @@ struct sb_feat_args {
>  	bool	spinodes;		/* XFS_SB_FEAT_INCOMPAT_SPINODES */
>  	bool	rmapbt;			/* XFS_SB_FEAT_RO_COMPAT_RMAPBT */
>  	bool	reflink;		/* XFS_SB_FEAT_RO_COMPAT_REFLINK */
> +	bool	inlinedata;		/* XFS_SB_FEAT_INCOMPAT_INLINEDATA */
>  	bool	nodalign;
>  	bool	nortalign;
>  };
> @@ -871,7 +880,7 @@ usage( void )
>  			    sectsize=num\n\
>  /* force overwrite */	[-f]\n\
>  /* inode size */	[-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2,\n\
> -			    projid32bit=0|1,sparse=0|1]\n\
> +			    projid32bit=0|1,sparse=0|1,inline=0|1]\n\
>  /* no discard */	[-K]\n\
>  /* log subvol */	[-l agnum=n,internal,size=num,logdev=xxx,version=n\n\
>  			    sunit=value|su=num,sectsize=num,lazy-count=0|1]\n\
> @@ -1506,6 +1515,9 @@ inode_opts_parser(
>  	case I_SPINODES:
>  		cli->sb_feat.spinodes = getnum(value, opts, subopt);
>  		break;
> +	case I_INLINE:
> +		cli->sb_feat.inlinedata = getnum(value, opts, subopt);
> +		break;
>  	default:
>  		return -EINVAL;
>  	}
> @@ -2903,6 +2915,8 @@ sb_set_features(
>  		sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_SPINODES;
>  	}
>  
> +	if (fp->inlinedata)
> +		sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_INLINEDATA;
>  }
>  
>  /*
> @@ -3184,7 +3198,7 @@ print_mkfs_cfg(
>  	printf(_(
>  "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n"
>  "         =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n"
> -"         =%-22s crc=%-8u finobt=%u, sparse=%u, rmapbt=%u, reflink=%u\n"
> +"         =%-22s crc=%-8u finobt=%u, sparse=%u, rmapbt=%u, reflink=%u, inline=%u\n"
>  "data     =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n"
>  "         =%-22s sunit=%-6u swidth=%u blks\n"
>  "naming   =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n"
> @@ -3195,7 +3209,7 @@ print_mkfs_cfg(
>  			(long long)cfg->agsize,
>  		"", cfg->sectorsize, fp->attr_version, fp->projid32bit,
>  		"", fp->crcs_enabled, fp->finobt, fp->spinodes, fp->rmapbt,
> -			fp->reflink,
> +			fp->reflink, fp->inlinedata,
>  		"", cfg->blocksize, (long long)cfg->dblocks, cfg->imaxpct,
>  		"", cfg->dsunit, cfg->dswidth,
>  		fp->dir_version, cfg->dirblocksize, fp->nci, fp->dirftype,
> -- 
> 2.11.0
> 
> --
> 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
Eric Sandeen July 6, 2018, 7:14 p.m. UTC | #2
On 7/5/18 10:35 PM, Darrick J. Wong wrote:
> On Fri, Jul 06, 2018 at 11:12:30AM +0800, Shan Hai wrote:
>> Add a new mkfs command line option to enable the inode inline data
>> feature. The mkfs set a bit in the superblock to notify the kernel
>> that the data inlining is enabled, there is no extra options for
>> mount.
>>
>> Signed-off-by: Shan Hai <shan.hai@oracle.com>
>> ---
>>  growfs/xfs_growfs.c | 14 +++++++++-----
>>  libxfs/xfs_format.h |  4 +++-
>>  libxfs/xfs_fs.h     |  1 +
>>  mkfs/xfs_mkfs.c     | 20 +++++++++++++++++---
>>  4 files changed, 30 insertions(+), 9 deletions(-)
>>
>> diff --git a/growfs/xfs_growfs.c b/growfs/xfs_growfs.c
>> index 366176b7..a370bf9d 100644
>> --- a/growfs/xfs_growfs.c
>> +++ b/growfs/xfs_growfs.c
>> @@ -60,13 +60,14 @@ report_info(
>>  	int		finobt_enabled,
>>  	int		spinodes,
>>  	int		rmapbt_enabled,
>> -	int		reflink_enabled)
>> +	int		reflink_enabled,
>> +	int		inlinedata_enabled)
>>  {
>>  	printf(_(
>>  	    "meta-data=%-22s isize=%-6u agcount=%u, agsize=%u blks\n"
>>  	    "         =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n"
>>  	    "         =%-22s crc=%-8u finobt=%u spinodes=%u rmapbt=%u\n"
>> -	    "         =%-22s reflink=%u\n"
>> +	    "         =%-22s reflink=%u inline=%u\n"
> I coulda sworn we refactored this into a library function...

We did, and it's in 4.17.0 now.

On the next version please rebase this to whatever's in the xfsprogs for-next
branch at the time, that's where all the action is.  :)

Thanks,
-Eric
--
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
diff mbox

Patch

diff --git a/growfs/xfs_growfs.c b/growfs/xfs_growfs.c
index 366176b7..a370bf9d 100644
--- a/growfs/xfs_growfs.c
+++ b/growfs/xfs_growfs.c
@@ -60,13 +60,14 @@  report_info(
 	int		finobt_enabled,
 	int		spinodes,
 	int		rmapbt_enabled,
-	int		reflink_enabled)
+	int		reflink_enabled,
+	int		inlinedata_enabled)
 {
 	printf(_(
 	    "meta-data=%-22s isize=%-6u agcount=%u, agsize=%u blks\n"
 	    "         =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n"
 	    "         =%-22s crc=%-8u finobt=%u spinodes=%u rmapbt=%u\n"
-	    "         =%-22s reflink=%u\n"
+	    "         =%-22s reflink=%u inline=%u\n"
 	    "data     =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n"
 	    "         =%-22s sunit=%-6u swidth=%u blks\n"
 	    "naming   =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n"
@@ -77,7 +78,7 @@  report_info(
 		mntpoint, geo.inodesize, geo.agcount, geo.agblocks,
 		"", geo.sectsize, attrversion, projid32bit,
 		"", crcs_enabled, finobt_enabled, spinodes, rmapbt_enabled,
-		"", reflink_enabled,
+		"", reflink_enabled, inlinedata_enabled,
 		"", geo.blocksize, (unsigned long long)geo.datablocks,
 			geo.imaxpct,
 		"", geo.sunit, geo.swidth,
@@ -133,6 +134,7 @@  main(int argc, char **argv)
 	int			spinodes;
 	int			rmapbt_enabled;
 	int			reflink_enabled;
+	int			inlinedata_enabled;
 	char			rpath[PATH_MAX];
 
 	progname = basename(argv[0]);
@@ -266,12 +268,14 @@  main(int argc, char **argv)
 	spinodes = geo.flags & XFS_FSOP_GEOM_FLAGS_SPINODES ? 1 : 0;
 	rmapbt_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_RMAPBT ? 1 : 0;
 	reflink_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_REFLINK ? 1 : 0;
+	inlinedata_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_INLINE ? 1 : 0;
 	if (nflag) {
 		report_info(geo, datadev, isint, logdev, rtdev,
 				lazycount, dirversion, logversion,
 				attrversion, projid32bit, crcs_enabled, ci,
 				ftype_enabled, finobt_enabled, spinodes,
-				rmapbt_enabled, reflink_enabled);
+				rmapbt_enabled, reflink_enabled,
+				inlinedata_enabled);
 		exit(0);
 	}
 
@@ -310,7 +314,7 @@  main(int argc, char **argv)
 			lazycount, dirversion, logversion,
 			attrversion, projid32bit, crcs_enabled, ci, ftype_enabled,
 			finobt_enabled, spinodes, rmapbt_enabled,
-			reflink_enabled);
+			reflink_enabled, inlinedata_enabled);
 
 	ddsize = xi.dsize;
 	dlsize = ( xi.logBBsize? xi.logBBsize :
diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h
index 48548933..2a765d12 100644
--- a/libxfs/xfs_format.h
+++ b/libxfs/xfs_format.h
@@ -478,10 +478,12 @@  xfs_sb_has_ro_compat_feature(
 #define XFS_SB_FEAT_INCOMPAT_FTYPE	(1 << 0)	/* filetype in dirent */
 #define XFS_SB_FEAT_INCOMPAT_SPINODES	(1 << 1)	/* sparse inode chunks */
 #define XFS_SB_FEAT_INCOMPAT_META_UUID	(1 << 2)	/* metadata UUID */
+#define XFS_SB_FEAT_INCOMPAT_INLINEDATA	(1 << 3)	/* inline inode data */
 #define XFS_SB_FEAT_INCOMPAT_ALL \
 		(XFS_SB_FEAT_INCOMPAT_FTYPE|	\
 		 XFS_SB_FEAT_INCOMPAT_SPINODES|	\
-		 XFS_SB_FEAT_INCOMPAT_META_UUID)
+		 XFS_SB_FEAT_INCOMPAT_META_UUID| \
+		 XFS_SB_FEAT_INCOMPAT_INLINEDATA)
 
 #define XFS_SB_FEAT_INCOMPAT_UNKNOWN	~XFS_SB_FEAT_INCOMPAT_ALL
 static inline bool
diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h
index 86a379f6..40737fb9 100644
--- a/libxfs/xfs_fs.h
+++ b/libxfs/xfs_fs.h
@@ -243,6 +243,7 @@  typedef struct xfs_fsop_resblks {
 #define XFS_FSOP_GEOM_FLAGS_SPINODES	0x40000	/* sparse inode chunks	*/
 #define XFS_FSOP_GEOM_FLAGS_RMAPBT	0x80000	/* reverse mapping btree */
 #define XFS_FSOP_GEOM_FLAGS_REFLINK	0x100000 /* files can share blocks */
+#define XFS_FSOP_GEOM_FLAGS_INLINE	0x200000 /* inline data into inode */
 
 /*
  * Minimum and maximum sizes need for growth checks.
diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index 78d0ce5d..b321761b 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -82,6 +82,7 @@  enum {
 	I_ATTR,
 	I_PROJID32BIT,
 	I_SPINODES,
+	I_INLINE,
 	I_MAX_OPTS,
 };
 
@@ -394,6 +395,7 @@  struct opt_params iopts = {
 		[I_ATTR] = "attr",
 		[I_PROJID32BIT] = "projid32bit",
 		[I_SPINODES] = "sparse",
+		[I_INLINE] = "inline",
 	},
 	.subopt_params = {
 		{ .index = I_ALIGN,
@@ -442,6 +444,12 @@  struct opt_params iopts = {
 		  .maxval = 1,
 		  .defaultval = 1,
 		},
+		{ .index = I_INLINE,
+		  .conflicts = { { NULL, LAST_CONFLICT } },
+		  .minval = 0,
+		  .maxval = 1,
+		  .defaultval = 0,
+		},
 	},
 };
 
@@ -743,6 +751,7 @@  struct sb_feat_args {
 	bool	spinodes;		/* XFS_SB_FEAT_INCOMPAT_SPINODES */
 	bool	rmapbt;			/* XFS_SB_FEAT_RO_COMPAT_RMAPBT */
 	bool	reflink;		/* XFS_SB_FEAT_RO_COMPAT_REFLINK */
+	bool	inlinedata;		/* XFS_SB_FEAT_INCOMPAT_INLINEDATA */
 	bool	nodalign;
 	bool	nortalign;
 };
@@ -871,7 +880,7 @@  usage( void )
 			    sectsize=num\n\
 /* force overwrite */	[-f]\n\
 /* inode size */	[-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2,\n\
-			    projid32bit=0|1,sparse=0|1]\n\
+			    projid32bit=0|1,sparse=0|1,inline=0|1]\n\
 /* no discard */	[-K]\n\
 /* log subvol */	[-l agnum=n,internal,size=num,logdev=xxx,version=n\n\
 			    sunit=value|su=num,sectsize=num,lazy-count=0|1]\n\
@@ -1506,6 +1515,9 @@  inode_opts_parser(
 	case I_SPINODES:
 		cli->sb_feat.spinodes = getnum(value, opts, subopt);
 		break;
+	case I_INLINE:
+		cli->sb_feat.inlinedata = getnum(value, opts, subopt);
+		break;
 	default:
 		return -EINVAL;
 	}
@@ -2903,6 +2915,8 @@  sb_set_features(
 		sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_SPINODES;
 	}
 
+	if (fp->inlinedata)
+		sbp->sb_features_incompat |= XFS_SB_FEAT_INCOMPAT_INLINEDATA;
 }
 
 /*
@@ -3184,7 +3198,7 @@  print_mkfs_cfg(
 	printf(_(
 "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n"
 "         =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n"
-"         =%-22s crc=%-8u finobt=%u, sparse=%u, rmapbt=%u, reflink=%u\n"
+"         =%-22s crc=%-8u finobt=%u, sparse=%u, rmapbt=%u, reflink=%u, inline=%u\n"
 "data     =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n"
 "         =%-22s sunit=%-6u swidth=%u blks\n"
 "naming   =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n"
@@ -3195,7 +3209,7 @@  print_mkfs_cfg(
 			(long long)cfg->agsize,
 		"", cfg->sectorsize, fp->attr_version, fp->projid32bit,
 		"", fp->crcs_enabled, fp->finobt, fp->spinodes, fp->rmapbt,
-			fp->reflink,
+			fp->reflink, fp->inlinedata,
 		"", cfg->blocksize, (long long)cfg->dblocks, cfg->imaxpct,
 		"", cfg->dsunit, cfg->dswidth,
 		fp->dir_version, cfg->dirblocksize, fp->nci, fp->dirftype,