All of lore.kernel.org
 help / color / mirror / Atom feed
From: James Simmons <jsimmons@infradead.org>
To: lustre-devel@lists.lustre.org
Subject: [lustre-devel] [PATCH 09/24] lustre: don't use spare bits in iattr.ia_valid
Date: Thu, 21 Jun 2018 02:35:26 +0100 (BST)	[thread overview]
Message-ID: <alpine.LFD.2.21.1806210233170.3886@casper.infradead.org> (raw)
In-Reply-To: <152904669036.10587.17899565981649604892.stgit@noble>


> Using spare bits in iattr.ia_valid is not safe as the
> bits might get used for some other purpose without
> us noticing.
> lustre currently used 4 spare bit, but they are all
> defined in different places so this isn't immediately
> obvious.
> 
> This patch brings all those bit definitions together
> and defined a new op_data field (op_xvalid) to hold
> the extra validity bits.
> 
> It also replaces sa_valid in struct cl_setattr_io
> with sa_avalid and sa_xvalid.  Changing the name is
> helpful as sa_valid already has another use within
> lustre.
> 
> Signed-off-by: NeilBrown <neilb@suse.com>

Nak: I see regressions with this patch.

[12368.453655] Lustre: DEBUG MARKER: == sanity test 240: race between ldlm 
enqueue and the connection RPC (no ASSERT) ===================== 21:
16:30 (1529543790)
[12368.760832] BUG: Dentry 
000000002646a847{i=200004282000008,n=f237.sanity}  still in use (1) 
[unmount of lustre lustre]
[12368.773746] WARNING: CPU: 1 PID: 10861 at fs/dcache.c:1514 
umount_check+0x66/0x70
[12368.783364] Modules linked in: ext4(E) mbcache(E) jbd2(E) loop(E) 
lustre(CE) obdecho(CE) mgc(CE) lov(CE) osc(CE) mdc(CE) lmv(CE) fid(CE) fld
(CE) ptlrpc(CE) obdclass(CE) ksocklnd(CE) sha512_generic(E) lnet(CE) 
libcfs(CE) xt_comment(E) xt_multiport(E) nfsv3(E) nfs_acl(E) sg(E) ip6t_RE
JECT(E) nf_reject_ipv6(E) nf_conntrack_ipv6(E) nf_defrag_ipv6(E) 
ip6table_filter(E) ip6_tables(E) ipt_REJECT(E) nf_reject_ipv4(E) 
nf_conntrack_
ipv4(E) nf_defrag_ipv4(E) xt_conntrack(E) nf_conntrack(E) libcrc32c(E) 
iptable_filter(E) dm_mirror(E) dm_region_hash(E) dm_log(E) dm_mod(E) ib_
isert(E) iscsi_target_mod(E) mgag200(E) ttm(E) target_core_mod(E) 
drm_kms_helper(E) rpcrdma(E) x86_pkg_temp_thermal(E) drm(E) 
crc32_pclmul(E) i
b_ucm(E) rdma_ucm(E) ib_uverbs(E) fb_sys_fops(E) syscopyarea(E) ib_iser(E) 
mpt3sas(E) sysfillrect(E)
[12368.869470]  ipmi_si(E) sysimgblt(E) raid_class(E) ib_umad(E) 
rdma_cm(E) ipmi_devintf(E) scsi_transport_sas(E) wmi(E) ib_ipoib(E) 
ipmi_msgha
ndler(E) iw_cm(E) libiscsi(E) ib_cm(E) scsi_transport_iscsi(E) mlx4_ib(E) 
ib_core(E) binfmt_misc(E) ip_tables(E) rpcsec_gss_krb5(E) auth_rpcgss
(E) nfsv4(E) dns_resolver(E) nfs(E) lockd(E) grace(E) fscache(E) 
mlx4_en(E) mlx4_core(E) igb(E) i2c_algo_bit(E) devlink(E) crc32c_intel(E) 
i2c_
core(E) sunrpc(E)
[12368.917172] CPU: 1 PID: 10861 Comm: umount Tainted: G        WC  E     
4.17.0+ #1
[12368.926825] Hardware name: Supermicro X9DRT/X9DRT, BIOS 3.0a 02/19/2014
[12368.935595] RIP: 0010:umount_check+0x66/0x70
[12368.941993] RSP: 0018:ffffc90007313da8 EFLAGS: 00010286
[12368.949342] RAX: 000000000000006a RBX: ffff8810557dcb40 RCX: 
0000000000000000
[12368.958619] RDX: 0000000000000001 RSI: ffff88085fc954f8 RDI: 
ffff88085fc954f8
[12368.967868] RBP: ffff880fec9ef600 R08: 0000000000000000 R09: 
0000000000000896
[12368.977102] R10: 00000000000003ff R11: 0000000000aaaaaa R12: 
ffffffff8124a320
[12368.986315] R13: ffff8810557dcbe0 R14: ffff880fec9ef690 R15: 
ffff8810557dcbe0
[12368.995505] FS:  00007fc174af5880(0000) GS:ffff88085fc80000(0000) 
knlGS:0000000000000000
[12369.005631] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[12369.013395] CR2: 00007fc174b04000 CR3: 0000000822922002 CR4: 
00000000000606e0
[12369.022530] Call Trace:
[12369.026962]  d_walk+0xe1/0x270
[12369.031970]  do_one_tree+0x22/0x40
[12369.037280]  shrink_dcache_for_umount+0x28/0x80
[12369.043685]  generic_shutdown_super+0x1a/0x110
[12369.049977]  kill_anon_super+0xe/0x20
[12369.055463]  deactivate_locked_super+0x39/0x70
[12369.061708]  cleanup_mnt+0x3b/0x70
[12369.066871]  task_work_run+0x7c/0xa0
[12369.072174]  exit_to_usermode_loop+0x5a/0x7e
[12369.078140]  do_syscall_64+0x2b7/0x347
[12369.083547]  ? do_page_fault+0x2d/0x110
[12369.089008]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
[12369.095655] RIP: 0033:0x7fc173d69bd7
[12369.100789] RSP: 002b:00007ffc4c89fcc8 EFLAGS: 00000246 ORIG_RAX: 
00000000000000a6
[12369.109902] RAX: 0000000000000000 RBX: 000056521cd63040 RCX: 
00007fc173d69bd7
[12369.118564] RDX: 0000000000000001 RSI: 0000000000000000 RDI: 
000056521cd642b0
[12369.127188] RBP: 000056521cd642b0 R08: 0000000000000000 R09: 
000000000000000f
[12369.135778] R10: 00007ffc4c89f720 R11: 0000000000000246 R12: 
00007fc1748e4d58
[12369.144336] R13: 0000000000000000 R14: 000056521cd648a0 R15: 
000056521cd63040
[12369.152868] Code: 00 00 48 8b 40 28 4c 8b 08 48 8b 46 30 48 85 c0 74 1d 
48 8b 50 40 48 89 0c 24 48 c7 c7 58 5c e6 81 48 89 f1 31 c0 e8 38 cf ea ff 
<0f> 0b eb b2 31 d2 eb e3 66 90 66 66 66 66 90 55 48 89 fd 53 48 
[12369.174646] ---[ end trace 053c2a5a718d3440 ]---
[12369.385564] Lustre: Unmounted lustre-client
[12369.393247] VFS: Busy inodes after unmount of lustre. Self-destruct in 
5 seconds.  Have a nice day...

When I remove this patch things go back to normal. This will not show up
if you do a ONLY="240" sh ./sanity.sh. You have to run the sanity.sh in
total to make this show up.

> ---
>  drivers/staging/lustre/lustre/include/cl_object.h  |    5 +++-
>  .../staging/lustre/lustre/include/lustre_compat.h  |    6 -----
>  .../lustre/include/lustre_patchless_compat.h       |    8 -------
>  drivers/staging/lustre/lustre/include/obd.h        |    7 ++++++
>  drivers/staging/lustre/lustre/llite/file.c         |   12 ++++++----
>  drivers/staging/lustre/lustre/llite/lcommon_cl.c   |    5 +++-
>  .../staging/lustre/lustre/llite/llite_internal.h   |    5 +++-
>  drivers/staging/lustre/lustre/llite/llite_lib.c    |   21 ++++++++++--------
>  drivers/staging/lustre/lustre/llite/vvp_io.c       |    8 +++----
>  drivers/staging/lustre/lustre/lmv/lmv_obd.c        |    5 +++-
>  drivers/staging/lustre/lustre/lov/lov_io.c         |    3 ++-
>  drivers/staging/lustre/lustre/mdc/mdc_lib.c        |   13 ++++++-----
>  drivers/staging/lustre/lustre/osc/osc_io.c         |   23 ++++++++++----------
>  13 files changed, 63 insertions(+), 58 deletions(-)
> 
> diff --git a/drivers/staging/lustre/lustre/include/cl_object.h b/drivers/staging/lustre/lustre/include/cl_object.h
> index 6f7b991be809..caa66763c70d 100644
> --- a/drivers/staging/lustre/lustre/include/cl_object.h
> +++ b/drivers/staging/lustre/lustre/include/cl_object.h
> @@ -1773,7 +1773,8 @@ struct cl_io {
>  		struct cl_setattr_io {
>  			struct ost_lvb   sa_attr;
>  			unsigned int		 sa_attr_flags;
> -			unsigned int     sa_valid;
> +			unsigned int     sa_avalid;
> +			unsigned int     sa_xvalid;
>  			int		sa_stripe_index;
>  			const struct lu_fid	*sa_parent_fid;
>  		} ci_setattr;
> @@ -2304,7 +2305,7 @@ static inline int cl_io_is_mkwrite(const struct cl_io *io)
>  static inline int cl_io_is_trunc(const struct cl_io *io)
>  {
>  	return io->ci_type == CIT_SETATTR &&
> -		(io->u.ci_setattr.sa_valid & ATTR_SIZE);
> +		(io->u.ci_setattr.sa_avalid & ATTR_SIZE);
>  }
>  
>  struct cl_io *cl_io_top(struct cl_io *io);
> diff --git a/drivers/staging/lustre/lustre/include/lustre_compat.h b/drivers/staging/lustre/lustre/include/lustre_compat.h
> index 3c6db0d632dc..6d1a433e32c5 100644
> --- a/drivers/staging/lustre/lustre/include/lustre_compat.h
> +++ b/drivers/staging/lustre/lustre/include/lustre_compat.h
> @@ -41,12 +41,6 @@
>  
>  #include <lustre_patchless_compat.h>
>  
> -/*
> - * set ATTR_BLOCKS to a high value to avoid any risk of collision with other
> - * ATTR_* attributes (see bug 13828)
> - */
> -#define ATTR_BLOCKS    (1 << 27)
> -
>  #define current_ngroups current_cred()->group_info->ngroups
>  #define current_groups current_cred()->group_info->small_block
>  
> diff --git a/drivers/staging/lustre/lustre/include/lustre_patchless_compat.h b/drivers/staging/lustre/lustre/include/lustre_patchless_compat.h
> index dca1e3dbd183..1bbe1a779ae9 100644
> --- a/drivers/staging/lustre/lustre/include/lustre_patchless_compat.h
> +++ b/drivers/staging/lustre/lustre/include/lustre_patchless_compat.h
> @@ -41,12 +41,4 @@
>  #include <linux/hash.h>
>  #include <linux/pagemap.h>
>  
> -#ifndef ATTR_CTIME_SET
> -/*
> - * set ATTR_CTIME_SET to a high value to avoid any risk of collision with other
> - * ATTR_* attributes (see bug 13828)
> - */
> -#define ATTR_CTIME_SET (1 << 28)
> -#endif
> -
>  #endif /* LUSTRE_PATCHLESS_COMPAT_H */
> diff --git a/drivers/staging/lustre/lustre/include/obd.h b/drivers/staging/lustre/lustre/include/obd.h
> index b1907bbffb19..d38b6bc6b246 100644
> --- a/drivers/staging/lustre/lustre/include/obd.h
> +++ b/drivers/staging/lustre/lustre/include/obd.h
> @@ -723,6 +723,7 @@ struct md_op_data {
>  
>  	/* iattr fields and blocks. */
>  	struct iattr	    op_attr;
> +	unsigned int		op_xvalid; /* eXtra validity flags */
>  	unsigned int	    op_attr_flags;
>  	__u64		   op_valid;
>  	loff_t		  op_attr_blocks;
> @@ -751,6 +752,12 @@ struct md_op_data {
>  	__u32			op_default_stripe_offset;
>  };
>  
> +/* Flags for op_xvalid */
> +#define OP_ATTR_CTIME_SET	(1 << 0)
> +#define OP_ATTR_BLOCKS		(1 << 1)
> +#define OP_ATTR_OWNEROVERRIDE	(1 << 2)
> +#define OP_ATTR_FLAGS		(1 << 3)
> +
>  struct md_callback {
>  	int (*md_blocking_ast)(struct ldlm_lock *lock,
>  			       struct ldlm_lock_desc *desc,
> diff --git a/drivers/staging/lustre/lustre/llite/file.c b/drivers/staging/lustre/lustre/llite/file.c
> index e888ed6e74bc..e642996db53f 100644
> --- a/drivers/staging/lustre/lustre/llite/file.c
> +++ b/drivers/staging/lustre/lustre/llite/file.c
> @@ -93,9 +93,10 @@ static void ll_prepare_close(struct inode *inode, struct md_op_data *op_data,
>  	op_data->op_attr.ia_mtime = inode->i_mtime;
>  	op_data->op_attr.ia_ctime = inode->i_ctime;
>  	op_data->op_attr.ia_size = i_size_read(inode);
> -	op_data->op_attr.ia_valid |= ATTR_MODE | ATTR_ATIME | ATTR_ATIME_SET |
> -				     ATTR_MTIME | ATTR_MTIME_SET |
> -				     ATTR_CTIME | ATTR_CTIME_SET;
> +	op_data->op_attr.ia_valid |= (ATTR_MODE | ATTR_ATIME | ATTR_ATIME_SET |
> +				      ATTR_MTIME | ATTR_MTIME_SET |
> +				      ATTR_CTIME);
> +	op_data->op_xvalid |= OP_ATTR_CTIME_SET;
>  	op_data->op_attr_blocks = inode->i_blocks;
>  	op_data->op_attr_flags = ll_inode_to_ext_flags(inode->i_flags);
>  	op_data->op_handle = och->och_fh;
> @@ -161,7 +162,8 @@ static int ll_close_inode_openhandle(struct inode *inode,
>  		op_data->op_bias |= MDS_HSM_RELEASE;
>  		op_data->op_data_version = *(__u64 *)data;
>  		op_data->op_lease_handle = och->och_lease_handle;
> -		op_data->op_attr.ia_valid |= ATTR_SIZE | ATTR_BLOCKS;
> +		op_data->op_attr.ia_valid |= ATTR_SIZE;
> +		op_data->op_xvalid |= OP_ATTR_BLOCKS;
>  		break;
>  
>  	default:
> @@ -1906,7 +1908,7 @@ static int ll_hsm_import(struct inode *inode, struct file *file,
>  
>  	inode_lock(inode);
>  
> -	rc = ll_setattr_raw(file->f_path.dentry, attr, true);
> +	rc = ll_setattr_raw(file->f_path.dentry, attr, 0, true);
>  	if (rc == -ENODATA)
>  		rc = 0;
>  
> diff --git a/drivers/staging/lustre/lustre/llite/lcommon_cl.c b/drivers/staging/lustre/lustre/llite/lcommon_cl.c
> index d7ea39ce0cb2..9d1f3881f860 100644
> --- a/drivers/staging/lustre/lustre/llite/lcommon_cl.c
> +++ b/drivers/staging/lustre/lustre/llite/lcommon_cl.c
> @@ -80,7 +80,7 @@ u16 cl_inode_fini_refcheck;
>  static DEFINE_MUTEX(cl_inode_fini_guard);
>  
>  int cl_setattr_ost(struct cl_object *obj, const struct iattr *attr,
> -		   unsigned int attr_flags)
> +		   unsigned int xvalid, unsigned int attr_flags)
>  {
>  	struct lu_env *env;
>  	struct cl_io  *io;
> @@ -100,7 +100,8 @@ int cl_setattr_ost(struct cl_object *obj, const struct iattr *attr,
>  	io->u.ci_setattr.sa_attr.lvb_ctime = LTIME_S(attr->ia_ctime);
>  	io->u.ci_setattr.sa_attr.lvb_size = attr->ia_size;
>  	io->u.ci_setattr.sa_attr_flags = attr_flags;
> -	io->u.ci_setattr.sa_valid = attr->ia_valid;
> +	io->u.ci_setattr.sa_avalid = attr->ia_valid;
> +	io->u.ci_setattr.sa_xvalid = xvalid;
>  	io->u.ci_setattr.sa_parent_fid = lu_object_fid(&obj->co_lu);
>  
>  again:
> diff --git a/drivers/staging/lustre/lustre/llite/llite_internal.h b/drivers/staging/lustre/lustre/llite/llite_internal.h
> index 28cff58690d6..b750a48fd0e1 100644
> --- a/drivers/staging/lustre/lustre/llite/llite_internal.h
> +++ b/drivers/staging/lustre/lustre/llite/llite_internal.h
> @@ -805,7 +805,8 @@ void ll_kill_super(struct super_block *sb);
>  struct inode *ll_inode_from_resource_lock(struct ldlm_lock *lock);
>  void ll_dir_clear_lsm_md(struct inode *inode);
>  void ll_clear_inode(struct inode *inode);
> -int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import);
> +int ll_setattr_raw(struct dentry *dentry, struct iattr *attr,
> +		   unsigned int xvalid, bool hsm_import);
>  int ll_setattr(struct dentry *de, struct iattr *attr);
>  int ll_statfs(struct dentry *de, struct kstatfs *sfs);
>  int ll_statfs_internal(struct super_block *sb, struct obd_statfs *osfs,
> @@ -1330,7 +1331,7 @@ int ll_getparent(struct file *file, struct getparent __user *arg);
>  
>  /* lcommon_cl.c */
>  int cl_setattr_ost(struct cl_object *obj, const struct iattr *attr,
> -		   unsigned int attr_flags);
> +		   unsigned int xvalid, unsigned int attr_flags);
>  
>  extern struct lu_env *cl_inode_fini_env;
>  extern u16 cl_inode_fini_refcheck;
> diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c
> index 36066c839160..cd0f2517a3b3 100644
> --- a/drivers/staging/lustre/lustre/llite/llite_lib.c
> +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c
> @@ -1429,7 +1429,8 @@ static int ll_md_setattr(struct dentry *dentry, struct md_op_data *op_data)
>   *
>   * In case of HSMimport, we only set attr on MDS.
>   */
> -int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import)
> +int ll_setattr_raw(struct dentry *dentry, struct iattr *attr,
> +		   unsigned int xvalid, bool hsm_import)
>  {
>  	struct inode *inode = d_inode(dentry);
>  	struct ll_inode_info *lli = ll_i2info(inode);
> @@ -1470,7 +1471,7 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import)
>  	/* We mark all of the fields "set" so MDS/OST does not re-set them */
>  	if (attr->ia_valid & ATTR_CTIME) {
>  		attr->ia_ctime = current_time(inode);
> -		attr->ia_valid |= ATTR_CTIME_SET;
> +		xvalid |= OP_ATTR_CTIME_SET;
>  	}
>  	if (!(attr->ia_valid & ATTR_ATIME_SET) &&
>  	    (attr->ia_valid & ATTR_ATIME)) {
> @@ -1506,12 +1507,13 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import)
>  		 * If we are changing file size, file content is
>  		 * modified, flag it.
>  		 */
> -		attr->ia_valid |= MDS_OPEN_OWNEROVERRIDE;
> +		xvalid |= OP_ATTR_OWNEROVERRIDE;
>  		op_data->op_bias |= MDS_DATA_MODIFIED;
>  		clear_bit(LLIF_DATA_MODIFIED, &lli->lli_flags);
>  	}
>  
>  	op_data->op_attr = *attr;
> +	op_data->op_xvalid = xvalid;
>  
>  	rc = ll_md_setattr(dentry, op_data);
>  	if (rc)
> @@ -1532,7 +1534,8 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import)
>  		 * setting times to past, but it is necessary due to possible
>  		 * time de-synchronization between MDT inode and OST objects
>  		 */
> -		rc = cl_setattr_ost(ll_i2info(inode)->lli_clob, attr, 0);
> +		rc = cl_setattr_ost(ll_i2info(inode)->lli_clob,
> +				    attr, xvalid, 0);
>  	}
>  
>  	/*
> @@ -1589,10 +1592,11 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import)
>  int ll_setattr(struct dentry *de, struct iattr *attr)
>  {
>  	int mode = d_inode(de)->i_mode;
> +	unsigned int xvalid = 0;
>  
>  	if ((attr->ia_valid & (ATTR_CTIME | ATTR_SIZE | ATTR_MODE)) ==
>  			      (ATTR_CTIME | ATTR_SIZE | ATTR_MODE))
> -		attr->ia_valid |= MDS_OPEN_OWNEROVERRIDE;
> +		xvalid |= OP_ATTR_OWNEROVERRIDE;
>  
>  	if (((attr->ia_valid & (ATTR_MODE | ATTR_FORCE | ATTR_SIZE)) ==
>  			       (ATTR_SIZE | ATTR_MODE)) &&
> @@ -1613,7 +1617,7 @@ int ll_setattr(struct dentry *de, struct iattr *attr)
>  	    !(attr->ia_valid & ATTR_KILL_SGID))
>  		attr->ia_valid |= ATTR_KILL_SGID;
>  
> -	return ll_setattr_raw(de, attr, false);
> +	return ll_setattr_raw(de, attr, xvalid, false);
>  }
>  
>  int ll_statfs_internal(struct super_block *sb, struct obd_statfs *osfs,
> @@ -1946,7 +1950,7 @@ int ll_iocontrol(struct inode *inode, struct file *file,
>  			return PTR_ERR(op_data);
>  
>  		op_data->op_attr_flags = flags;
> -		op_data->op_attr.ia_valid |= ATTR_ATTR_FLAG;
> +		op_data->op_xvalid |= OP_ATTR_FLAGS;
>  		rc = md_setattr(sbi->ll_md_exp, op_data, NULL, 0, &req);
>  		ll_finish_md_op_data(op_data);
>  		ptlrpc_req_finished(req);
> @@ -1963,8 +1967,7 @@ int ll_iocontrol(struct inode *inode, struct file *file,
>  		if (!attr)
>  			return -ENOMEM;
>  
> -		attr->ia_valid = ATTR_ATTR_FLAG;
> -		rc = cl_setattr_ost(obj, attr, flags);
> +		rc = cl_setattr_ost(obj, attr, OP_ATTR_FLAGS, flags);
>  		kfree(attr);
>  		return rc;
>  	}
> diff --git a/drivers/staging/lustre/lustre/llite/vvp_io.c b/drivers/staging/lustre/lustre/llite/vvp_io.c
> index e7a4778e02e4..e65523f7628d 100644
> --- a/drivers/staging/lustre/lustre/llite/vvp_io.c
> +++ b/drivers/staging/lustre/lustre/llite/vvp_io.c
> @@ -556,7 +556,7 @@ static int vvp_io_setattr_lock(const struct lu_env *env,
>  		if (new_size == 0)
>  			enqflags = CEF_DISCARD_DATA;
>  	} else {
> -		unsigned int valid = io->u.ci_setattr.sa_valid;
> +		unsigned int valid = io->u.ci_setattr.sa_avalid;
>  
>  		if (!(valid & TIMES_SET_FLAGS))
>  			return 0;
> @@ -603,11 +603,11 @@ static int vvp_io_setattr_time(const struct lu_env *env,
>  
>  	cl_object_attr_lock(obj);
>  	attr->cat_ctime = io->u.ci_setattr.sa_attr.lvb_ctime;
> -	if (io->u.ci_setattr.sa_valid & ATTR_ATIME_SET) {
> +	if (io->u.ci_setattr.sa_avalid & ATTR_ATIME_SET) {
>  		attr->cat_atime = io->u.ci_setattr.sa_attr.lvb_atime;
>  		valid |= CAT_ATIME;
>  	}
> -	if (io->u.ci_setattr.sa_valid & ATTR_MTIME_SET) {
> +	if (io->u.ci_setattr.sa_avalid & ATTR_MTIME_SET) {
>  		attr->cat_mtime = io->u.ci_setattr.sa_attr.lvb_mtime;
>  		valid |= CAT_MTIME;
>  	}
> @@ -632,7 +632,7 @@ static int vvp_io_setattr_start(const struct lu_env *env,
>  		inode_lock(inode);
>  	}
>  
> -	if (io->u.ci_setattr.sa_valid & TIMES_SET_FLAGS)
> +	if (io->u.ci_setattr.sa_avalid & TIMES_SET_FLAGS)
>  		return vvp_io_setattr_time(env, ios);
>  
>  	return 0;
> diff --git a/drivers/staging/lustre/lustre/lmv/lmv_obd.c b/drivers/staging/lustre/lustre/lmv/lmv_obd.c
> index 65f94e6ecaad..9f427a7c7b03 100644
> --- a/drivers/staging/lustre/lustre/lmv/lmv_obd.c
> +++ b/drivers/staging/lustre/lustre/lmv/lmv_obd.c
> @@ -1983,8 +1983,9 @@ static int lmv_setattr(struct obd_export *exp, struct md_op_data *op_data,
>  	struct lmv_obd	  *lmv = &obd->u.lmv;
>  	struct lmv_tgt_desc     *tgt;
>  
> -	CDEBUG(D_INODE, "SETATTR for " DFID ", valid 0x%x\n",
> -	       PFID(&op_data->op_fid1), op_data->op_attr.ia_valid);
> +	CDEBUG(D_INODE, "SETATTR for " DFID ", valid 0x%x/0x%x\n",
> +	       PFID(&op_data->op_fid1), op_data->op_attr.ia_valid,
> +		op_data->op_xvalid);
>  
>  	op_data->op_flags |= MF_MDC_CANCEL_FID1;
>  	tgt = lmv_find_target(lmv, &op_data->op_fid1);
> diff --git a/drivers/staging/lustre/lustre/lov/lov_io.c b/drivers/staging/lustre/lustre/lov/lov_io.c
> index b823f8a21856..50982848bca4 100644
> --- a/drivers/staging/lustre/lustre/lov/lov_io.c
> +++ b/drivers/staging/lustre/lustre/lov/lov_io.c
> @@ -77,7 +77,8 @@ static void lov_io_sub_inherit(struct cl_io *io, struct lov_io *lio,
>  		io->u.ci_setattr.sa_attr = parent->u.ci_setattr.sa_attr;
>  		io->u.ci_setattr.sa_attr_flags =
>  					parent->u.ci_setattr.sa_attr_flags;
> -		io->u.ci_setattr.sa_valid = parent->u.ci_setattr.sa_valid;
> +		io->u.ci_setattr.sa_avalid = parent->u.ci_setattr.sa_avalid;
> +		io->u.ci_setattr.sa_xvalid = parent->u.ci_setattr.sa_xvalid;
>  		io->u.ci_setattr.sa_stripe_index = stripe;
>  		io->u.ci_setattr.sa_parent_fid =
>  					parent->u.ci_setattr.sa_parent_fid;
> diff --git a/drivers/staging/lustre/lustre/mdc/mdc_lib.c b/drivers/staging/lustre/lustre/mdc/mdc_lib.c
> index d582968987ff..ad7c13be5e3c 100644
> --- a/drivers/staging/lustre/lustre/mdc/mdc_lib.c
> +++ b/drivers/staging/lustre/lustre/mdc/mdc_lib.c
> @@ -234,7 +234,7 @@ void mdc_open_pack(struct ptlrpc_request *req, struct md_op_data *op_data,
>  	set_mrc_cr_flags(rec, cr_flags);
>  }
>  
> -static inline __u64 attr_pack(unsigned int ia_valid)
> +static inline __u64 attr_pack(unsigned int ia_valid, unsigned int ia_xvalid)
>  {
>  	__u64 sa_valid = 0;
>  
> @@ -258,19 +258,19 @@ static inline __u64 attr_pack(unsigned int ia_valid)
>  		sa_valid |= MDS_ATTR_MTIME_SET;
>  	if (ia_valid & ATTR_FORCE)
>  		sa_valid |= MDS_ATTR_FORCE;
> -	if (ia_valid & ATTR_ATTR_FLAG)
> +	if (ia_xvalid & OP_ATTR_FLAGS)
>  		sa_valid |= MDS_ATTR_ATTR_FLAG;
>  	if (ia_valid & ATTR_KILL_SUID)
>  		sa_valid |=  MDS_ATTR_KILL_SUID;
>  	if (ia_valid & ATTR_KILL_SGID)
>  		sa_valid |= MDS_ATTR_KILL_SGID;
> -	if (ia_valid & ATTR_CTIME_SET)
> +	if (ia_xvalid & OP_ATTR_CTIME_SET)
>  		sa_valid |= MDS_ATTR_CTIME_SET;
>  	if (ia_valid & ATTR_OPEN)
>  		sa_valid |= MDS_ATTR_FROM_OPEN;
> -	if (ia_valid & ATTR_BLOCKS)
> +	if (ia_xvalid & OP_ATTR_BLOCKS)
>  		sa_valid |= MDS_ATTR_BLOCKS;
> -	if (ia_valid & MDS_OPEN_OWNEROVERRIDE)
> +	if (ia_xvalid & OP_ATTR_OWNEROVERRIDE)
>  		/* NFSD hack (see bug 5781) */
>  		sa_valid |= MDS_OPEN_OWNEROVERRIDE;
>  	return sa_valid;
> @@ -286,7 +286,8 @@ static void mdc_setattr_pack_rec(struct mdt_rec_setattr *rec,
>  	rec->sa_suppgid = -1;
>  
>  	rec->sa_fid    = op_data->op_fid1;
> -	rec->sa_valid  = attr_pack(op_data->op_attr.ia_valid);
> +	rec->sa_valid  = attr_pack(op_data->op_attr.ia_valid,
> +				   op_data->op_xvalid);
>  	rec->sa_mode   = op_data->op_attr.ia_mode;
>  	rec->sa_uid    = from_kuid(&init_user_ns, op_data->op_attr.ia_uid);
>  	rec->sa_gid    = from_kgid(&init_user_ns, op_data->op_attr.ia_gid);
> diff --git a/drivers/staging/lustre/lustre/osc/osc_io.c b/drivers/staging/lustre/lustre/osc/osc_io.c
> index 67734a8ed331..955525f69958 100644
> --- a/drivers/staging/lustre/lustre/osc/osc_io.c
> +++ b/drivers/staging/lustre/lustre/osc/osc_io.c
> @@ -499,7 +499,8 @@ static int osc_io_setattr_start(const struct lu_env *env,
>  	struct obdo *oa = &oio->oi_oa;
>  	struct osc_async_cbargs *cbargs = &oio->oi_cbarg;
>  	__u64 size = io->u.ci_setattr.sa_attr.lvb_size;
> -	unsigned int ia_valid = io->u.ci_setattr.sa_valid;
> +	unsigned int ia_avalid = io->u.ci_setattr.sa_avalid;
> +	unsigned int ia_xvalid = io->u.ci_setattr.sa_xvalid;
>  	int result = 0;
>  
>  	/* truncate cache dirty pages first */
> @@ -514,20 +515,20 @@ static int osc_io_setattr_start(const struct lu_env *env,
>  			struct ost_lvb *lvb = &io->u.ci_setattr.sa_attr;
>  			unsigned int cl_valid = 0;
>  
> -			if (ia_valid & ATTR_SIZE) {
> +			if (ia_avalid & ATTR_SIZE) {
>  				attr->cat_size = size;
>  				attr->cat_kms = size;
>  				cl_valid = CAT_SIZE | CAT_KMS;
>  			}
> -			if (ia_valid & ATTR_MTIME_SET) {
> +			if (ia_avalid & ATTR_MTIME_SET) {
>  				attr->cat_mtime = lvb->lvb_mtime;
>  				cl_valid |= CAT_MTIME;
>  			}
> -			if (ia_valid & ATTR_ATIME_SET) {
> +			if (ia_avalid & ATTR_ATIME_SET) {
>  				attr->cat_atime = lvb->lvb_atime;
>  				cl_valid |= CAT_ATIME;
>  			}
> -			if (ia_valid & ATTR_CTIME_SET) {
> +			if (ia_xvalid & OP_ATTR_CTIME_SET) {
>  				attr->cat_ctime = lvb->lvb_ctime;
>  				cl_valid |= CAT_CTIME;
>  			}
> @@ -542,19 +543,19 @@ static int osc_io_setattr_start(const struct lu_env *env,
>  		obdo_set_parent_fid(oa, io->u.ci_setattr.sa_parent_fid);
>  		oa->o_stripe_idx = io->u.ci_setattr.sa_stripe_index;
>  		oa->o_valid |= OBD_MD_FLID | OBD_MD_FLGROUP;
> -		if (ia_valid & ATTR_CTIME) {
> +		if (ia_avalid & ATTR_CTIME) {
>  			oa->o_valid |= OBD_MD_FLCTIME;
>  			oa->o_ctime = attr->cat_ctime;
>  		}
> -		if (ia_valid & ATTR_ATIME) {
> +		if (ia_avalid & ATTR_ATIME) {
>  			oa->o_valid |= OBD_MD_FLATIME;
>  			oa->o_atime = attr->cat_atime;
>  		}
> -		if (ia_valid & ATTR_MTIME) {
> +		if (ia_avalid & ATTR_MTIME) {
>  			oa->o_valid |= OBD_MD_FLMTIME;
>  			oa->o_mtime = attr->cat_mtime;
>  		}
> -		if (ia_valid & ATTR_SIZE) {
> +		if (ia_avalid & ATTR_SIZE) {
>  			oa->o_size = size;
>  			oa->o_blocks = OBD_OBJECT_EOF;
>  			oa->o_valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS;
> @@ -566,14 +567,14 @@ static int osc_io_setattr_start(const struct lu_env *env,
>  		} else {
>  			LASSERT(oio->oi_lockless == 0);
>  		}
> -		if (ia_valid & ATTR_ATTR_FLAG) {
> +		if (ia_xvalid & OP_ATTR_FLAGS) {
>  			oa->o_flags = io->u.ci_setattr.sa_attr_flags;
>  			oa->o_valid |= OBD_MD_FLFLAGS;
>  		}
>  
>  		init_completion(&cbargs->opc_sync);
>  
> -		if (ia_valid & ATTR_SIZE)
> +		if (ia_avalid & ATTR_SIZE)
>  			result = osc_punch_base(osc_export(cl2osc(obj)),
>  						oa, osc_async_upcall,
>  						cbargs, PTLRPCD_SET);
> 
> 
> 

  reply	other threads:[~2018-06-21  1:35 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-15  7:11 [lustre-devel] [PATCH 00/24] lustre - more cleanups including module reduction NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 06/24] lustre: build ldlm in the ldlm directory NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 07/24] lustre: merge libcfs module into lnet NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 10/24] lustre: remove lustre_patchless_compat.h NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 19/24] lustre: open code cfs_trace_max_debug_mb() into cfs_trace_set_debug_mb() NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 15/24] lustre: centralize TIMES_SET_FLAGS NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 11/24] lustre: discard current_n*groups macros NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 20/24] lustre: move tcd locking across to tracefile.c NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 02/24] kbuild: treat a directory listed in a composite object as foo/mod.a NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 01/24] kbuild: detect directories in components of a module NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 18/24] lustre/lnet: move tracefile locking from linux-tracefile.c to tracefile.c NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 09/24] lustre: don't use spare bits in iattr.ia_valid NeilBrown
2018-06-21  1:35   ` James Simmons [this message]
2018-06-21  4:19     ` NeilBrown
2018-06-22  2:23       ` NeilBrown
2018-06-24 20:33         ` James Simmons
2018-06-24 23:50           ` NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 05/24] kbuild: Add documentation for modobj-m NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 12/24] lustre: discard LTIME_S macro NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 03/24] kbuild: support building of per-directory mod.a NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 08/24] lustre: use truncate_inode_page in place of truncate_complete_page NeilBrown
2018-06-16  0:17   ` James Simmons
2018-06-16  0:52     ` NeilBrown
2018-06-16  0:59       ` Oleg Drokin
2018-06-18  2:03         ` NeilBrown
2018-06-25  0:02           ` [lustre-devel] [PATCH 1/3] lustre: use generic_error_remove_page() NeilBrown
2018-06-25  0:02             ` [lustre-devel] [PATCH 2/3] lustre: use delete_from_page_cache() for directory pages NeilBrown
2018-06-25  0:03               ` [lustre-devel] [PATCH 3/3] lustre: discard truncate_complete_page() NeilBrown
2018-06-26  0:19                 ` James Simmons
2018-06-25  0:38               ` [lustre-devel] [PATCH 2/3] lustre: use delete_from_page_cache() for directory pages Oleg Drokin
2018-06-26  0:18               ` James Simmons
2018-06-25  0:38             ` [lustre-devel] [PATCH 1/3] lustre: use generic_error_remove_page() Oleg Drokin
2018-06-25  1:57               ` NeilBrown
2018-06-26  0:26                 ` James Simmons
2018-06-26  0:14             ` James Simmons
2018-06-15  7:11 ` [lustre-devel] [PATCH 23/24] lustre: renamed CFS_TCD_TYPE_MAX to CFS_TCD_TYPE_CNT NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 13/24] lustre: discard NO_QUOTA and QUOTA_OK NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 04/24] kbuild: disable KBUILD_MODNAME when building for mod.a NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 24/24] lustre: discard TCD_MAX_TYPES NeilBrown
2018-06-21  1:38   ` James Simmons
2018-06-21  4:28     ` NeilBrown
2018-06-24 20:37       ` James Simmons
2018-06-24 23:26         ` NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 21/24] lustre: move remainder of linux-tracefile.c to tracefile.c NeilBrown
2018-06-21  1:37   ` James Simmons
2018-06-22  3:19     ` NeilBrown
2018-06-24 20:29       ` James Simmons
2018-06-24 23:25         ` NeilBrown
2018-06-25 21:52           ` James Simmons
2018-06-15  7:11 ` [lustre-devel] [PATCH 14/24] lustre: discard ext2* bit operations NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 16/24] lustre: remove redefinition of module_init() NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 22/24] lustre: fold cfs_tracefile_*_arch into their only callers NeilBrown
2018-06-15  7:11 ` [lustre-devel] [PATCH 17/24] lustre: remove lustre_compat.h NeilBrown
2018-06-21  1:48 ` [lustre-devel] [PATCH 00/24] lustre - more cleanups including module reduction James Simmons
2018-06-21  2:29   ` Patrick Farrell
2018-06-21  2:57     ` James Simmons
2018-06-21  7:22       ` Andreas Dilger
2018-06-21 12:28         ` Patrick Farrell
2018-06-24 20:35           ` James Simmons
2018-06-24 23:40           ` NeilBrown
2018-06-26  1:13             ` James Simmons
2018-06-26 13:51               ` Patrick Farrell
2018-06-27  3:08                 ` NeilBrown
2018-06-27  4:00                   ` Cory Spitz
2018-06-28  1:26                     ` NeilBrown
2018-06-27 11:01                   ` Andreas Dilger
2018-06-27 12:06                     ` Patrick Farrell
2018-06-28  1:59                       ` NeilBrown
2018-06-28  2:35                         ` Patrick Farrell
2018-06-28 23:12                           ` Andreas Dilger
2018-07-05 23:47                             ` James Simmons
2018-07-06  0:01                               ` Doug Oucharek
2018-06-28 15:03                         ` Cory Spitz
2018-06-28 17:03                           ` Doug Oucharek
2018-07-04 17:54                             ` Alexey Lyashkov
2018-06-28  1:39                     ` NeilBrown
2018-06-21  3:00     ` NeilBrown
2018-06-21  3:42       ` Patrick Farrell
2018-06-24 20:39       ` James Simmons
2018-06-21  2:54   ` NeilBrown
2018-06-24 20:46     ` James Simmons
2018-06-24 23:58       ` NeilBrown

Reply instructions:

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

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

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

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

  git send-email \
    --in-reply-to=alpine.LFD.2.21.1806210233170.3886@casper.infradead.org \
    --to=jsimmons@infradead.org \
    --cc=lustre-devel@lists.lustre.org \
    /path/to/YOUR_REPLY

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

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