diff mbox

[v14,3/4] ext4: adds FS_IOC_FSSETXATTR/FS_IOC_FSGETXATTR interface support

Message ID 1429728997-21464-4-git-send-email-lixi@ddn.com (mailing list archive)
State New, archived
Headers show

Commit Message

Li Xi April 22, 2015, 6:56 p.m. UTC
This patch adds FS_IOC_FSSETXATTR/FS_IOC_FSGETXATTR ioctl interface
support for ext4. The interface is kept consistent with
XFS_IOC_FSGETXATTR/XFS_IOC_FSGETXATTR.

Signed-off-by: Li Xi <lixi@ddn.com>
---
 fs/ext4/ext4.h          |    9 ++
 fs/ext4/ioctl.c         |  367 ++++++++++++++++++++++++++++++++++++-----------
 fs/xfs/libxfs/xfs_fs.h  |   47 +++----
 include/uapi/linux/fs.h |   32 ++++
 4 files changed, 338 insertions(+), 117 deletions(-)

Comments

Jan Kara April 24, 2015, 4:40 p.m. UTC | #1
On Thu 23-04-15 03:56:36, Li Xi wrote:
> This patch adds FS_IOC_FSSETXATTR/FS_IOC_FSGETXATTR ioctl interface
> support for ext4. The interface is kept consistent with
> XFS_IOC_FSGETXATTR/XFS_IOC_FSGETXATTR.
> 
> Signed-off-by: Li Xi <lixi@ddn.com>
  The patch looks good to me. You can add:
Reviewed-by: Jan Kara <jack@suse.cz>

								Honza

> ---
>  fs/ext4/ext4.h          |    9 ++
>  fs/ext4/ioctl.c         |  367 ++++++++++++++++++++++++++++++++++++-----------
>  fs/xfs/libxfs/xfs_fs.h  |   47 +++----
>  include/uapi/linux/fs.h |   32 ++++
>  4 files changed, 338 insertions(+), 117 deletions(-)
> 
> diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
> index 0729a42..9995c53 100644
> --- a/fs/ext4/ext4.h
> +++ b/fs/ext4/ext4.h
> @@ -384,6 +384,13 @@ struct flex_groups {
>  #define EXT4_FL_USER_VISIBLE		0x304BDFFF /* User visible flags */
>  #define EXT4_FL_USER_MODIFIABLE		0x204380FF /* User modifiable flags */
>  
> +#define EXT4_FL_XFLAG_VISIBLE		(EXT4_SYNC_FL | \
> +					 EXT4_IMMUTABLE_FL | \
> +					 EXT4_APPEND_FL | \
> +					 EXT4_NODUMP_FL | \
> +					 EXT4_NOATIME_FL | \
> +					 EXT4_PROJINHERIT_FL)
> +
>  /* Flags that should be inherited by new inodes from their parent. */
>  #define EXT4_FL_INHERITED (EXT4_SECRM_FL | EXT4_UNRM_FL | EXT4_COMPR_FL |\
>  			   EXT4_SYNC_FL | EXT4_NODUMP_FL | EXT4_NOATIME_FL |\
> @@ -618,6 +625,8 @@ enum {
>  #define EXT4_IOC_SET_ENCRYPTION_POLICY	_IOR('f', 19, struct ext4_encryption_policy)
>  #define EXT4_IOC_GET_ENCRYPTION_PWSALT	_IOW('f', 20, __u8[16])
>  #define EXT4_IOC_GET_ENCRYPTION_POLICY	_IOW('f', 21, struct ext4_encryption_policy)
> +#define EXT4_IOC_FSGETXATTR		FS_IOC_FSGETXATTR
> +#define EXT4_IOC_FSSETXATTR		FS_IOC_FSSETXATTR
>  
>  #if defined(__KERNEL__) && defined(CONFIG_COMPAT)
>  /*
> diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
> index 2cb9e17..100b774 100644
> --- a/fs/ext4/ioctl.c
> +++ b/fs/ext4/ioctl.c
> @@ -14,6 +14,7 @@
>  #include <linux/mount.h>
>  #include <linux/file.h>
>  #include <linux/random.h>
> +#include <linux/quotaops.h>
>  #include <asm/uaccess.h>
>  #include "ext4_jbd2.h"
>  #include "ext4.h"
> @@ -206,6 +207,229 @@ static int uuid_is_zero(__u8 u[16])
>  	return 1;
>  }
>  
> +static int ext4_ioctl_setflags(struct inode *inode,
> +			       unsigned int flags)
> +{
> +	struct ext4_inode_info *ei = EXT4_I(inode);
> +	handle_t *handle = NULL;
> +	int err = EPERM, migrate = 0;
> +	struct ext4_iloc iloc;
> +	unsigned int oldflags, mask, i;
> +	unsigned int jflag;
> +
> +	/* Is it quota file? Do not allow user to mess with it */
> +	if (IS_NOQUOTA(inode))
> +		goto flags_out;
> +
> +	oldflags = ei->i_flags;
> +
> +	/* The JOURNAL_DATA flag is modifiable only by root */
> +	jflag = flags & EXT4_JOURNAL_DATA_FL;
> +
> +	/*
> +	 * The IMMUTABLE and APPEND_ONLY flags can only be changed by
> +	 * the relevant capability.
> +	 *
> +	 * This test looks nicer. Thanks to Pauline Middelink
> +	 */
> +	if ((flags ^ oldflags) & (EXT4_APPEND_FL | EXT4_IMMUTABLE_FL)) {
> +		if (!capable(CAP_LINUX_IMMUTABLE))
> +			goto flags_out;
> +	}
> +
> +	/*
> +	 * The JOURNAL_DATA flag can only be changed by
> +	 * the relevant capability.
> +	 */
> +	if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL)) {
> +		if (!capable(CAP_SYS_RESOURCE))
> +			goto flags_out;
> +	}
> +	if ((flags ^ oldflags) & EXT4_EXTENTS_FL)
> +		migrate = 1;
> +
> +	if (flags & EXT4_EOFBLOCKS_FL) {
> +		/* we don't support adding EOFBLOCKS flag */
> +		if (!(oldflags & EXT4_EOFBLOCKS_FL)) {
> +			err = -EOPNOTSUPP;
> +			goto flags_out;
> +		}
> +	} else if (oldflags & EXT4_EOFBLOCKS_FL)
> +		ext4_truncate(inode);
> +
> +	handle = ext4_journal_start(inode, EXT4_HT_INODE, 1);
> +	if (IS_ERR(handle)) {
> +		err = PTR_ERR(handle);
> +		goto flags_out;
> +	}
> +	if (IS_SYNC(inode))
> +		ext4_handle_sync(handle);
> +	err = ext4_reserve_inode_write(handle, inode, &iloc);
> +	if (err)
> +		goto flags_err;
> +
> +	for (i = 0, mask = 1; i < 32; i++, mask <<= 1) {
> +		if (!(mask & EXT4_FL_USER_MODIFIABLE))
> +			continue;
> +		if (mask & flags)
> +			ext4_set_inode_flag(inode, i);
> +		else
> +			ext4_clear_inode_flag(inode, i);
> +	}
> +
> +	ext4_set_inode_flags(inode);
> +	inode->i_ctime = ext4_current_time(inode);
> +
> +	err = ext4_mark_iloc_dirty(handle, inode, &iloc);
> +flags_err:
> +	ext4_journal_stop(handle);
> +	if (err)
> +		goto flags_out;
> +
> +	if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL))
> +		err = ext4_change_inode_journal_flag(inode, jflag);
> +	if (err)
> +		goto flags_out;
> +	if (migrate) {
> +		if (flags & EXT4_EXTENTS_FL)
> +			err = ext4_ext_migrate(inode);
> +		else
> +			err = ext4_ind_migrate(inode);
> +	}
> +
> +flags_out:
> +	return err;
> +}
> +
> +static int ext4_ioctl_setproject(struct file *filp, __u32 projid)
> +{
> +	struct inode *inode = file_inode(filp);
> +	struct super_block *sb = inode->i_sb;
> +	struct ext4_inode_info *ei = EXT4_I(inode);
> +	int err, rc;
> +	handle_t *handle;
> +	kprojid_t kprojid;
> +	struct ext4_iloc iloc;
> +	struct ext4_inode *raw_inode;
> +	struct dquot *transfer_to[EXT4_MAXQUOTAS] = { };
> +
> +	if (!EXT4_HAS_RO_COMPAT_FEATURE(sb,
> +			EXT4_FEATURE_RO_COMPAT_PROJECT)) {
> +		BUG_ON(__kprojid_val(EXT4_I(inode)->i_projid)
> +		       != EXT4_DEF_PROJID);
> +		if (projid != EXT4_DEF_PROJID)
> +			return -EOPNOTSUPP;
> +		else
> +			return 0;
> +	}
> +
> +	if (EXT4_INODE_SIZE(sb) <= EXT4_GOOD_OLD_INODE_SIZE)
> +	    	return -EOPNOTSUPP;
> +
> +	kprojid = make_kprojid(&init_user_ns, (projid_t)projid);
> +
> +	if (projid_eq(kprojid, EXT4_I(inode)->i_projid))
> +		return 0;
> +
> +	err = mnt_want_write_file(filp);
> +	if (err)
> +		return err;
> +
> +	err = -EPERM;
> +	mutex_lock(&inode->i_mutex);
> +	/* Is it quota file? Do not allow user to mess with it */
> +	if (IS_NOQUOTA(inode))
> +		goto out_unlock;
> +
> +	err = ext4_get_inode_loc(inode, &iloc);
> +	if (err)
> +		goto out_unlock;
> +
> +	raw_inode = ext4_raw_inode(&iloc);
> +	if (!EXT4_FITS_IN_INODE(raw_inode, ei, i_projid)) {
> +	    	err = -EOVERFLOW;
> +	    	brelse(iloc.bh);
> +	    	goto out_unlock;
> +	}
> +	brelse(iloc.bh);
> +
> +	dquot_initialize(inode);
> +
> +	handle = ext4_journal_start(inode, EXT4_HT_QUOTA,
> +		EXT4_QUOTA_INIT_BLOCKS(sb) +
> +		EXT4_QUOTA_DEL_BLOCKS(sb) + 3);
> +	if (IS_ERR(handle)) {
> +		err = PTR_ERR(handle);
> +		goto out_unlock;
> +	}
> +
> +	err = ext4_reserve_inode_write(handle, inode, &iloc);
> +	if (err)
> +		goto out_stop;
> +
> +	transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid));
> +	if (transfer_to[PRJQUOTA]) {
> +		err = __dquot_transfer(inode, transfer_to);
> +		dqput(transfer_to[PRJQUOTA]);
> +		if (err)
> +			goto out_dirty;
> +	}
> +
> +	EXT4_I(inode)->i_projid = kprojid;
> +	inode->i_ctime = ext4_current_time(inode);
> +out_dirty:
> +	rc = ext4_mark_iloc_dirty(handle, inode, &iloc);
> +	if (!err)
> +		err = rc;
> +out_stop:
> +	ext4_journal_stop(handle);
> +out_unlock:
> +	mutex_unlock(&inode->i_mutex);
> +	mnt_drop_write_file(filp);
> +	return err;
> +}
> +
> +/* Transfer internal flags to xflags */
> +static inline __u32 ext4_iflags_to_xflags(unsigned long iflags)
> +{
> +	__u32 xflags = 0;
> +
> +	if (iflags & EXT4_SYNC_FL)
> +		xflags |= FS_XFLAG_SYNC;
> +	if (iflags & EXT4_IMMUTABLE_FL)
> +		xflags |= FS_XFLAG_IMMUTABLE;
> +	if (iflags & EXT4_APPEND_FL)
> +		xflags |= FS_XFLAG_APPEND;
> +	if (iflags & EXT4_NODUMP_FL)
> +		xflags |= FS_XFLAG_NODUMP;
> +	if (iflags & EXT4_NOATIME_FL)
> +		xflags |= FS_XFLAG_NOATIME;
> +	if (iflags & EXT4_PROJINHERIT_FL)
> +		xflags |= FS_XFLAG_PROJINHERIT;
> +	return xflags;
> +}
> +
> +/* Transfer xflags flags to internal */
> +static inline unsigned long ext4_xflags_to_iflags(__u32 xflags)
> +{
> +	unsigned long iflags = 0;
> +
> +	if (xflags & FS_XFLAG_SYNC)
> +		iflags |= EXT4_SYNC_FL;
> +	if (xflags & FS_XFLAG_IMMUTABLE)
> +		iflags |= EXT4_IMMUTABLE_FL;
> +	if (xflags & FS_XFLAG_APPEND)
> +		iflags |= EXT4_APPEND_FL;
> +	if (xflags & FS_XFLAG_NODUMP)
> +		iflags |= EXT4_NODUMP_FL;
> +	if (xflags & FS_XFLAG_NOATIME)
> +		iflags |= EXT4_NOATIME_FL;
> +	if (xflags & FS_XFLAG_PROJINHERIT)
> +		iflags |= EXT4_PROJINHERIT_FL;
> +
> +	return iflags;
> +}
> +
>  long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
>  {
>  	struct inode *inode = file_inode(filp);
> @@ -221,11 +445,7 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
>  		flags = ei->i_flags & EXT4_FL_USER_VISIBLE;
>  		return put_user(flags, (int __user *) arg);
>  	case EXT4_IOC_SETFLAGS: {
> -		handle_t *handle = NULL;
> -		int err, migrate = 0;
> -		struct ext4_iloc iloc;
> -		unsigned int oldflags, mask, i;
> -		unsigned int jflag;
> +		int err;
>  
>  		if (!inode_owner_or_capable(inode))
>  			return -EACCES;
> @@ -239,89 +459,8 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
>  
>  		flags = ext4_mask_flags(inode->i_mode, flags);
>  
> -		err = -EPERM;
>  		mutex_lock(&inode->i_mutex);
> -		/* Is it quota file? Do not allow user to mess with it */
> -		if (IS_NOQUOTA(inode))
> -			goto flags_out;
> -
> -		oldflags = ei->i_flags;
> -
> -		/* The JOURNAL_DATA flag is modifiable only by root */
> -		jflag = flags & EXT4_JOURNAL_DATA_FL;
> -
> -		/*
> -		 * The IMMUTABLE and APPEND_ONLY flags can only be changed by
> -		 * the relevant capability.
> -		 *
> -		 * This test looks nicer. Thanks to Pauline Middelink
> -		 */
> -		if ((flags ^ oldflags) & (EXT4_APPEND_FL | EXT4_IMMUTABLE_FL)) {
> -			if (!capable(CAP_LINUX_IMMUTABLE))
> -				goto flags_out;
> -		}
> -
> -		/*
> -		 * The JOURNAL_DATA flag can only be changed by
> -		 * the relevant capability.
> -		 */
> -		if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL)) {
> -			if (!capable(CAP_SYS_RESOURCE))
> -				goto flags_out;
> -		}
> -		if ((flags ^ oldflags) & EXT4_EXTENTS_FL)
> -			migrate = 1;
> -
> -		if (flags & EXT4_EOFBLOCKS_FL) {
> -			/* we don't support adding EOFBLOCKS flag */
> -			if (!(oldflags & EXT4_EOFBLOCKS_FL)) {
> -				err = -EOPNOTSUPP;
> -				goto flags_out;
> -			}
> -		} else if (oldflags & EXT4_EOFBLOCKS_FL)
> -			ext4_truncate(inode);
> -
> -		handle = ext4_journal_start(inode, EXT4_HT_INODE, 1);
> -		if (IS_ERR(handle)) {
> -			err = PTR_ERR(handle);
> -			goto flags_out;
> -		}
> -		if (IS_SYNC(inode))
> -			ext4_handle_sync(handle);
> -		err = ext4_reserve_inode_write(handle, inode, &iloc);
> -		if (err)
> -			goto flags_err;
> -
> -		for (i = 0, mask = 1; i < 32; i++, mask <<= 1) {
> -			if (!(mask & EXT4_FL_USER_MODIFIABLE))
> -				continue;
> -			if (mask & flags)
> -				ext4_set_inode_flag(inode, i);
> -			else
> -				ext4_clear_inode_flag(inode, i);
> -		}
> -
> -		ext4_set_inode_flags(inode);
> -		inode->i_ctime = ext4_current_time(inode);
> -
> -		err = ext4_mark_iloc_dirty(handle, inode, &iloc);
> -flags_err:
> -		ext4_journal_stop(handle);
> -		if (err)
> -			goto flags_out;
> -
> -		if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL))
> -			err = ext4_change_inode_journal_flag(inode, jflag);
> -		if (err)
> -			goto flags_out;
> -		if (migrate) {
> -			if (flags & EXT4_EXTENTS_FL)
> -				err = ext4_ext_migrate(inode);
> -			else
> -				err = ext4_ind_migrate(inode);
> -		}
> -
> -flags_out:
> +		err = ext4_ioctl_setflags(inode, flags);
>  		mutex_unlock(&inode->i_mutex);
>  		mnt_drop_write_file(filp);
>  		return err;
> @@ -697,6 +836,60 @@ encryption_policy_out:
>  		return -EOPNOTSUPP;
>  #endif
>  	}
> +	case EXT4_IOC_FSGETXATTR:
> +	{
> +		struct fsxattr fa;
> +
> +		memset(&fa, 0, sizeof(struct fsxattr));
> +		ext4_get_inode_flags(ei);
> +		fa.fsx_xflags = ext4_iflags_to_xflags(ei->i_flags & EXT4_FL_USER_VISIBLE);
> +
> +		if (EXT4_HAS_RO_COMPAT_FEATURE(inode->i_sb,
> +				EXT4_FEATURE_RO_COMPAT_PROJECT)) {
> +			fa.fsx_projid = (__u32)from_kprojid(&init_user_ns,
> +				EXT4_I(inode)->i_projid);
> +		}
> +
> +		if (copy_to_user((struct fsxattr __user *)arg,
> +				 &fa, sizeof(fa)))
> +			return -EFAULT;
> +		return 0;
> +	}
> +	case EXT4_IOC_FSSETXATTR:
> +	{
> +		struct fsxattr fa;
> +		int err;
> +
> +		if (copy_from_user(&fa, (struct fsxattr __user *)arg,
> +				   sizeof(fa)))
> +			return -EFAULT;
> +
> +		/* Make sure caller has proper permission */
> +		if (!inode_owner_or_capable(inode))
> +			return -EACCES;
> +
> +		err = mnt_want_write_file(filp);
> +		if (err)
> +			return err;
> +
> +		flags = ext4_xflags_to_iflags(fa.fsx_xflags);
> +		flags = ext4_mask_flags(inode->i_mode, flags);
> +
> +		mutex_lock(&inode->i_mutex);
> +		flags = (ei->i_flags & ~EXT4_FL_XFLAG_VISIBLE) |
> +			 (flags & EXT4_FL_XFLAG_VISIBLE);
> +		err = ext4_ioctl_setflags(inode, flags);
> +		mutex_unlock(&inode->i_mutex);
> +		mnt_drop_write_file(filp);
> +		if (err)
> +			return err;
> +
> +		err = ext4_ioctl_setproject(filp, fa.fsx_projid);
> +		if (err)
> +			return err;
> +
> +		return 0;
> +	}
>  	default:
>  		return -ENOTTY;
>  	}
> diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h
> index 18dc721..64c7ae6 100644
> --- a/fs/xfs/libxfs/xfs_fs.h
> +++ b/fs/xfs/libxfs/xfs_fs.h
> @@ -36,38 +36,25 @@ struct dioattr {
>  #endif
>  
>  /*
> - * Structure for XFS_IOC_FSGETXATTR[A] and XFS_IOC_FSSETXATTR.
> - */
> -#ifndef HAVE_FSXATTR
> -struct fsxattr {
> -	__u32		fsx_xflags;	/* xflags field value (get/set) */
> -	__u32		fsx_extsize;	/* extsize field value (get/set)*/
> -	__u32		fsx_nextents;	/* nextents field value (get)	*/
> -	__u32		fsx_projid;	/* project identifier (get/set) */
> -	unsigned char	fsx_pad[12];
> -};
> -#endif
> -
> -/*
>   * Flags for the bs_xflags/fsx_xflags field
>   * There should be a one-to-one correspondence between these flags and the
>   * XFS_DIFLAG_s.
>   */
> -#define XFS_XFLAG_REALTIME	0x00000001	/* data in realtime volume */
> -#define XFS_XFLAG_PREALLOC	0x00000002	/* preallocated file extents */
> -#define XFS_XFLAG_IMMUTABLE	0x00000008	/* file cannot be modified */
> -#define XFS_XFLAG_APPEND	0x00000010	/* all writes append */
> -#define XFS_XFLAG_SYNC		0x00000020	/* all writes synchronous */
> -#define XFS_XFLAG_NOATIME	0x00000040	/* do not update access time */
> -#define XFS_XFLAG_NODUMP	0x00000080	/* do not include in backups */
> -#define XFS_XFLAG_RTINHERIT	0x00000100	/* create with rt bit set */
> -#define XFS_XFLAG_PROJINHERIT	0x00000200	/* create with parents projid */
> -#define XFS_XFLAG_NOSYMLINKS	0x00000400	/* disallow symlink creation */
> -#define XFS_XFLAG_EXTSIZE	0x00000800	/* extent size allocator hint */
> -#define XFS_XFLAG_EXTSZINHERIT	0x00001000	/* inherit inode extent size */
> -#define XFS_XFLAG_NODEFRAG	0x00002000  	/* do not defragment */
> -#define XFS_XFLAG_FILESTREAM	0x00004000	/* use filestream allocator */
> -#define XFS_XFLAG_HASATTR	0x80000000	/* no DIFLAG for this	*/
> +#define XFS_XFLAG_REALTIME	FS_XFLAG_REALTIME	/* data in realtime volume */
> +#define XFS_XFLAG_PREALLOC	FS_XFLAG_PREALLOC	/* preallocated file extents */
> +#define XFS_XFLAG_IMMUTABLE	FS_XFLAG_IMMUTABLE	/* file cannot be modified */
> +#define XFS_XFLAG_APPEND	FS_XFLAG_APPEND		/* all writes append */
> +#define XFS_XFLAG_SYNC		FS_XFLAG_SYNC		/* all writes synchronous */
> +#define XFS_XFLAG_NOATIME	FS_XFLAG_NOATIME	/* do not update access time */
> +#define XFS_XFLAG_NODUMP	FS_XFLAG_NODUMP		/* do not include in backups */
> +#define XFS_XFLAG_RTINHERIT	FS_XFLAG_RTINHERIT	/* create with rt bit set */
> +#define XFS_XFLAG_PROJINHERIT	FS_XFLAG_PROJINHERIT	/* create with parents projid */
> +#define XFS_XFLAG_NOSYMLINKS	FS_XFLAG_NOSYMLINKS	/* disallow symlink creation */
> +#define XFS_XFLAG_EXTSIZE	FS_XFLAG_EXTSIZE	/* extent size allocator hint */
> +#define XFS_XFLAG_EXTSZINHERIT	FS_XFLAG_EXTSZINHERIT	/* inherit inode extent size */
> +#define XFS_XFLAG_NODEFRAG	FS_XFLAG_NODEFRAG  	/* do not defragment */
> +#define XFS_XFLAG_FILESTREAM	FS_XFLAG_FILESTREAM	/* use filestream allocator */
> +#define XFS_XFLAG_HASATTR	FS_XFLAG_HASATTR	/* no DIFLAG for this	*/
>  
>  /*
>   * Structure for XFS_IOC_GETBMAP.
> @@ -503,8 +490,8 @@ typedef struct xfs_swapext
>  #define XFS_IOC_ALLOCSP		_IOW ('X', 10, struct xfs_flock64)
>  #define XFS_IOC_FREESP		_IOW ('X', 11, struct xfs_flock64)
>  #define XFS_IOC_DIOINFO		_IOR ('X', 30, struct dioattr)
> -#define XFS_IOC_FSGETXATTR	_IOR ('X', 31, struct fsxattr)
> -#define XFS_IOC_FSSETXATTR	_IOW ('X', 32, struct fsxattr)
> +#define XFS_IOC_FSGETXATTR	FS_IOC_FSGETXATTR
> +#define XFS_IOC_FSSETXATTR	FS_IOC_FSSETXATTR
>  #define XFS_IOC_ALLOCSP64	_IOW ('X', 36, struct xfs_flock64)
>  #define XFS_IOC_FREESP64	_IOW ('X', 37, struct xfs_flock64)
>  #define XFS_IOC_GETBMAP		_IOWR('X', 38, struct getbmap)
> diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h
> index f15d980..627f58e 100644
> --- a/include/uapi/linux/fs.h
> +++ b/include/uapi/linux/fs.h
> @@ -58,6 +58,36 @@ struct inodes_stat_t {
>  	long dummy[5];		/* padding for sysctl ABI compatibility */
>  };
>  
> +/*
> + * Structure for FS_IOC_FSGETXATTR and FS_IOC_FSSETXATTR.
> + */
> +struct fsxattr {
> +	__u32		fsx_xflags;	/* xflags field value (get/set) */
> +	__u32		fsx_extsize;	/* extsize field value (get/set)*/
> +	__u32		fsx_nextents;	/* nextents field value (get)	*/
> +	__u32		fsx_projid;	/* project identifier (get/set) */
> +	unsigned char	fsx_pad[12];
> +};
> +
> +/*
> + * Flags for the fsx_xflags field
> + */
> +#define FS_XFLAG_REALTIME	0x00000001	/* data in realtime volume */
> +#define FS_XFLAG_PREALLOC	0x00000002	/* preallocated file extents */
> +#define FS_XFLAG_IMMUTABLE	0x00000008	/* file cannot be modified */
> +#define FS_XFLAG_APPEND		0x00000010	/* all writes append */
> +#define FS_XFLAG_SYNC		0x00000020	/* all writes synchronous */
> +#define FS_XFLAG_NOATIME	0x00000040	/* do not update access time */
> +#define FS_XFLAG_NODUMP		0x00000080	/* do not include in backups */
> +#define FS_XFLAG_RTINHERIT	0x00000100	/* create with rt bit set */
> +#define FS_XFLAG_PROJINHERIT	0x00000200	/* create with parents projid */
> +#define FS_XFLAG_NOSYMLINKS	0x00000400	/* disallow symlink creation */
> +#define FS_XFLAG_EXTSIZE	0x00000800	/* extent size allocator hint */
> +#define FS_XFLAG_EXTSZINHERIT	0x00001000	/* inherit inode extent size */
> +#define FS_XFLAG_NODEFRAG	0x00002000  	/* do not defragment */
> +#define FS_XFLAG_FILESTREAM	0x00004000	/* use filestream allocator */
> +#define FS_XFLAG_HASATTR	0x80000000	/* no DIFLAG for this */
> +
>  
>  #define NR_FILE  8192	/* this can well be larger on a larger system */
>  
> @@ -165,6 +195,8 @@ struct inodes_stat_t {
>  #define	FS_IOC_GETVERSION		_IOR('v', 1, long)
>  #define	FS_IOC_SETVERSION		_IOW('v', 2, long)
>  #define FS_IOC_FIEMAP			_IOWR('f', 11, struct fiemap)
> +#define FS_IOC_FSGETXATTR		_IOR('X', 31, struct fsxattr)
> +#define FS_IOC_FSSETXATTR		_IOW('X', 32, struct fsxattr)
>  #define FS_IOC32_GETFLAGS		_IOR('f', 1, int)
>  #define FS_IOC32_SETFLAGS		_IOW('f', 2, int)
>  #define FS_IOC32_GETVERSION		_IOR('v', 1, int)
> -- 
> 1.7.1
>
Dave Chinner April 26, 2015, 11:20 p.m. UTC | #2
On Thu, Apr 23, 2015 at 03:56:36AM +0900, Li Xi wrote:
> This patch adds FS_IOC_FSSETXATTR/FS_IOC_FSGETXATTR ioctl interface
> support for ext4. The interface is kept consistent with
> XFS_IOC_FSGETXATTR/XFS_IOC_FSGETXATTR.

Have you run this patchthrough XFS testing to make sure everything
sill works?

Cheers,

Dave.
Li Xi April 28, 2015, 2:01 a.m. UTC | #3
Hi Dave,

I ran xfstests on the kernel with this series of patches.
Unfortunately, 5 test suits failed. But I don't think they are caused
by this patch. Following is the result. Please let me know if there is
any problem about it.

Output of xfstests:

FSTYP         -- xfs (non-debug)
PLATFORM      -- Linux/x86_64 vm15 4.0.0+
MKFS_OPTIONS  -- -f -bsize=4096 /dev/sdb2
MOUNT_OPTIONS -- /dev/sdb2 /mnt/scratch

generic/001 3s ... 2s
generic/002 0s ... 0s
generic/003 10s ... 10s
generic/004     [not run] xfs_io flink support is missing
generic/005 0s ... 0s
generic/006 1s ... 0s
generic/007 0s ... 0s
generic/008     [not run] xfs_io fzero support is missing
generic/009     [not run] xfs_io fzero support is missing
generic/010 1s ... 0s
generic/011 1s ... 0s
generic/012     [not run] xfs_io fpunch support is missing
generic/013 92s ... 90s
generic/014 3s ... 3s
generic/015 1s ... 1s
generic/016     [not run] xfs_io fpunch support is missing
generic/017     [not run] xfs_io fiemap support is missing
generic/018     [not run] xfs_io fiemap support is missing
generic/020 38s ... 31s
generic/021     [not run] xfs_io fpunch support is missing
generic/022     [not run] xfs_io fpunch support is missing
generic/023 1s ... 0s
generic/024 1s ... 0s
generic/025 0s ... 0s
generic/026 0s ... 0s
generic/027 57s ... 57s
generic/028 5s ... 5s
generic/053 1s ... 2s
generic/062 1s ... 2s
generic/068 60s ... 61s
generic/069 4s ... 3s
generic/070 13s ... 14s
generic/074 164s ... 162s
generic/075 87s ... 86s
generic/076 1s ... 1s
generic/077     [not run] fsgqa user not defined.
generic/079 1s ... 1s
generic/083 36s ... 39s
generic/088 1s ... 0s
generic/089 4s ... 4s
generic/091 62s ... 62s
generic/093     [not run] not suitable for this OS: Linux
generic/097     [not run] not suitable for this OS: Linux
generic/099     [not run] not suitable for this OS: Linux
generic/100 12s ... 12s
generic/105 0s ... 0s
generic/112     [not run] fsx not built with AIO for this platform
generic/113     [not run] aio-stress not built for this platform
generic/117 15s ... 15s
generic/120 16s ... 16s
generic/123     [not run] fsgqa user not defined.
generic/124 4s ... 3s
generic/125     [not run] fsgqa user not defined.
generic/126 1s ... 0s
generic/127 1745s ... 1793s
generic/128     [not run] fsgqa user not defined.
generic/129 4s ... 4s
generic/130 13s ... 13s
generic/131 1s ... 1s
generic/132 40s ... 40s
generic/133 92s ... 94s
generic/135 1s ... 1s
generic/141 0s ... 1s
generic/169 1s ... 1s
generic/184 1s ... 0s
generic/192 40s ... 40s
generic/193     [not run] fsgqa user not defined.
generic/198     [not run] src/aio-dio-regress/aiodio_sparse2 not built
generic/204 6s ... 7s
generic/207     [not run] src/aio-dio-regress/aio-dio-extend-stat not built
generic/208     [not run]
src/aio-dio-regress/aio-dio-invalidate-failure not built
generic/209     [not run]
src/aio-dio-regress/aio-dio-invalidate-readahead not built
generic/210     [not run]
src/aio-dio-regress/aio-dio-subblock-eof-read not built
generic/211     [not run]
src/aio-dio-regress/aio-free-ring-with-bogus-nr-pages not built
generic/212     [not run]
src/aio-dio-regress/aio-io-setup-with-nonwritable-context-pointer not
built
generic/213 0s ... 0s
generic/214 0s ... 0s
generic/215 2s ... 3s
generic/219     [not run] fsgqa user not defined.
generic/221 1s ... 1s
generic/223 14s ... 14s
generic/224 59s ... 61s
generic/225 18s ... 17s
generic/226 18s ... 19s
generic/228 1s ... 0s
generic/230     [not run] fsgqa user not defined.
generic/231     [not run] fsgqa user not defined.
generic/232 55s ... 52s
generic/233     [not run] fsgqa user not defined.
generic/234 9s ... 9s
generic/235     [not run] fsgqa user not defined.
generic/236 2s ... 1s
generic/237 1s ... 0s
generic/239     [not run]
src/aio-dio-regress/aio-dio-hole-filling-race not built
generic/240     [not run] src/aio-dio-regress/aiodio_sparse2 not built
generic/241     [not run] dbench not found
generic/245 0s ... 0s
generic/246 0s ... 0s
generic/247 24s ... 24s
generic/248 0s ... 0s
generic/249 2s ... 1s
generic/255     [not run] xfs_io fpunch support is missing
generic/256     [not run] xfs_io fpunch support is missing
generic/257 0s ... 0s
generic/258 1s ... 0s
generic/260     [not run] FITRIM not supported on /dev/sdb2
generic/263 93s ... 96s
generic/269 113s ... 112s
generic/270     [not run] fsgqa user not defined.
generic/273 44s ... 40s
generic/274 72s ... 70s
generic/275 32s ... 33s
generic/277 2s ... 1s
generic/280 2s ... 2s
generic/285 0s ... 0s
generic/286 6s ... 5s
generic/288     [not run] FITRIM not supported on /dev/sdb2
generic/294 1s ... 0s
generic/299     [not run]  utility required, skipped this test
generic/300     [not run] xfs_io fpunch support is missing
generic/306     - output mismatch (see
/root/work/quota/ext4_inode_field/xfstests.git/results//generic/306.out.bad)
    --- tests/generic/306.out    2014-07-16 10:19:26.196995657 +0800
    +++ /root/work/quota/ext4_inode_field/xfstests.git/results//generic/306.out.bad
   2015-04-27 22:40:13.365445316 +0800
    @@ -2,11 +2,9 @@
     == try to create new file
     touch: cannot touch 'SCRATCH_MNT/this_should_fail': Read-only file system
     == pwrite to null device
    -wrote 512/512 bytes at offset 0
    -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
    +xfs_io: specified file ["/mnt/scratch/devnull"] is not on an XFS filesystem
     == pread from zero device
    ...
    (Run 'diff -u tests/generic/306.out
/root/work/quota/ext4_inode_field/xfstests.git/results//generic/306.out.bad'
 to see the entire diff)
generic/307 1s ... 2s
generic/308 0s ... 0s
generic/309 1s ... 1s
generic/310 62s ... 63s
generic/311 124s ... 129s
generic/312     [not run] this test requires $SCRATCH_DEV has 5368709120B space
generic/313 2s ... 2s
generic/314     [not run] fsgqa user not defined.
generic/315 0s ... 0s
generic/316     [not run] xfs_io fpunch support is missing
generic/317     [not run] fsgqa user not defined.
generic/318 1s ... 1s
generic/319 0s ... 1s
generic/320 65s ... 81s
generic/321 2s ... 2s
generic/322 1s ... 2s
shared/006 381s ... 386s
shared/032 8s ... 8s
shared/051 0s ... 1s
shared/272     [not run] not suitable for this filesystem type: xfs
shared/289     [not run] not suitable for this filesystem type: xfs
shared/298     [not run] xfs_io fiemap support is missing
xfs/001     [not run] mkfs.xfs doesn't have crc feature
xfs/002     [not run] mkfs.xfs doesn't have crc feature
xfs/003 0s ... 0s
xfs/004 1s ... 1s
xfs/005     [not run] mkfs.xfs doesn't have crc feature
xfs/006 3s ... 4s
xfs/007 1s ... 0s
xfs/008 0s ... 1s
xfs/009 0s ... 1s
xfs/010     [not run] mkfs.xfs doesn't have finobt feature
xfs/011 17s ... 17s
xfs/012 1s ... 1s
xfs/013     [not run] mkfs.xfs doesn't have finobt feature
xfs/014     [not run] fsgqa user not defined.
xfs/016 35s ... 37s
xfs/017 18s ... 18s
xfs/019 1s ... 1s
xfs/021 0s ... 1s
xfs/026     12s
xfs/027     12s
xfs/028     24s
xfs/029 0s ... 1s
xfs/030 9s ... 9s
xfs/031 7s ... 7s
xfs/033 6s ... 5s
xfs/034 1s ... 1s
xfs/035     [not run] No dump tape specified
xfs/040     [not run] Can't run srcdiff without KWORKAREA set
xfs/041 15s ... 17s
xfs/042 120s ... 123s
xfs/044     [not run] This test requires a valid $SCRATCH_LOGDEV
xfs/045 1s ... 1s
xfs/046     12s
xfs/047     23s
xfs/048 0s ... 0s
xfs/049 8s ... 8s
xfs/050 15s ... 15s
xfs/052 1s ... 2s
xfs/054 2s ... 3s
xfs/056     17s
xfs/057     [not run] Place holder for IRIX test 057
xfs/058     [not run] Place holder for IRIX test 058
xfs/059     [not run] xfsdump multi-stream support required
xfs/060     [not run] xfsdump multi-stream support required
xfs/061     12s
xfs/063     12s
xfs/064     77s
xfs/065     35s
xfs/066     25s
xfs/067 1s ... 1s
xfs/071 5s ... 5s
xfs/072 1s ... 1s
xfs/073 15s ... 22s
xfs/078 65s ... 66s
xfs/084 59s ... 59s
xfs/085 1s ... 1s
xfs/086 63s ... 65s
xfs/087 33s ... 34s
xfs/090     [not run] External volumes not in use, skipped this test
xfs/092 1s ... 1s
xfs/094     [not run] External volumes not in use, skipped this test
xfs/095     [not run] not suitable for this OS: Linux
xfs/096 3s ... 2s
xfs/103 1s ... 0s
xfs/104 96s ... 100s
xfs/108 6s ... 6s
xfs/109 29s ... 28s
xfs/110 12s ... 12s
xfs/116 1s ... 1s
xfs/118 1s ... 2s
xfs/119 4s ... 4s
xfs/121 6s ... 6s
xfs/122     [not run] Could not compile test program (see end of
/root/work/quota/ext4_inode_field/xfstests.git/results//xfs/122.full)
xfs/134 1s ... 1s
xfs/137 12s ... 12s
xfs/138 13s ... 14s
xfs/139 13s ... 13s
xfs/140 13s ... 13s
xfs/148     [not run] parallel repair binary xfs_prepair64 is not installed
xfs/149     [not run] parallel repair binary xfs_prepair is not installed
xfs/164 0s ... 0s
xfs/165 1s ... 0s
xfs/166 1s ... 0s
xfs/167     [not run] This test requires at least 10GB free on
/mnt/scratch to run
xfs/170 9s ... 10s
xfs/174 17s ... 19s
xfs/178 15s ... 15s
xfs/179 39s ... 41s
xfs/180     [not run] This test requires at least 10GB free on
/mnt/scratch to run
xfs/181 12s ... 13s
xfs/182 9s ... 9s
xfs/183 3s ... 3s
xfs/186 1s ... 2s
xfs/187 3s ... 2s
xfs/188 8s ... 7s
xfs/189     [not run] noattr2 mount option not supported on /dev/sdb2
xfs/190 1s ... 1s
xfs/191     [not run] no mkfs support for NFS v4 ACLs
xfs/194 1s ... 1s
xfs/195     [not run] fsgqa user not defined.
xfs/196 3s ... 4s
xfs/197     [not run] This test is only valid on 32 bit machines
xfs/199 1s ... 0s
xfs/200 1s ... 0s
xfs/201 2s ... 2s
xfs/202 1s ... 0s
xfs/203 0s ... 1s
xfs/205 2s ... 2s
xfs/206 31s ... 32s
xfs/216 10s ... 10s
xfs/217 128s ... 130s
xfs/220 1s ... 1s
xfs/222 1s ... 1s
xfs/227 493s ... 507s
xfs/229 134s ... [failed, exit status 23] - output mismatch (see
/root/work/quota/ext4_inode_field/xfstests.git/results//xfs/229.out.bad)
    --- tests/xfs/229.out    2014-07-16 10:19:26.215995657 +0800
    +++ /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/229.out.bad
   2015-04-27 23:25:48.709093428 +0800
    @@ -1,4 +1,31 @@
     QA output created by 229
     generating 10 files
    +Write did not return correct amount
    +Write did not return correct amount
    +Write did not return correct amount
    +Write did not return correct amount
     comparing files
    ...
    (Run 'diff -u tests/xfs/229.out
/root/work/quota/ext4_inode_field/xfstests.git/results//xfs/229.out.bad'
 to see the entire diff)
xfs/238 1s ... 1s
xfs/242     [not run] zero command not supported
xfs/244 2s ... 2s
xfs/250     [failed, exit status 1] - output mismatch (see
/root/work/quota/ext4_inode_field/xfstests.git/results//xfs/250.out.bad)
    --- tests/xfs/250.out    2014-07-16 10:19:26.215995657 +0800
    +++ /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/250.out.bad
   2015-04-27 23:26:15.137452337 +0800
    @@ -11,4 +11,4 @@
     *** preallocate large file
     *** unmount loop filesystem
     *** check loop filesystem
    -*** done
    +_check_xfs_filesystem: filesystem on /mnt/test/250.fs is
inconsistent (r) (see
/root/work/quota/ext4_inode_field/xfstests.git/results//xfs/250.full)
    ...
    (Run 'diff -u tests/xfs/250.out
/root/work/quota/ext4_inode_field/xfstests.git/results//xfs/250.out.bad'
 to see the entire diff)
xfs/252     [not run] xfs_io fpunch support is missing
xfs/253 2s ... 3s
xfs/259 33s ... 34s
xfs/261 1s ... 1s
xfs/262 1s ... 1s
xfs/266     [not run] requires xfsdump -D
xfs/278 1s ... 1s
xfs/279 8s ... 8s
xfs/281     [not run] xfsdump -K option required
xfs/282     [not run] xfsdump -K option required
xfs/283     [not run] xfsdump -K option required
xfs/287     2s
xfs/290     [not run] xfs_io zero support is missing
xfs/291 52s ... 54s
xfs/292 4s ... 4s
xfs/293 2s ... 2s
xfs/295 8s ... 7s
xfs/296     12s
xfs/297 306s ... 229s
xfs/298 6s ... 6s
xfs/299     [not run] mkfs.xfs doesn't have crc feature
xfs/300     [not run] SELinux not enabled
xfs/301     - output mismatch (see
/root/work/quota/ext4_inode_field/xfstests.git/results//xfs/301.out.bad)
    --- tests/xfs/301.out    2014-07-16 10:19:26.217995657 +0800
    +++ /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/301.out.bad
   2015-04-27 23:33:33.629182381 +0800
    @@ -29,18 +29,21 @@
     Attribute "attr4" had a 10 byte value for DUMP_DIR/sub/biggg:
     some_text4
     EAs on restore
    +getfattr: /mnt/scratch/restoredir/dumpdir: No such file or directory
    +getfattr: /mnt/scratch/restoredir/dumpdir: No such file or directory
     User names
    -Attribute "attr5" had a 8 byte value for DUMP_DIR/dir:
    ...
    (Run 'diff -u tests/xfs/301.out
/root/work/quota/ext4_inode_field/xfstests.git/results//xfs/301.out.bad'
 to see the entire diff)
xfs/302     [failed, exit status 1] - output mismatch (see
/root/work/quota/ext4_inode_field/xfstests.git/results//xfs/302.out.bad)
    --- tests/xfs/302.out    2014-07-16 10:19:26.217995657 +0800
    +++ /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/302.out.bad
   2015-04-27 23:33:46.102767709 +0800
    @@ -1,2 +1,4 @@
     QA output created by 302
     Silence is golden.
    +dump failed
    +(see /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/302.full
for details)
    ...
    (Run 'diff -u tests/xfs/302.out
/root/work/quota/ext4_inode_field/xfstests.git/results//xfs/302.out.bad'
 to see the entire diff)
xfs/303 0s ... 0s
xfs/304     [not run] mkfs.xfs doesn't have crc feature
xfs/305     [not run] mkfs.xfs doesn't have crc feature
xfs/306 76s ... 76s
Ran: generic/001 generic/002 generic/003 generic/005 generic/006
generic/007 generic/010 generic/011 generic/013 generic/014
generic/015 generic/020 generic/023 generic/024 generic/025
generic/026 generic/027 generic/028 generic/053 generic/062
generic/068 generic/069 generic/070 generic/074 generic/075
generic/076 generic/079 generic/083 generic/088 generic/089
generic/091 generic/100 generic/105 generic/117 generic/120
generic/124 generic/126 generic/127 generic/129 generic/130
generic/131 generic/132 generic/133 generic/135 generic/141
generic/169 generic/184 generic/192 generic/204 generic/213
generic/214 generic/215 generic/221 generic/223 generic/224
generic/225 generic/226 generic/228 generic/232 generic/234
generic/236 generic/237 generic/245 generic/246 generic/247
generic/248 generic/249 generic/257 generic/258 generic/263
generic/269 generic/273 generic/274 generic/275 generic/277
generic/280 generic/285 generic/286 generic/294 generic/306
generic/307 generic/308 generic/309 generic/310 generic/311
generic/313 generic/315 generic/318 generic/319 generic/320
generic/321 generic/322 shared/006 shared/032 shared/051 xfs/003
xfs/004 xfs/006 xfs/007 xfs/008 xfs/009 xfs/011 xfs/012 xfs/016
xfs/017 xfs/019 xfs/021 xfs/026 xfs/027 xfs/028 xfs/029 xfs/030
xfs/031 xfs/033 xfs/034 xfs/041 xfs/042 xfs/045 xfs/046 xfs/047
xfs/048 xfs/049 xfs/050 xfs/052 xfs/054 xfs/056 xfs/061 xfs/063
xfs/064 xfs/065 xfs/066 xfs/067 xfs/071 xfs/072 xfs/073 xfs/078
xfs/084 xfs/085 xfs/086 xfs/087 xfs/092 xfs/096 xfs/103 xfs/104
xfs/108 xfs/109 xfs/110 xfs/116 xfs/118 xfs/119 xfs/121 xfs/134
xfs/137 xfs/138 xfs/139 xfs/140 xfs/164 xfs/165 xfs/166 xfs/170
xfs/174 xfs/178 xfs/179 xfs/181 xfs/182 xfs/183 xfs/186 xfs/187
xfs/188 xfs/190 xfs/194 xfs/196 xfs/199 xfs/200 xfs/201 xfs/202
xfs/203 xfs/205 xfs/206 xfs/216 xfs/217 xfs/220 xfs/222 xfs/227
xfs/229 xfs/238 xfs/244 xfs/250 xfs/253 xfs/259 xfs/261 xfs/262
xfs/278 xfs/279 xfs/287 xfs/291 xfs/292 xfs/293 xfs/295 xfs/296
xfs/297 xfs/298 xfs/301 xfs/302 xfs/303 xfs/306
Not run: generic/004 generic/008 generic/009 generic/012 generic/016
generic/017 generic/018 generic/021 generic/022 generic/077
generic/093 generic/097 generic/099 generic/112 generic/113
generic/123 generic/125 generic/128 generic/193 generic/198
generic/207 generic/208 generic/209 generic/210 generic/211
generic/212 generic/219 generic/230 generic/231 generic/233
generic/235 generic/239 generic/240 generic/241 generic/255
generic/256 generic/260 generic/270 generic/288 generic/299
generic/300 generic/312 generic/314 generic/316 generic/317 shared/272
shared/289 shared/298 xfs/001 xfs/002 xfs/005 xfs/010 xfs/013 xfs/014
xfs/035 xfs/040 xfs/044 xfs/057 xfs/058 xfs/059 xfs/060 xfs/090
xfs/094 xfs/095 xfs/122 xfs/148 xfs/149 xfs/167 xfs/180 xfs/189
xfs/191 xfs/195 xfs/197 xfs/242 xfs/252 xfs/266 xfs/281 xfs/282
xfs/283 xfs/290 xfs/299 xfs/300 xfs/304 xfs/305
Failures: generic/306 xfs/229 xfs/250 xfs/301 xfs/302
Failed 5 of 206 tests

On Mon, Apr 27, 2015 at 7:20 AM, Dave Chinner <david@fromorbit.com> wrote:
> On Thu, Apr 23, 2015 at 03:56:36AM +0900, Li Xi wrote:
>> This patch adds FS_IOC_FSSETXATTR/FS_IOC_FSGETXATTR ioctl interface
>> support for ext4. The interface is kept consistent with
>> XFS_IOC_FSGETXATTR/XFS_IOC_FSGETXATTR.
>
> Have you run this patchthrough XFS testing to make sure everything
> sill works?
>
> Cheers,
>
> Dave.
> --
> Dave Chinner
> david@fromorbit.com
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Dave Chinner April 28, 2015, 4:43 a.m. UTC | #4
On Tue, Apr 28, 2015 at 10:01:07AM +0800, Li Xi wrote:
> Hi Dave,
> 
> I ran xfstests on the kernel with this series of patches.
> Unfortunately, 5 test suits failed. But I don't think they are caused
> by this patch. Following is the result. Please let me know if there is
> any problem about it.
> 
> Output of xfstests:
> 
> FSTYP         -- xfs (non-debug)
> PLATFORM      -- Linux/x86_64 vm15 4.0.0+
> MKFS_OPTIONS  -- -f -bsize=4096 /dev/sdb2
> MOUNT_OPTIONS -- /dev/sdb2 /mnt/scratch
> 
> generic/001 3s ... 2s
> generic/002 0s ... 0s
> generic/003 10s ... 10s
> generic/004     [not run] xfs_io flink support is missing
> generic/005 0s ... 0s
> generic/006 1s ... 0s
> generic/007 0s ... 0s
> generic/008     [not run] xfs_io fzero support is missing
> generic/009     [not run] xfs_io fzero support is missing
> generic/010 1s ... 0s
> generic/011 1s ... 0s
> generic/012     [not run] xfs_io fpunch support is missing
> generic/013 92s ... 90s
> generic/014 3s ... 3s
> generic/015 1s ... 1s
> generic/016     [not run] xfs_io fpunch support is missing
> generic/017     [not run] xfs_io fiemap support is missing
> generic/018     [not run] xfs_io fiemap support is missing

You really need to update your xfsprogs install. You aren't testing
half of what you need to be testing if you are missing basic
functionality like fiemap support (which has been in xfs_io since
2011).

> generic/020 38s ... 31s
> generic/021     [not run] xfs_io fpunch support is missing
> generic/022     [not run] xfs_io fpunch support is missing
> generic/023 1s ... 0s
> generic/024 1s ... 0s
> generic/025 0s ... 0s
> generic/026 0s ... 0s
> generic/027 57s ... 57s
> generic/028 5s ... 5s
> generic/053 1s ... 2s
> generic/062 1s ... 2s
> generic/068 60s ... 61s
> generic/069 4s ... 3s
> generic/070 13s ... 14s
> generic/074 164s ... 162s
> generic/075 87s ... 86s
> generic/076 1s ... 1s
> generic/077     [not run] fsgqa user not defined.

ANd if you don't have this user defined, then several quota tests
don't get run.

> generic/079 1s ... 1s
> generic/083 36s ... 39s
> generic/088 1s ... 0s
> generic/089 4s ... 4s
> generic/091 62s ... 62s
> generic/093     [not run] not suitable for this OS: Linux
> generic/097     [not run] not suitable for this OS: Linux
> generic/099     [not run] not suitable for this OS: Linux
> generic/100 12s ... 12s
> generic/105 0s ... 0s
> generic/112     [not run] fsx not built with AIO for this platform
> generic/113     [not run] aio-stress not built for this platform

Ouch. There's another whole class of functionality you aren't
testing.

> generic/299     [not run]  utility required, skipped this test
> generic/300     [not run] xfs_io fpunch support is missing
> generic/306     - output mismatch (see
> /root/work/quota/ext4_inode_field/xfstests.git/results//generic/306.out.bad)
>     --- tests/generic/306.out    2014-07-16 10:19:26.196995657 +0800
>     +++ /root/work/quota/ext4_inode_field/xfstests.git/results//generic/306.out.bad
>    2015-04-27 22:40:13.365445316 +0800
>     @@ -2,11 +2,9 @@
>      == try to create new file
>      touch: cannot touch 'SCRATCH_MNT/this_should_fail': Read-only file system
>      == pwrite to null device
>     -wrote 512/512 bytes at offset 0
>     -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>     +xfs_io: specified file ["/mnt/scratch/devnull"] is not on an XFS filesystem
>      == pread from zero device
>     ...
>     (Run 'diff -u tests/generic/306.out
> /root/work/quota/ext4_inode_field/xfstests.git/results//generic/306.out.bad'
>  to see the entire diff)

That's caused by having a very old xfs_io.

> xfs/229 134s ... [failed, exit status 23] - output mismatch (see
> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/229.out.bad)
>     --- tests/xfs/229.out    2014-07-16 10:19:26.215995657 +0800
>     +++ /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/229.out.bad
>    2015-04-27 23:25:48.709093428 +0800
>     @@ -1,4 +1,31 @@
>      QA output created by 229
>      generating 10 files
>     +Write did not return correct amount
>     +Write did not return correct amount
>     +Write did not return correct amount
>     +Write did not return correct amount
>      comparing files

Can't say that I've seen that one fail for a long time. I can't say
anything useful about it, however, given how old your xfsprogs
installation is.

>     ...
>     (Run 'diff -u tests/xfs/229.out
> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/229.out.bad'
>  to see the entire diff)
> xfs/238 1s ... 1s
> xfs/242     [not run] zero command not supported
> xfs/244 2s ... 2s
> xfs/250     [failed, exit status 1] - output mismatch (see
> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/250.out.bad)
>     --- tests/xfs/250.out    2014-07-16 10:19:26.215995657 +0800
>     +++ /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/250.out.bad
>    2015-04-27 23:26:15.137452337 +0800
>     @@ -11,4 +11,4 @@
>      *** preallocate large file
>      *** unmount loop filesystem
>      *** check loop filesystem
>     -*** done
>     +_check_xfs_filesystem: filesystem on /mnt/test/250.fs is
> inconsistent (r) (see
> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/250.full)
>     ...
>     (Run 'diff -u tests/xfs/250.out
> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/250.out.bad'
>  to see the entire diff)

Your xfstests is not up to date. This is fixed by commit ee6ad7f
("xfs/049: umount -d fails when kernel wins teardown race").

> xfs/301     - output mismatch (see
> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/301.out.bad)
>     --- tests/xfs/301.out    2014-07-16 10:19:26.217995657 +0800
>     +++ /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/301.out.bad
>    2015-04-27 23:33:33.629182381 +0800
>     @@ -29,18 +29,21 @@
>      Attribute "attr4" had a 10 byte value for DUMP_DIR/sub/biggg:
>      some_text4
>      EAs on restore
>     +getfattr: /mnt/scratch/restoredir/dumpdir: No such file or directory
>     +getfattr: /mnt/scratch/restoredir/dumpdir: No such file or directory
>      User names
>     -Attribute "attr5" had a 8 byte value for DUMP_DIR/dir:
>     ...
>     (Run 'diff -u tests/xfs/301.out

$ ./lsqa.pl tests/xfs/301
FS QA Test No. 301

Verify multi-stream xfsdump/restore preserves extended attributes

$

Your xfsdump package is out of date and needs upgrading.

> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/301.out.bad'
>  to see the entire diff)
> xfs/302     [failed, exit status 1] - output mismatch (see
> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/302.out.bad)
>     --- tests/xfs/302.out    2014-07-16 10:19:26.217995657 +0800
>     +++ /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/302.out.bad
>    2015-04-27 23:33:46.102767709 +0800
>     @@ -1,2 +1,4 @@
>      QA output created by 302
>      Silence is golden.
>     +dump failed
>     +(see /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/302.full
> for details)
>     ...
>     (Run 'diff -u tests/xfs/302.out
> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/302.out.bad'
>  to see the entire diff)

Same again.

You need to upgrade everything to current xfstests/xfsprogs/xfsdump
and retest *everything*. That means rerunning all your ext4 testing,
too, because you're not exercising all the cases where the
interesting accounting bugs lie (i.e. in fallocate operations).

I'd also suggest that you run the tests using MOUNT_OPTIONS="-o
pquota" after setting up default configurations for TEST_MNT and
SCRATCH_MNT so that you actually give the project quota code a
significant amount of work to do, and do the same for ext4,
otherwise you're not really testing it at all when you run xfstests
on ext4....

Cheers,

Dave.
Li Xi April 29, 2015, 5:49 a.m. UTC | #5
Hi Dave,

Thanks for the advices. I tried to run latest xfstests again. However,
the kernel crashed when runing generic/051 generic/054 and
generic/055. And please note that the kernel also crashed on original
linux-4.0 without any of my patches. Following is one of the dump
stack:

run fstests generic/055 at 2015-04-29 13:43:39
------------[ cut here ]------------
WARNING: CPU: 0 PID: 31915 at lib/list_debug.c:33 __list_add+0xbe/0xd0()
list_add corruption. prev->next should be next (ffffffff81e05018), but
was           (null). (prev=ffff8800d8ff3ca0).
Modules linked in: dm_flakey xfs exportfs libcrc32c nfsv3 nfs_acl
rpcsec_gss_krb5 auth_rpcgss oid_registry nfsv4 nfs fscache lockd grace
sunrpc ipv6 dm_mirror dm_region_hash dm_log dm_mod ppdev floppy
parport_pc parport microcode pcspkr virtio_balloon sg 8139too 8139cp
mii i2c_piix4 i2c_core ext4 jbd2 mbcache sr_mod cdrom sd_mod pata_acpi
ata_generic ata_piix virtio_pci virtio_ring virtio [last unloaded:
speedstep_lib]
CPU: 0 PID: 31915 Comm: kworker/0:0 Not tainted 4.0.0+ #1
Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2007
Workqueue: events vmstat_shepherd
 0000000000000021 ffff8800db177bf8 ffffffff815ccaf6 0000000000000021
 ffff8800db177c48 ffff8800db177c38 ffffffff81059fc5 ffff8800db177c38
 ffffffff81a8d480 ffffffff81e05018 ffff8800d8ff3ca0 0000000000000000
Call Trace:
 [<ffffffff815ccaf6>] dump_stack+0x48/0x5a
 [<ffffffff81059fc5>] warn_slowpath_common+0x95/0xe0
 [<ffffffff8105a0c6>] warn_slowpath_fmt+0x46/0x70
 [<ffffffff812c04fe>] __list_add+0xbe/0xd0
 [<ffffffff810bb84b>] __internal_add_timer+0x9b/0x110
 [<ffffffff810bb8f9>] internal_add_timer+0x39/0x90
 [<ffffffff810bd8c9>] mod_timer+0xf9/0x1d0
 [<ffffffff810bd9b8>] add_timer+0x18/0x30
 [<ffffffff81071a22>] __queue_delayed_work+0x92/0x1a0
 [<ffffffff81071bcd>] queue_delayed_work_on+0x1d/0x40
 [<ffffffff81160d5c>] vmstat_shepherd+0x10c/0x120
 [<ffffffff810722ed>] process_one_work+0x14d/0x440
 [<ffffffff810726ff>] worker_thread+0x11f/0x3d0
 [<ffffffff815ccfaf>] ? __schedule+0x36f/0x800
 [<ffffffff810725e0>] ? process_one_work+0x440/0x440
 [<ffffffff810725e0>] ? process_one_work+0x440/0x440
 [<ffffffff810774ce>] kthread+0xce/0xf0
 [<ffffffff8104d96e>] ? __do_page_fault+0x17e/0x430
 [<ffffffff81077400>] ? kthread_freezable_should_stop+0x70/0x70
 [<ffffffff815d1052>] ret_from_fork+0x42/0x70
 [<ffffffff81077400>] ? kthread_freezable_should_stop+0x70/0x70
---[ end trace 97c6b752be15ac57 ]---
XFS (sdb2): Mounting V4 Filesystem
XFS (sdb2): Ending clean mount
XFS (sdb2): Quotacheck needed: Please wait.
XFS (sdb2): Quotacheck: Done.
XFS (sdb2): xfs_log_force: error -5 returned.
XFS (sdb2): xfs_log_force: error -5 returned.
XFS (sdb2): xfs_log_force: error -5 returned.
BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
IP: [<ffffffff810bbc88>] get_next_timer_interrupt+0x158/0x230
PGD d8e7a067 PUD db654067 PMD 0
Oops: 0000 [#1] SMP
Modules linked in: dm_flakey xfs exportfs libcrc32c nfsv3 nfs_acl
rpcsec_gss_krb5 auth_rpcgss oid_registry nfsv4 nfs fscache lockd grace
sunrpc ipv6 dm_mirror dm_region_hash dm_log dm_mod ppdev floppy
parport_pc parport microcode pcspkr virtio_balloon sg 8139too 8139cp
mii i2c_piix4 i2c_core ext4 jbd2 mbcache sr_mod cdrom sd_mod pata_acpi
ata_generic ata_piix virtio_pci virtio_ring virtio [last unloaded:
speedstep_lib]
CPU: 0 PID: 0 Comm: swapper/0 Tainted: G        W       4.0.0+ #1
Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2007
task: ffffffff81a134a0 ti: ffffffff81a00000 task.ti: ffffffff81a00000
RIP: 0010:[<ffffffff810bbc88>]  [<ffffffff810bbc88>]
get_next_timer_interrupt+0x158/0x230
RSP: 0018:ffff88011fc03e48  EFLAGS: 00010013
RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffffffff81e05008
RDX: 0000000000000001 RSI: 0000000000000011 RDI: ffffffff81e04ef8
RBP: ffff88011fc03ea8 R08: 0000000000000011 R09: 0000000001000551
R10: ffff88011fc03e60 R11: ffff88011fc03e78 R12: 0000000140055030
R13: 0000000100055031 R14: ffffffff81e03ec0 R15: 0000000000000040
FS:  0000000000000000(0000) GS:ffff88011fc00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: 0000000000000018 CR3: 00000000d8d8f000 CR4: 00000000000006f0
Stack:
 ffff88011fc03e88 ffffffff810bbdf7 ffffffff81e04ef8 ffffffff81e052f8
 ffffffff81e056f8 ffffffff81e05af8 0000000000000000 ffff88011fc0f8a0
 0000000100055031 0000000000000000 ffff88011fc0bfc0 ffffffff81a00000
Call Trace:
 <IRQ>
 [<ffffffff810bbdf7>] ? call_timer_fn+0x47/0x110
 [<ffffffff810cdf1d>] tick_nohz_stop_sched_tick+0x1cd/0x310
 [<ffffffff810ce108>] __tick_nohz_idle_enter+0xa8/0x150
 [<ffffffff810ce1dd>] tick_nohz_irq_exit+0x2d/0x40
 [<ffffffff8105deaf>] irq_exit+0x9f/0xc0
 [<ffffffff815d34aa>] smp_apic_timer_interrupt+0x4a/0x59
 [<ffffffff815d1a3b>] apic_timer_interrupt+0x6b/0x70
 <EOI>
 [<ffffffff8100f100>] ? default_idle+0x20/0xb0
 [<ffffffff8100e74f>] arch_cpu_idle+0xf/0x20
 [<ffffffff810986a9>] cpuidle_idle_call+0x89/0x220
 [<ffffffff81078232>] ? __atomic_notifier_call_chain+0x12/0x20
 [<ffffffff81098975>] cpu_idle_loop+0x135/0x1f0
 [<ffffffff81098a43>] cpu_startup_entry+0x13/0x20
 [<ffffffff815c5e1c>] rest_init+0x7c/0x80
 [<ffffffff81b4e372>] start_kernel+0x3d8/0x3df
 [<ffffffff81b4ddb8>] ? set_init_arg+0x5d/0x5d
 [<ffffffff815cb906>] ? memblock_reserve+0x4c/0x51
 [<ffffffff81b4d5ad>] x86_64_start_reservations+0x2a/0x2c
 [<ffffffff81b4d6e4>] x86_64_start_kernel+0x135/0x13c
Code: 00 48 89 45 c8 45 89 c8 41 83 e0 3f 44 89 c6 0f 1f 40 00 48 63
ce 48 c1 e1 04 48 8b 04 39 48 8d 0c 0f 48 39 c8 74 22 0f 1f 40 00 <f6>
40 18 01 75 10 48 8b 50 10 48 39 da 48 0f 48 da ba 01 00 00
RIP  [<ffffffff810bbc88>] get_next_timer_interrupt+0x158/0x230
 RSP <ffff88011fc03e48>
CR2: 0000000000000018

On Tue, Apr 28, 2015 at 12:43 PM, Dave Chinner <david@fromorbit.com> wrote:
> On Tue, Apr 28, 2015 at 10:01:07AM +0800, Li Xi wrote:
>> Hi Dave,
>>
>> I ran xfstests on the kernel with this series of patches.
>> Unfortunately, 5 test suits failed. But I don't think they are caused
>> by this patch. Following is the result. Please let me know if there is
>> any problem about it.
>>
>> Output of xfstests:
>>
>> FSTYP         -- xfs (non-debug)
>> PLATFORM      -- Linux/x86_64 vm15 4.0.0+
>> MKFS_OPTIONS  -- -f -bsize=4096 /dev/sdb2
>> MOUNT_OPTIONS -- /dev/sdb2 /mnt/scratch
>>
>> generic/001 3s ... 2s
>> generic/002 0s ... 0s
>> generic/003 10s ... 10s
>> generic/004     [not run] xfs_io flink support is missing
>> generic/005 0s ... 0s
>> generic/006 1s ... 0s
>> generic/007 0s ... 0s
>> generic/008     [not run] xfs_io fzero support is missing
>> generic/009     [not run] xfs_io fzero support is missing
>> generic/010 1s ... 0s
>> generic/011 1s ... 0s
>> generic/012     [not run] xfs_io fpunch support is missing
>> generic/013 92s ... 90s
>> generic/014 3s ... 3s
>> generic/015 1s ... 1s
>> generic/016     [not run] xfs_io fpunch support is missing
>> generic/017     [not run] xfs_io fiemap support is missing
>> generic/018     [not run] xfs_io fiemap support is missing
>
> You really need to update your xfsprogs install. You aren't testing
> half of what you need to be testing if you are missing basic
> functionality like fiemap support (which has been in xfs_io since
> 2011).
>
>> generic/020 38s ... 31s
>> generic/021     [not run] xfs_io fpunch support is missing
>> generic/022     [not run] xfs_io fpunch support is missing
>> generic/023 1s ... 0s
>> generic/024 1s ... 0s
>> generic/025 0s ... 0s
>> generic/026 0s ... 0s
>> generic/027 57s ... 57s
>> generic/028 5s ... 5s
>> generic/053 1s ... 2s
>> generic/062 1s ... 2s
>> generic/068 60s ... 61s
>> generic/069 4s ... 3s
>> generic/070 13s ... 14s
>> generic/074 164s ... 162s
>> generic/075 87s ... 86s
>> generic/076 1s ... 1s
>> generic/077     [not run] fsgqa user not defined.
>
> ANd if you don't have this user defined, then several quota tests
> don't get run.
>
>> generic/079 1s ... 1s
>> generic/083 36s ... 39s
>> generic/088 1s ... 0s
>> generic/089 4s ... 4s
>> generic/091 62s ... 62s
>> generic/093     [not run] not suitable for this OS: Linux
>> generic/097     [not run] not suitable for this OS: Linux
>> generic/099     [not run] not suitable for this OS: Linux
>> generic/100 12s ... 12s
>> generic/105 0s ... 0s
>> generic/112     [not run] fsx not built with AIO for this platform
>> generic/113     [not run] aio-stress not built for this platform
>
> Ouch. There's another whole class of functionality you aren't
> testing.
>
>> generic/299     [not run]  utility required, skipped this test
>> generic/300     [not run] xfs_io fpunch support is missing
>> generic/306     - output mismatch (see
>> /root/work/quota/ext4_inode_field/xfstests.git/results//generic/306.out.bad)
>>     --- tests/generic/306.out    2014-07-16 10:19:26.196995657 +0800
>>     +++ /root/work/quota/ext4_inode_field/xfstests.git/results//generic/306.out.bad
>>    2015-04-27 22:40:13.365445316 +0800
>>     @@ -2,11 +2,9 @@
>>      == try to create new file
>>      touch: cannot touch 'SCRATCH_MNT/this_should_fail': Read-only file system
>>      == pwrite to null device
>>     -wrote 512/512 bytes at offset 0
>>     -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
>>     +xfs_io: specified file ["/mnt/scratch/devnull"] is not on an XFS filesystem
>>      == pread from zero device
>>     ...
>>     (Run 'diff -u tests/generic/306.out
>> /root/work/quota/ext4_inode_field/xfstests.git/results//generic/306.out.bad'
>>  to see the entire diff)
>
> That's caused by having a very old xfs_io.
>
>> xfs/229 134s ... [failed, exit status 23] - output mismatch (see
>> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/229.out.bad)
>>     --- tests/xfs/229.out    2014-07-16 10:19:26.215995657 +0800
>>     +++ /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/229.out.bad
>>    2015-04-27 23:25:48.709093428 +0800
>>     @@ -1,4 +1,31 @@
>>      QA output created by 229
>>      generating 10 files
>>     +Write did not return correct amount
>>     +Write did not return correct amount
>>     +Write did not return correct amount
>>     +Write did not return correct amount
>>      comparing files
>
> Can't say that I've seen that one fail for a long time. I can't say
> anything useful about it, however, given how old your xfsprogs
> installation is.
>
>>     ...
>>     (Run 'diff -u tests/xfs/229.out
>> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/229.out.bad'
>>  to see the entire diff)
>> xfs/238 1s ... 1s
>> xfs/242     [not run] zero command not supported
>> xfs/244 2s ... 2s
>> xfs/250     [failed, exit status 1] - output mismatch (see
>> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/250.out.bad)
>>     --- tests/xfs/250.out    2014-07-16 10:19:26.215995657 +0800
>>     +++ /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/250.out.bad
>>    2015-04-27 23:26:15.137452337 +0800
>>     @@ -11,4 +11,4 @@
>>      *** preallocate large file
>>      *** unmount loop filesystem
>>      *** check loop filesystem
>>     -*** done
>>     +_check_xfs_filesystem: filesystem on /mnt/test/250.fs is
>> inconsistent (r) (see
>> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/250.full)
>>     ...
>>     (Run 'diff -u tests/xfs/250.out
>> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/250.out.bad'
>>  to see the entire diff)
>
> Your xfstests is not up to date. This is fixed by commit ee6ad7f
> ("xfs/049: umount -d fails when kernel wins teardown race").
>
>> xfs/301     - output mismatch (see
>> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/301.out.bad)
>>     --- tests/xfs/301.out    2014-07-16 10:19:26.217995657 +0800
>>     +++ /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/301.out.bad
>>    2015-04-27 23:33:33.629182381 +0800
>>     @@ -29,18 +29,21 @@
>>      Attribute "attr4" had a 10 byte value for DUMP_DIR/sub/biggg:
>>      some_text4
>>      EAs on restore
>>     +getfattr: /mnt/scratch/restoredir/dumpdir: No such file or directory
>>     +getfattr: /mnt/scratch/restoredir/dumpdir: No such file or directory
>>      User names
>>     -Attribute "attr5" had a 8 byte value for DUMP_DIR/dir:
>>     ...
>>     (Run 'diff -u tests/xfs/301.out
>
> $ ./lsqa.pl tests/xfs/301
> FS QA Test No. 301
>
> Verify multi-stream xfsdump/restore preserves extended attributes
>
> $
>
> Your xfsdump package is out of date and needs upgrading.
>
>> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/301.out.bad'
>>  to see the entire diff)
>> xfs/302     [failed, exit status 1] - output mismatch (see
>> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/302.out.bad)
>>     --- tests/xfs/302.out    2014-07-16 10:19:26.217995657 +0800
>>     +++ /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/302.out.bad
>>    2015-04-27 23:33:46.102767709 +0800
>>     @@ -1,2 +1,4 @@
>>      QA output created by 302
>>      Silence is golden.
>>     +dump failed
>>     +(see /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/302.full
>> for details)
>>     ...
>>     (Run 'diff -u tests/xfs/302.out
>> /root/work/quota/ext4_inode_field/xfstests.git/results//xfs/302.out.bad'
>>  to see the entire diff)
>
> Same again.
>
> You need to upgrade everything to current xfstests/xfsprogs/xfsdump
> and retest *everything*. That means rerunning all your ext4 testing,
> too, because you're not exercising all the cases where the
> interesting accounting bugs lie (i.e. in fallocate operations).
>
> I'd also suggest that you run the tests using MOUNT_OPTIONS="-o
> pquota" after setting up default configurations for TEST_MNT and
> SCRATCH_MNT so that you actually give the project quota code a
> significant amount of work to do, and do the same for ext4,
> otherwise you're not really testing it at all when you run xfstests
> on ext4....
>
> Cheers,
>
> Dave.
> --
> Dave Chinner
> david@fromorbit.com
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jan Kara April 29, 2015, 7:59 a.m. UTC | #6
Hi,

On Wed 29-04-15 13:49:08, Li Xi wrote:
> Thanks for the advices. I tried to run latest xfstests again. However,
  Dave actually asked you to update 'xfsprogs' not xfstests. Not that
updating xfstests would be a wrong thing to do but you still need to update
xfsprogs for xfstests to be able to run some tests. But that's unrelated to
the oops you reported below.

> the kernel crashed when runing generic/051 generic/054 and
> generic/055. And please note that the kernel also crashed on original
> linux-4.0 without any of my patches. Following is one of the dump
> stack:
  It looks like some issue with timers. John, Thomas, any idea?

								Honza

> run fstests generic/055 at 2015-04-29 13:43:39
> ------------[ cut here ]------------
> WARNING: CPU: 0 PID: 31915 at lib/list_debug.c:33 __list_add+0xbe/0xd0()
> list_add corruption. prev->next should be next (ffffffff81e05018), but
> was           (null). (prev=ffff8800d8ff3ca0).
> Modules linked in: dm_flakey xfs exportfs libcrc32c nfsv3 nfs_acl
> rpcsec_gss_krb5 auth_rpcgss oid_registry nfsv4 nfs fscache lockd grace
> sunrpc ipv6 dm_mirror dm_region_hash dm_log dm_mod ppdev floppy
> parport_pc parport microcode pcspkr virtio_balloon sg 8139too 8139cp
> mii i2c_piix4 i2c_core ext4 jbd2 mbcache sr_mod cdrom sd_mod pata_acpi
> ata_generic ata_piix virtio_pci virtio_ring virtio [last unloaded:
> speedstep_lib]
> CPU: 0 PID: 31915 Comm: kworker/0:0 Not tainted 4.0.0+ #1
> Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2007
> Workqueue: events vmstat_shepherd
>  0000000000000021 ffff8800db177bf8 ffffffff815ccaf6 0000000000000021
>  ffff8800db177c48 ffff8800db177c38 ffffffff81059fc5 ffff8800db177c38
>  ffffffff81a8d480 ffffffff81e05018 ffff8800d8ff3ca0 0000000000000000
> Call Trace:
>  [<ffffffff815ccaf6>] dump_stack+0x48/0x5a
>  [<ffffffff81059fc5>] warn_slowpath_common+0x95/0xe0
>  [<ffffffff8105a0c6>] warn_slowpath_fmt+0x46/0x70
>  [<ffffffff812c04fe>] __list_add+0xbe/0xd0
>  [<ffffffff810bb84b>] __internal_add_timer+0x9b/0x110
>  [<ffffffff810bb8f9>] internal_add_timer+0x39/0x90
>  [<ffffffff810bd8c9>] mod_timer+0xf9/0x1d0
>  [<ffffffff810bd9b8>] add_timer+0x18/0x30
>  [<ffffffff81071a22>] __queue_delayed_work+0x92/0x1a0
>  [<ffffffff81071bcd>] queue_delayed_work_on+0x1d/0x40
>  [<ffffffff81160d5c>] vmstat_shepherd+0x10c/0x120
>  [<ffffffff810722ed>] process_one_work+0x14d/0x440
>  [<ffffffff810726ff>] worker_thread+0x11f/0x3d0
>  [<ffffffff815ccfaf>] ? __schedule+0x36f/0x800
>  [<ffffffff810725e0>] ? process_one_work+0x440/0x440
>  [<ffffffff810725e0>] ? process_one_work+0x440/0x440
>  [<ffffffff810774ce>] kthread+0xce/0xf0
>  [<ffffffff8104d96e>] ? __do_page_fault+0x17e/0x430
>  [<ffffffff81077400>] ? kthread_freezable_should_stop+0x70/0x70
>  [<ffffffff815d1052>] ret_from_fork+0x42/0x70
>  [<ffffffff81077400>] ? kthread_freezable_should_stop+0x70/0x70
> ---[ end trace 97c6b752be15ac57 ]---
> XFS (sdb2): Mounting V4 Filesystem
> XFS (sdb2): Ending clean mount
> XFS (sdb2): Quotacheck needed: Please wait.
> XFS (sdb2): Quotacheck: Done.
> XFS (sdb2): xfs_log_force: error -5 returned.
> XFS (sdb2): xfs_log_force: error -5 returned.
> XFS (sdb2): xfs_log_force: error -5 returned.
> BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
> IP: [<ffffffff810bbc88>] get_next_timer_interrupt+0x158/0x230
> PGD d8e7a067 PUD db654067 PMD 0
> Oops: 0000 [#1] SMP
> Modules linked in: dm_flakey xfs exportfs libcrc32c nfsv3 nfs_acl
> rpcsec_gss_krb5 auth_rpcgss oid_registry nfsv4 nfs fscache lockd grace
> sunrpc ipv6 dm_mirror dm_region_hash dm_log dm_mod ppdev floppy
> parport_pc parport microcode pcspkr virtio_balloon sg 8139too 8139cp
> mii i2c_piix4 i2c_core ext4 jbd2 mbcache sr_mod cdrom sd_mod pata_acpi
> ata_generic ata_piix virtio_pci virtio_ring virtio [last unloaded:
> speedstep_lib]
> CPU: 0 PID: 0 Comm: swapper/0 Tainted: G        W       4.0.0+ #1
> Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2007
> task: ffffffff81a134a0 ti: ffffffff81a00000 task.ti: ffffffff81a00000
> RIP: 0010:[<ffffffff810bbc88>]  [<ffffffff810bbc88>]
> get_next_timer_interrupt+0x158/0x230
> RSP: 0018:ffff88011fc03e48  EFLAGS: 00010013
> RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffffffff81e05008
> RDX: 0000000000000001 RSI: 0000000000000011 RDI: ffffffff81e04ef8
> RBP: ffff88011fc03ea8 R08: 0000000000000011 R09: 0000000001000551
> R10: ffff88011fc03e60 R11: ffff88011fc03e78 R12: 0000000140055030
> R13: 0000000100055031 R14: ffffffff81e03ec0 R15: 0000000000000040
> FS:  0000000000000000(0000) GS:ffff88011fc00000(0000) knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
> CR2: 0000000000000018 CR3: 00000000d8d8f000 CR4: 00000000000006f0
> Stack:
>  ffff88011fc03e88 ffffffff810bbdf7 ffffffff81e04ef8 ffffffff81e052f8
>  ffffffff81e056f8 ffffffff81e05af8 0000000000000000 ffff88011fc0f8a0
>  0000000100055031 0000000000000000 ffff88011fc0bfc0 ffffffff81a00000
> Call Trace:
>  <IRQ>
>  [<ffffffff810bbdf7>] ? call_timer_fn+0x47/0x110
>  [<ffffffff810cdf1d>] tick_nohz_stop_sched_tick+0x1cd/0x310
>  [<ffffffff810ce108>] __tick_nohz_idle_enter+0xa8/0x150
>  [<ffffffff810ce1dd>] tick_nohz_irq_exit+0x2d/0x40
>  [<ffffffff8105deaf>] irq_exit+0x9f/0xc0
>  [<ffffffff815d34aa>] smp_apic_timer_interrupt+0x4a/0x59
>  [<ffffffff815d1a3b>] apic_timer_interrupt+0x6b/0x70
>  <EOI>
>  [<ffffffff8100f100>] ? default_idle+0x20/0xb0
>  [<ffffffff8100e74f>] arch_cpu_idle+0xf/0x20
>  [<ffffffff810986a9>] cpuidle_idle_call+0x89/0x220
>  [<ffffffff81078232>] ? __atomic_notifier_call_chain+0x12/0x20
>  [<ffffffff81098975>] cpu_idle_loop+0x135/0x1f0
>  [<ffffffff81098a43>] cpu_startup_entry+0x13/0x20
>  [<ffffffff815c5e1c>] rest_init+0x7c/0x80
>  [<ffffffff81b4e372>] start_kernel+0x3d8/0x3df
>  [<ffffffff81b4ddb8>] ? set_init_arg+0x5d/0x5d
>  [<ffffffff815cb906>] ? memblock_reserve+0x4c/0x51
>  [<ffffffff81b4d5ad>] x86_64_start_reservations+0x2a/0x2c
>  [<ffffffff81b4d6e4>] x86_64_start_kernel+0x135/0x13c
> Code: 00 48 89 45 c8 45 89 c8 41 83 e0 3f 44 89 c6 0f 1f 40 00 48 63
> ce 48 c1 e1 04 48 8b 04 39 48 8d 0c 0f 48 39 c8 74 22 0f 1f 40 00 <f6>
> 40 18 01 75 10 48 8b 50 10 48 39 da 48 0f 48 da ba 01 00 00
> RIP  [<ffffffff810bbc88>] get_next_timer_interrupt+0x158/0x230
>  RSP <ffff88011fc03e48>
> CR2: 0000000000000018
Li Xi April 29, 2015, 11:45 a.m. UTC | #7
On Wed, Apr 29, 2015 at 3:59 PM, Jan Kara <jack@suse.cz> wrote:
>   Hi,
>
> On Wed 29-04-15 13:49:08, Li Xi wrote:
>> Thanks for the advices. I tried to run latest xfstests again. However,
>   Dave actually asked you to update 'xfsprogs' not xfstests. Not that
> updating xfstests would be a wrong thing to do but you still need to update
> xfsprogs for xfstests to be able to run some tests. But that's unrelated to
> the oops you reported below.
Understood. I updated both xfstests and xfsprogs to the latest version from git
repository. However, I didn't update xfsdump because of a build failure caused
by missing definitons of 'min' and 'max'
>
>> the kernel crashed when runing generic/051 generic/054 and
>> generic/055. And please note that the kernel also crashed on original
>> linux-4.0 without any of my patches. Following is one of the dump
>> stack:
>   It looks like some issue with timers. John, Thomas, any idea?
>
>                                                                 Honza
>
>> run fstests generic/055 at 2015-04-29 13:43:39
>> ------------[ cut here ]------------
>> WARNING: CPU: 0 PID: 31915 at lib/list_debug.c:33 __list_add+0xbe/0xd0()
>> list_add corruption. prev->next should be next (ffffffff81e05018), but
>> was           (null). (prev=ffff8800d8ff3ca0).
>> Modules linked in: dm_flakey xfs exportfs libcrc32c nfsv3 nfs_acl
>> rpcsec_gss_krb5 auth_rpcgss oid_registry nfsv4 nfs fscache lockd grace
>> sunrpc ipv6 dm_mirror dm_region_hash dm_log dm_mod ppdev floppy
>> parport_pc parport microcode pcspkr virtio_balloon sg 8139too 8139cp
>> mii i2c_piix4 i2c_core ext4 jbd2 mbcache sr_mod cdrom sd_mod pata_acpi
>> ata_generic ata_piix virtio_pci virtio_ring virtio [last unloaded:
>> speedstep_lib]
>> CPU: 0 PID: 31915 Comm: kworker/0:0 Not tainted 4.0.0+ #1
>> Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2007
>> Workqueue: events vmstat_shepherd
>>  0000000000000021 ffff8800db177bf8 ffffffff815ccaf6 0000000000000021
>>  ffff8800db177c48 ffff8800db177c38 ffffffff81059fc5 ffff8800db177c38
>>  ffffffff81a8d480 ffffffff81e05018 ffff8800d8ff3ca0 0000000000000000
>> Call Trace:
>>  [<ffffffff815ccaf6>] dump_stack+0x48/0x5a
>>  [<ffffffff81059fc5>] warn_slowpath_common+0x95/0xe0
>>  [<ffffffff8105a0c6>] warn_slowpath_fmt+0x46/0x70
>>  [<ffffffff812c04fe>] __list_add+0xbe/0xd0
>>  [<ffffffff810bb84b>] __internal_add_timer+0x9b/0x110
>>  [<ffffffff810bb8f9>] internal_add_timer+0x39/0x90
>>  [<ffffffff810bd8c9>] mod_timer+0xf9/0x1d0
>>  [<ffffffff810bd9b8>] add_timer+0x18/0x30
>>  [<ffffffff81071a22>] __queue_delayed_work+0x92/0x1a0
>>  [<ffffffff81071bcd>] queue_delayed_work_on+0x1d/0x40
>>  [<ffffffff81160d5c>] vmstat_shepherd+0x10c/0x120
>>  [<ffffffff810722ed>] process_one_work+0x14d/0x440
>>  [<ffffffff810726ff>] worker_thread+0x11f/0x3d0
>>  [<ffffffff815ccfaf>] ? __schedule+0x36f/0x800
>>  [<ffffffff810725e0>] ? process_one_work+0x440/0x440
>>  [<ffffffff810725e0>] ? process_one_work+0x440/0x440
>>  [<ffffffff810774ce>] kthread+0xce/0xf0
>>  [<ffffffff8104d96e>] ? __do_page_fault+0x17e/0x430
>>  [<ffffffff81077400>] ? kthread_freezable_should_stop+0x70/0x70
>>  [<ffffffff815d1052>] ret_from_fork+0x42/0x70
>>  [<ffffffff81077400>] ? kthread_freezable_should_stop+0x70/0x70
>> ---[ end trace 97c6b752be15ac57 ]---
>> XFS (sdb2): Mounting V4 Filesystem
>> XFS (sdb2): Ending clean mount
>> XFS (sdb2): Quotacheck needed: Please wait.
>> XFS (sdb2): Quotacheck: Done.
>> XFS (sdb2): xfs_log_force: error -5 returned.
>> XFS (sdb2): xfs_log_force: error -5 returned.
>> XFS (sdb2): xfs_log_force: error -5 returned.
>> BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
>> IP: [<ffffffff810bbc88>] get_next_timer_interrupt+0x158/0x230
>> PGD d8e7a067 PUD db654067 PMD 0
>> Oops: 0000 [#1] SMP
>> Modules linked in: dm_flakey xfs exportfs libcrc32c nfsv3 nfs_acl
>> rpcsec_gss_krb5 auth_rpcgss oid_registry nfsv4 nfs fscache lockd grace
>> sunrpc ipv6 dm_mirror dm_region_hash dm_log dm_mod ppdev floppy
>> parport_pc parport microcode pcspkr virtio_balloon sg 8139too 8139cp
>> mii i2c_piix4 i2c_core ext4 jbd2 mbcache sr_mod cdrom sd_mod pata_acpi
>> ata_generic ata_piix virtio_pci virtio_ring virtio [last unloaded:
>> speedstep_lib]
>> CPU: 0 PID: 0 Comm: swapper/0 Tainted: G        W       4.0.0+ #1
>> Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2007
>> task: ffffffff81a134a0 ti: ffffffff81a00000 task.ti: ffffffff81a00000
>> RIP: 0010:[<ffffffff810bbc88>]  [<ffffffff810bbc88>]
>> get_next_timer_interrupt+0x158/0x230
>> RSP: 0018:ffff88011fc03e48  EFLAGS: 00010013
>> RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffffffff81e05008
>> RDX: 0000000000000001 RSI: 0000000000000011 RDI: ffffffff81e04ef8
>> RBP: ffff88011fc03ea8 R08: 0000000000000011 R09: 0000000001000551
>> R10: ffff88011fc03e60 R11: ffff88011fc03e78 R12: 0000000140055030
>> R13: 0000000100055031 R14: ffffffff81e03ec0 R15: 0000000000000040
>> FS:  0000000000000000(0000) GS:ffff88011fc00000(0000) knlGS:0000000000000000
>> CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
>> CR2: 0000000000000018 CR3: 00000000d8d8f000 CR4: 00000000000006f0
>> Stack:
>>  ffff88011fc03e88 ffffffff810bbdf7 ffffffff81e04ef8 ffffffff81e052f8
>>  ffffffff81e056f8 ffffffff81e05af8 0000000000000000 ffff88011fc0f8a0
>>  0000000100055031 0000000000000000 ffff88011fc0bfc0 ffffffff81a00000
>> Call Trace:
>>  <IRQ>
>>  [<ffffffff810bbdf7>] ? call_timer_fn+0x47/0x110
>>  [<ffffffff810cdf1d>] tick_nohz_stop_sched_tick+0x1cd/0x310
>>  [<ffffffff810ce108>] __tick_nohz_idle_enter+0xa8/0x150
>>  [<ffffffff810ce1dd>] tick_nohz_irq_exit+0x2d/0x40
>>  [<ffffffff8105deaf>] irq_exit+0x9f/0xc0
>>  [<ffffffff815d34aa>] smp_apic_timer_interrupt+0x4a/0x59
>>  [<ffffffff815d1a3b>] apic_timer_interrupt+0x6b/0x70
>>  <EOI>
>>  [<ffffffff8100f100>] ? default_idle+0x20/0xb0
>>  [<ffffffff8100e74f>] arch_cpu_idle+0xf/0x20
>>  [<ffffffff810986a9>] cpuidle_idle_call+0x89/0x220
>>  [<ffffffff81078232>] ? __atomic_notifier_call_chain+0x12/0x20
>>  [<ffffffff81098975>] cpu_idle_loop+0x135/0x1f0
>>  [<ffffffff81098a43>] cpu_startup_entry+0x13/0x20
>>  [<ffffffff815c5e1c>] rest_init+0x7c/0x80
>>  [<ffffffff81b4e372>] start_kernel+0x3d8/0x3df
>>  [<ffffffff81b4ddb8>] ? set_init_arg+0x5d/0x5d
>>  [<ffffffff815cb906>] ? memblock_reserve+0x4c/0x51
>>  [<ffffffff81b4d5ad>] x86_64_start_reservations+0x2a/0x2c
>>  [<ffffffff81b4d6e4>] x86_64_start_kernel+0x135/0x13c
>> Code: 00 48 89 45 c8 45 89 c8 41 83 e0 3f 44 89 c6 0f 1f 40 00 48 63
>> ce 48 c1 e1 04 48 8b 04 39 48 8d 0c 0f 48 39 c8 74 22 0f 1f 40 00 <f6>
>> 40 18 01 75 10 48 8b 50 10 48 39 da 48 0f 48 da ba 01 00 00
>> RIP  [<ffffffff810bbc88>] get_next_timer_interrupt+0x158/0x230
>>  RSP <ffff88011fc03e48>
>> CR2: 0000000000000018
> --
> Jan Kara <jack@suse.cz>
> SUSE Labs, CR
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Dave Chinner April 29, 2015, 10:07 p.m. UTC | #8
On Wed, Apr 29, 2015 at 07:45:40PM +0800, Li Xi wrote:
> On Wed, Apr 29, 2015 at 3:59 PM, Jan Kara <jack@suse.cz> wrote:
> >   Hi,
> >
> > On Wed 29-04-15 13:49:08, Li Xi wrote:
> >> Thanks for the advices. I tried to run latest xfstests again. However,
> >   Dave actually asked you to update 'xfsprogs' not xfstests. Not that
> > updating xfstests would be a wrong thing to do but you still need to update
> > xfsprogs for xfstests to be able to run some tests. But that's unrelated to
> > the oops you reported below.
> Understood. I updated both xfstests and xfsprogs to the latest version from git
> repository. However, I didn't update xfsdump because of a build failure caused
> by missing definitons of 'min' and 'max'

The /usr/include/xfs header files are stale. Upgrade your
xfslibs-dev package, if there is one for your distro.

And, please, report package build failures to the appropriate list,
next time, rather than ignoring them?

Cheers,

Dave.
Li Xi June 4, 2015, 3:29 p.m. UTC | #9
Hi,

I tried hard to run xfstests on original linux-4.0. In order to do so,
I skipped some of the tests which cause kernel crash. However, about
ten tests were skipped. But the crash seems endless. I was using the
latest xfstests from git repository. I guess there is some mismatch
between the versions of XFS and xfstests that I used? Should I use
some special version of xfstests or XFS? Please advise.

Regards,
Li Xi

On Thu, Apr 30, 2015 at 6:07 AM, Dave Chinner <david@fromorbit.com> wrote:
> On Wed, Apr 29, 2015 at 07:45:40PM +0800, Li Xi wrote:
>> On Wed, Apr 29, 2015 at 3:59 PM, Jan Kara <jack@suse.cz> wrote:
>> >   Hi,
>> >
>> > On Wed 29-04-15 13:49:08, Li Xi wrote:
>> >> Thanks for the advices. I tried to run latest xfstests again. However,
>> >   Dave actually asked you to update 'xfsprogs' not xfstests. Not that
>> > updating xfstests would be a wrong thing to do but you still need to update
>> > xfsprogs for xfstests to be able to run some tests. But that's unrelated to
>> > the oops you reported below.
>> Understood. I updated both xfstests and xfsprogs to the latest version from git
>> repository. However, I didn't update xfsdump because of a build failure caused
>> by missing definitons of 'min' and 'max'
>
> The /usr/include/xfs header files are stale. Upgrade your
> xfslibs-dev package, if there is one for your distro.
>
> And, please, report package build failures to the appropriate list,
> next time, rather than ignoring them?
>
> Cheers,
>
> Dave.
> --
> Dave Chinner
> david@fromorbit.com
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Dmitry Monakhov June 5, 2015, 7:45 a.m. UTC | #10
Li Xi <pkuelelixi@gmail.com> writes:

> Hi,
>
> I tried hard to run xfstests on original linux-4.0. In order to do so,
> I skipped some of the tests which cause kernel crash. However, about
> ten tests were skipped. But the crash seems endless. I was using the
> latest xfstests from git repository. I guess there is some mismatch
> between the versions of XFS and xfstests that I used? Should I use
> some special version of xfstests or XFS? Please advise.
IMHO, the best version of the test is the one which cause a kernel crash.
So your have got the best one. But as far as Jan already mentioned this
is likely core mm/timer issue, not XFS specific one.
Google points me that code affected was changed here https://lkml.org/lkml/2015/3/26/14
Likely that you can trigger the crush w/o your patches. Is it correct?
You can try to fix original bug, or simply migrate patches to some
recent stable kernel version.

>
> Regards,
> Li Xi
>
> On Thu, Apr 30, 2015 at 6:07 AM, Dave Chinner <david@fromorbit.com> wrote:
>> On Wed, Apr 29, 2015 at 07:45:40PM +0800, Li Xi wrote:
>>> On Wed, Apr 29, 2015 at 3:59 PM, Jan Kara <jack@suse.cz> wrote:
>>> >   Hi,
>>> >
>>> > On Wed 29-04-15 13:49:08, Li Xi wrote:
>>> >> Thanks for the advices. I tried to run latest xfstests again. However,
>>> >   Dave actually asked you to update 'xfsprogs' not xfstests. Not that
>>> > updating xfstests would be a wrong thing to do but you still need to update
>>> > xfsprogs for xfstests to be able to run some tests. But that's unrelated to
>>> > the oops you reported below.
>>> Understood. I updated both xfstests and xfsprogs to the latest version from git
>>> repository. However, I didn't update xfsdump because of a build failure caused
>>> by missing definitons of 'min' and 'max'
>>
>> The /usr/include/xfs header files are stale. Upgrade your
>> xfslibs-dev package, if there is one for your distro.
>>
>> And, please, report package build failures to the appropriate list,
>> next time, rather than ignoring them?
>>
>> Cheers,
>>
>> Dave.
>> --
>> Dave Chinner
>> david@fromorbit.com
diff mbox

Patch

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 0729a42..9995c53 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -384,6 +384,13 @@  struct flex_groups {
 #define EXT4_FL_USER_VISIBLE		0x304BDFFF /* User visible flags */
 #define EXT4_FL_USER_MODIFIABLE		0x204380FF /* User modifiable flags */
 
+#define EXT4_FL_XFLAG_VISIBLE		(EXT4_SYNC_FL | \
+					 EXT4_IMMUTABLE_FL | \
+					 EXT4_APPEND_FL | \
+					 EXT4_NODUMP_FL | \
+					 EXT4_NOATIME_FL | \
+					 EXT4_PROJINHERIT_FL)
+
 /* Flags that should be inherited by new inodes from their parent. */
 #define EXT4_FL_INHERITED (EXT4_SECRM_FL | EXT4_UNRM_FL | EXT4_COMPR_FL |\
 			   EXT4_SYNC_FL | EXT4_NODUMP_FL | EXT4_NOATIME_FL |\
@@ -618,6 +625,8 @@  enum {
 #define EXT4_IOC_SET_ENCRYPTION_POLICY	_IOR('f', 19, struct ext4_encryption_policy)
 #define EXT4_IOC_GET_ENCRYPTION_PWSALT	_IOW('f', 20, __u8[16])
 #define EXT4_IOC_GET_ENCRYPTION_POLICY	_IOW('f', 21, struct ext4_encryption_policy)
+#define EXT4_IOC_FSGETXATTR		FS_IOC_FSGETXATTR
+#define EXT4_IOC_FSSETXATTR		FS_IOC_FSSETXATTR
 
 #if defined(__KERNEL__) && defined(CONFIG_COMPAT)
 /*
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
index 2cb9e17..100b774 100644
--- a/fs/ext4/ioctl.c
+++ b/fs/ext4/ioctl.c
@@ -14,6 +14,7 @@ 
 #include <linux/mount.h>
 #include <linux/file.h>
 #include <linux/random.h>
+#include <linux/quotaops.h>
 #include <asm/uaccess.h>
 #include "ext4_jbd2.h"
 #include "ext4.h"
@@ -206,6 +207,229 @@  static int uuid_is_zero(__u8 u[16])
 	return 1;
 }
 
+static int ext4_ioctl_setflags(struct inode *inode,
+			       unsigned int flags)
+{
+	struct ext4_inode_info *ei = EXT4_I(inode);
+	handle_t *handle = NULL;
+	int err = EPERM, migrate = 0;
+	struct ext4_iloc iloc;
+	unsigned int oldflags, mask, i;
+	unsigned int jflag;
+
+	/* Is it quota file? Do not allow user to mess with it */
+	if (IS_NOQUOTA(inode))
+		goto flags_out;
+
+	oldflags = ei->i_flags;
+
+	/* The JOURNAL_DATA flag is modifiable only by root */
+	jflag = flags & EXT4_JOURNAL_DATA_FL;
+
+	/*
+	 * The IMMUTABLE and APPEND_ONLY flags can only be changed by
+	 * the relevant capability.
+	 *
+	 * This test looks nicer. Thanks to Pauline Middelink
+	 */
+	if ((flags ^ oldflags) & (EXT4_APPEND_FL | EXT4_IMMUTABLE_FL)) {
+		if (!capable(CAP_LINUX_IMMUTABLE))
+			goto flags_out;
+	}
+
+	/*
+	 * The JOURNAL_DATA flag can only be changed by
+	 * the relevant capability.
+	 */
+	if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL)) {
+		if (!capable(CAP_SYS_RESOURCE))
+			goto flags_out;
+	}
+	if ((flags ^ oldflags) & EXT4_EXTENTS_FL)
+		migrate = 1;
+
+	if (flags & EXT4_EOFBLOCKS_FL) {
+		/* we don't support adding EOFBLOCKS flag */
+		if (!(oldflags & EXT4_EOFBLOCKS_FL)) {
+			err = -EOPNOTSUPP;
+			goto flags_out;
+		}
+	} else if (oldflags & EXT4_EOFBLOCKS_FL)
+		ext4_truncate(inode);
+
+	handle = ext4_journal_start(inode, EXT4_HT_INODE, 1);
+	if (IS_ERR(handle)) {
+		err = PTR_ERR(handle);
+		goto flags_out;
+	}
+	if (IS_SYNC(inode))
+		ext4_handle_sync(handle);
+	err = ext4_reserve_inode_write(handle, inode, &iloc);
+	if (err)
+		goto flags_err;
+
+	for (i = 0, mask = 1; i < 32; i++, mask <<= 1) {
+		if (!(mask & EXT4_FL_USER_MODIFIABLE))
+			continue;
+		if (mask & flags)
+			ext4_set_inode_flag(inode, i);
+		else
+			ext4_clear_inode_flag(inode, i);
+	}
+
+	ext4_set_inode_flags(inode);
+	inode->i_ctime = ext4_current_time(inode);
+
+	err = ext4_mark_iloc_dirty(handle, inode, &iloc);
+flags_err:
+	ext4_journal_stop(handle);
+	if (err)
+		goto flags_out;
+
+	if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL))
+		err = ext4_change_inode_journal_flag(inode, jflag);
+	if (err)
+		goto flags_out;
+	if (migrate) {
+		if (flags & EXT4_EXTENTS_FL)
+			err = ext4_ext_migrate(inode);
+		else
+			err = ext4_ind_migrate(inode);
+	}
+
+flags_out:
+	return err;
+}
+
+static int ext4_ioctl_setproject(struct file *filp, __u32 projid)
+{
+	struct inode *inode = file_inode(filp);
+	struct super_block *sb = inode->i_sb;
+	struct ext4_inode_info *ei = EXT4_I(inode);
+	int err, rc;
+	handle_t *handle;
+	kprojid_t kprojid;
+	struct ext4_iloc iloc;
+	struct ext4_inode *raw_inode;
+	struct dquot *transfer_to[EXT4_MAXQUOTAS] = { };
+
+	if (!EXT4_HAS_RO_COMPAT_FEATURE(sb,
+			EXT4_FEATURE_RO_COMPAT_PROJECT)) {
+		BUG_ON(__kprojid_val(EXT4_I(inode)->i_projid)
+		       != EXT4_DEF_PROJID);
+		if (projid != EXT4_DEF_PROJID)
+			return -EOPNOTSUPP;
+		else
+			return 0;
+	}
+
+	if (EXT4_INODE_SIZE(sb) <= EXT4_GOOD_OLD_INODE_SIZE)
+	    	return -EOPNOTSUPP;
+
+	kprojid = make_kprojid(&init_user_ns, (projid_t)projid);
+
+	if (projid_eq(kprojid, EXT4_I(inode)->i_projid))
+		return 0;
+
+	err = mnt_want_write_file(filp);
+	if (err)
+		return err;
+
+	err = -EPERM;
+	mutex_lock(&inode->i_mutex);
+	/* Is it quota file? Do not allow user to mess with it */
+	if (IS_NOQUOTA(inode))
+		goto out_unlock;
+
+	err = ext4_get_inode_loc(inode, &iloc);
+	if (err)
+		goto out_unlock;
+
+	raw_inode = ext4_raw_inode(&iloc);
+	if (!EXT4_FITS_IN_INODE(raw_inode, ei, i_projid)) {
+	    	err = -EOVERFLOW;
+	    	brelse(iloc.bh);
+	    	goto out_unlock;
+	}
+	brelse(iloc.bh);
+
+	dquot_initialize(inode);
+
+	handle = ext4_journal_start(inode, EXT4_HT_QUOTA,
+		EXT4_QUOTA_INIT_BLOCKS(sb) +
+		EXT4_QUOTA_DEL_BLOCKS(sb) + 3);
+	if (IS_ERR(handle)) {
+		err = PTR_ERR(handle);
+		goto out_unlock;
+	}
+
+	err = ext4_reserve_inode_write(handle, inode, &iloc);
+	if (err)
+		goto out_stop;
+
+	transfer_to[PRJQUOTA] = dqget(sb, make_kqid_projid(kprojid));
+	if (transfer_to[PRJQUOTA]) {
+		err = __dquot_transfer(inode, transfer_to);
+		dqput(transfer_to[PRJQUOTA]);
+		if (err)
+			goto out_dirty;
+	}
+
+	EXT4_I(inode)->i_projid = kprojid;
+	inode->i_ctime = ext4_current_time(inode);
+out_dirty:
+	rc = ext4_mark_iloc_dirty(handle, inode, &iloc);
+	if (!err)
+		err = rc;
+out_stop:
+	ext4_journal_stop(handle);
+out_unlock:
+	mutex_unlock(&inode->i_mutex);
+	mnt_drop_write_file(filp);
+	return err;
+}
+
+/* Transfer internal flags to xflags */
+static inline __u32 ext4_iflags_to_xflags(unsigned long iflags)
+{
+	__u32 xflags = 0;
+
+	if (iflags & EXT4_SYNC_FL)
+		xflags |= FS_XFLAG_SYNC;
+	if (iflags & EXT4_IMMUTABLE_FL)
+		xflags |= FS_XFLAG_IMMUTABLE;
+	if (iflags & EXT4_APPEND_FL)
+		xflags |= FS_XFLAG_APPEND;
+	if (iflags & EXT4_NODUMP_FL)
+		xflags |= FS_XFLAG_NODUMP;
+	if (iflags & EXT4_NOATIME_FL)
+		xflags |= FS_XFLAG_NOATIME;
+	if (iflags & EXT4_PROJINHERIT_FL)
+		xflags |= FS_XFLAG_PROJINHERIT;
+	return xflags;
+}
+
+/* Transfer xflags flags to internal */
+static inline unsigned long ext4_xflags_to_iflags(__u32 xflags)
+{
+	unsigned long iflags = 0;
+
+	if (xflags & FS_XFLAG_SYNC)
+		iflags |= EXT4_SYNC_FL;
+	if (xflags & FS_XFLAG_IMMUTABLE)
+		iflags |= EXT4_IMMUTABLE_FL;
+	if (xflags & FS_XFLAG_APPEND)
+		iflags |= EXT4_APPEND_FL;
+	if (xflags & FS_XFLAG_NODUMP)
+		iflags |= EXT4_NODUMP_FL;
+	if (xflags & FS_XFLAG_NOATIME)
+		iflags |= EXT4_NOATIME_FL;
+	if (xflags & FS_XFLAG_PROJINHERIT)
+		iflags |= EXT4_PROJINHERIT_FL;
+
+	return iflags;
+}
+
 long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 {
 	struct inode *inode = file_inode(filp);
@@ -221,11 +445,7 @@  long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 		flags = ei->i_flags & EXT4_FL_USER_VISIBLE;
 		return put_user(flags, (int __user *) arg);
 	case EXT4_IOC_SETFLAGS: {
-		handle_t *handle = NULL;
-		int err, migrate = 0;
-		struct ext4_iloc iloc;
-		unsigned int oldflags, mask, i;
-		unsigned int jflag;
+		int err;
 
 		if (!inode_owner_or_capable(inode))
 			return -EACCES;
@@ -239,89 +459,8 @@  long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 
 		flags = ext4_mask_flags(inode->i_mode, flags);
 
-		err = -EPERM;
 		mutex_lock(&inode->i_mutex);
-		/* Is it quota file? Do not allow user to mess with it */
-		if (IS_NOQUOTA(inode))
-			goto flags_out;
-
-		oldflags = ei->i_flags;
-
-		/* The JOURNAL_DATA flag is modifiable only by root */
-		jflag = flags & EXT4_JOURNAL_DATA_FL;
-
-		/*
-		 * The IMMUTABLE and APPEND_ONLY flags can only be changed by
-		 * the relevant capability.
-		 *
-		 * This test looks nicer. Thanks to Pauline Middelink
-		 */
-		if ((flags ^ oldflags) & (EXT4_APPEND_FL | EXT4_IMMUTABLE_FL)) {
-			if (!capable(CAP_LINUX_IMMUTABLE))
-				goto flags_out;
-		}
-
-		/*
-		 * The JOURNAL_DATA flag can only be changed by
-		 * the relevant capability.
-		 */
-		if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL)) {
-			if (!capable(CAP_SYS_RESOURCE))
-				goto flags_out;
-		}
-		if ((flags ^ oldflags) & EXT4_EXTENTS_FL)
-			migrate = 1;
-
-		if (flags & EXT4_EOFBLOCKS_FL) {
-			/* we don't support adding EOFBLOCKS flag */
-			if (!(oldflags & EXT4_EOFBLOCKS_FL)) {
-				err = -EOPNOTSUPP;
-				goto flags_out;
-			}
-		} else if (oldflags & EXT4_EOFBLOCKS_FL)
-			ext4_truncate(inode);
-
-		handle = ext4_journal_start(inode, EXT4_HT_INODE, 1);
-		if (IS_ERR(handle)) {
-			err = PTR_ERR(handle);
-			goto flags_out;
-		}
-		if (IS_SYNC(inode))
-			ext4_handle_sync(handle);
-		err = ext4_reserve_inode_write(handle, inode, &iloc);
-		if (err)
-			goto flags_err;
-
-		for (i = 0, mask = 1; i < 32; i++, mask <<= 1) {
-			if (!(mask & EXT4_FL_USER_MODIFIABLE))
-				continue;
-			if (mask & flags)
-				ext4_set_inode_flag(inode, i);
-			else
-				ext4_clear_inode_flag(inode, i);
-		}
-
-		ext4_set_inode_flags(inode);
-		inode->i_ctime = ext4_current_time(inode);
-
-		err = ext4_mark_iloc_dirty(handle, inode, &iloc);
-flags_err:
-		ext4_journal_stop(handle);
-		if (err)
-			goto flags_out;
-
-		if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL))
-			err = ext4_change_inode_journal_flag(inode, jflag);
-		if (err)
-			goto flags_out;
-		if (migrate) {
-			if (flags & EXT4_EXTENTS_FL)
-				err = ext4_ext_migrate(inode);
-			else
-				err = ext4_ind_migrate(inode);
-		}
-
-flags_out:
+		err = ext4_ioctl_setflags(inode, flags);
 		mutex_unlock(&inode->i_mutex);
 		mnt_drop_write_file(filp);
 		return err;
@@ -697,6 +836,60 @@  encryption_policy_out:
 		return -EOPNOTSUPP;
 #endif
 	}
+	case EXT4_IOC_FSGETXATTR:
+	{
+		struct fsxattr fa;
+
+		memset(&fa, 0, sizeof(struct fsxattr));
+		ext4_get_inode_flags(ei);
+		fa.fsx_xflags = ext4_iflags_to_xflags(ei->i_flags & EXT4_FL_USER_VISIBLE);
+
+		if (EXT4_HAS_RO_COMPAT_FEATURE(inode->i_sb,
+				EXT4_FEATURE_RO_COMPAT_PROJECT)) {
+			fa.fsx_projid = (__u32)from_kprojid(&init_user_ns,
+				EXT4_I(inode)->i_projid);
+		}
+
+		if (copy_to_user((struct fsxattr __user *)arg,
+				 &fa, sizeof(fa)))
+			return -EFAULT;
+		return 0;
+	}
+	case EXT4_IOC_FSSETXATTR:
+	{
+		struct fsxattr fa;
+		int err;
+
+		if (copy_from_user(&fa, (struct fsxattr __user *)arg,
+				   sizeof(fa)))
+			return -EFAULT;
+
+		/* Make sure caller has proper permission */
+		if (!inode_owner_or_capable(inode))
+			return -EACCES;
+
+		err = mnt_want_write_file(filp);
+		if (err)
+			return err;
+
+		flags = ext4_xflags_to_iflags(fa.fsx_xflags);
+		flags = ext4_mask_flags(inode->i_mode, flags);
+
+		mutex_lock(&inode->i_mutex);
+		flags = (ei->i_flags & ~EXT4_FL_XFLAG_VISIBLE) |
+			 (flags & EXT4_FL_XFLAG_VISIBLE);
+		err = ext4_ioctl_setflags(inode, flags);
+		mutex_unlock(&inode->i_mutex);
+		mnt_drop_write_file(filp);
+		if (err)
+			return err;
+
+		err = ext4_ioctl_setproject(filp, fa.fsx_projid);
+		if (err)
+			return err;
+
+		return 0;
+	}
 	default:
 		return -ENOTTY;
 	}
diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h
index 18dc721..64c7ae6 100644
--- a/fs/xfs/libxfs/xfs_fs.h
+++ b/fs/xfs/libxfs/xfs_fs.h
@@ -36,38 +36,25 @@  struct dioattr {
 #endif
 
 /*
- * Structure for XFS_IOC_FSGETXATTR[A] and XFS_IOC_FSSETXATTR.
- */
-#ifndef HAVE_FSXATTR
-struct fsxattr {
-	__u32		fsx_xflags;	/* xflags field value (get/set) */
-	__u32		fsx_extsize;	/* extsize field value (get/set)*/
-	__u32		fsx_nextents;	/* nextents field value (get)	*/
-	__u32		fsx_projid;	/* project identifier (get/set) */
-	unsigned char	fsx_pad[12];
-};
-#endif
-
-/*
  * Flags for the bs_xflags/fsx_xflags field
  * There should be a one-to-one correspondence between these flags and the
  * XFS_DIFLAG_s.
  */
-#define XFS_XFLAG_REALTIME	0x00000001	/* data in realtime volume */
-#define XFS_XFLAG_PREALLOC	0x00000002	/* preallocated file extents */
-#define XFS_XFLAG_IMMUTABLE	0x00000008	/* file cannot be modified */
-#define XFS_XFLAG_APPEND	0x00000010	/* all writes append */
-#define XFS_XFLAG_SYNC		0x00000020	/* all writes synchronous */
-#define XFS_XFLAG_NOATIME	0x00000040	/* do not update access time */
-#define XFS_XFLAG_NODUMP	0x00000080	/* do not include in backups */
-#define XFS_XFLAG_RTINHERIT	0x00000100	/* create with rt bit set */
-#define XFS_XFLAG_PROJINHERIT	0x00000200	/* create with parents projid */
-#define XFS_XFLAG_NOSYMLINKS	0x00000400	/* disallow symlink creation */
-#define XFS_XFLAG_EXTSIZE	0x00000800	/* extent size allocator hint */
-#define XFS_XFLAG_EXTSZINHERIT	0x00001000	/* inherit inode extent size */
-#define XFS_XFLAG_NODEFRAG	0x00002000  	/* do not defragment */
-#define XFS_XFLAG_FILESTREAM	0x00004000	/* use filestream allocator */
-#define XFS_XFLAG_HASATTR	0x80000000	/* no DIFLAG for this	*/
+#define XFS_XFLAG_REALTIME	FS_XFLAG_REALTIME	/* data in realtime volume */
+#define XFS_XFLAG_PREALLOC	FS_XFLAG_PREALLOC	/* preallocated file extents */
+#define XFS_XFLAG_IMMUTABLE	FS_XFLAG_IMMUTABLE	/* file cannot be modified */
+#define XFS_XFLAG_APPEND	FS_XFLAG_APPEND		/* all writes append */
+#define XFS_XFLAG_SYNC		FS_XFLAG_SYNC		/* all writes synchronous */
+#define XFS_XFLAG_NOATIME	FS_XFLAG_NOATIME	/* do not update access time */
+#define XFS_XFLAG_NODUMP	FS_XFLAG_NODUMP		/* do not include in backups */
+#define XFS_XFLAG_RTINHERIT	FS_XFLAG_RTINHERIT	/* create with rt bit set */
+#define XFS_XFLAG_PROJINHERIT	FS_XFLAG_PROJINHERIT	/* create with parents projid */
+#define XFS_XFLAG_NOSYMLINKS	FS_XFLAG_NOSYMLINKS	/* disallow symlink creation */
+#define XFS_XFLAG_EXTSIZE	FS_XFLAG_EXTSIZE	/* extent size allocator hint */
+#define XFS_XFLAG_EXTSZINHERIT	FS_XFLAG_EXTSZINHERIT	/* inherit inode extent size */
+#define XFS_XFLAG_NODEFRAG	FS_XFLAG_NODEFRAG  	/* do not defragment */
+#define XFS_XFLAG_FILESTREAM	FS_XFLAG_FILESTREAM	/* use filestream allocator */
+#define XFS_XFLAG_HASATTR	FS_XFLAG_HASATTR	/* no DIFLAG for this	*/
 
 /*
  * Structure for XFS_IOC_GETBMAP.
@@ -503,8 +490,8 @@  typedef struct xfs_swapext
 #define XFS_IOC_ALLOCSP		_IOW ('X', 10, struct xfs_flock64)
 #define XFS_IOC_FREESP		_IOW ('X', 11, struct xfs_flock64)
 #define XFS_IOC_DIOINFO		_IOR ('X', 30, struct dioattr)
-#define XFS_IOC_FSGETXATTR	_IOR ('X', 31, struct fsxattr)
-#define XFS_IOC_FSSETXATTR	_IOW ('X', 32, struct fsxattr)
+#define XFS_IOC_FSGETXATTR	FS_IOC_FSGETXATTR
+#define XFS_IOC_FSSETXATTR	FS_IOC_FSSETXATTR
 #define XFS_IOC_ALLOCSP64	_IOW ('X', 36, struct xfs_flock64)
 #define XFS_IOC_FREESP64	_IOW ('X', 37, struct xfs_flock64)
 #define XFS_IOC_GETBMAP		_IOWR('X', 38, struct getbmap)
diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h
index f15d980..627f58e 100644
--- a/include/uapi/linux/fs.h
+++ b/include/uapi/linux/fs.h
@@ -58,6 +58,36 @@  struct inodes_stat_t {
 	long dummy[5];		/* padding for sysctl ABI compatibility */
 };
 
+/*
+ * Structure for FS_IOC_FSGETXATTR and FS_IOC_FSSETXATTR.
+ */
+struct fsxattr {
+	__u32		fsx_xflags;	/* xflags field value (get/set) */
+	__u32		fsx_extsize;	/* extsize field value (get/set)*/
+	__u32		fsx_nextents;	/* nextents field value (get)	*/
+	__u32		fsx_projid;	/* project identifier (get/set) */
+	unsigned char	fsx_pad[12];
+};
+
+/*
+ * Flags for the fsx_xflags field
+ */
+#define FS_XFLAG_REALTIME	0x00000001	/* data in realtime volume */
+#define FS_XFLAG_PREALLOC	0x00000002	/* preallocated file extents */
+#define FS_XFLAG_IMMUTABLE	0x00000008	/* file cannot be modified */
+#define FS_XFLAG_APPEND		0x00000010	/* all writes append */
+#define FS_XFLAG_SYNC		0x00000020	/* all writes synchronous */
+#define FS_XFLAG_NOATIME	0x00000040	/* do not update access time */
+#define FS_XFLAG_NODUMP		0x00000080	/* do not include in backups */
+#define FS_XFLAG_RTINHERIT	0x00000100	/* create with rt bit set */
+#define FS_XFLAG_PROJINHERIT	0x00000200	/* create with parents projid */
+#define FS_XFLAG_NOSYMLINKS	0x00000400	/* disallow symlink creation */
+#define FS_XFLAG_EXTSIZE	0x00000800	/* extent size allocator hint */
+#define FS_XFLAG_EXTSZINHERIT	0x00001000	/* inherit inode extent size */
+#define FS_XFLAG_NODEFRAG	0x00002000  	/* do not defragment */
+#define FS_XFLAG_FILESTREAM	0x00004000	/* use filestream allocator */
+#define FS_XFLAG_HASATTR	0x80000000	/* no DIFLAG for this */
+
 
 #define NR_FILE  8192	/* this can well be larger on a larger system */
 
@@ -165,6 +195,8 @@  struct inodes_stat_t {
 #define	FS_IOC_GETVERSION		_IOR('v', 1, long)
 #define	FS_IOC_SETVERSION		_IOW('v', 2, long)
 #define FS_IOC_FIEMAP			_IOWR('f', 11, struct fiemap)
+#define FS_IOC_FSGETXATTR		_IOR('X', 31, struct fsxattr)
+#define FS_IOC_FSSETXATTR		_IOW('X', 32, struct fsxattr)
 #define FS_IOC32_GETFLAGS		_IOR('f', 1, int)
 #define FS_IOC32_SETFLAGS		_IOW('f', 2, int)
 #define FS_IOC32_GETVERSION		_IOR('v', 1, int)