Some bugfixes and exclcreat supports
Subsystems (2)
v2 cover Some bugfixes and exclcreat supports
The first 3 are some bugfixes, the 4th is an update. The last 3 is for supporting exclcreat.
Kinglong Mee (7):
NFS: Remove duplicate svc_xprt_put from nfs41_callback_up
NFS: Error out when register_shrinker fail in register_nfs_fs
NFS: Check size by inode_newsize_ok in nfs_setattr
NFS: Make opened as optional argument in _nfs4_do_open
NFS: Update NFS4_BITMAP_SIZE
NFS: Get suppattr_exclcreat when getting server capabilities
NFS: Send attributes in OPEN request for NFS4_CREATE_EXCLUSIVE4_1
fs/nfs/callback.c | 4 ---- fs/nfs/inode.c | 11 +++++----- fs/nfs/nfs4file.c | 3 +-- fs/nfs/nfs4proc.c | 37 +++++++++++++++++++++++++-------- fs/nfs/nfs4xdr.c | 52 +++++++++++++++++++++++++++++++++++------------ fs/nfs/super.c | 7 +++++-- include/linux/nfs_fs_sb.h | 5 +++++ include/linux/nfs_xdr.h | 4 +++- include/uapi/linux/nfs4.h | 2 +- 9 files changed, 88 insertions(+), 37 deletions(-)
Signature · 1 line
2.4.3
PATCH v2 1/7 NFS: Remove duplicate svc_xprt_put from nfs41_callback_up
The xprt created by svc_create_xprt have be added to serv->sv_permsocks. So putting the xprt directly is useless.
Otherwise, there is a more svc_xprt_put after the xprt be freed.
v2, same as v1.
--- fs/nfs/callback.c | 4 ---- 1 file changed, 4 deletions(-)
fs/nfs/callback.c +0 -4
@@ -162,10 +162,6 @@ nfs41_callback_up(struct svc_serv *serv)spin_lock_init (&serv->sv_cb_lock);init_waitqueue_head (&serv->sv_cb_waitq); rqstp =svc_prepare_thread (serv, &serv->sv_pools[0 ],NUMA_NO_NODE ); -if (IS_ERR (rqstp)) { -svc_xprt_put (serv->sv_bc_xprt); - serv->sv_bc_xprt =NULL ; - }dprintk ("--> %s return %d\n" , __func__,PTR_ERR_OR_ZERO (rqstp));return rqstp; }
Signature · 1 line
2.4.3
PATCH v2 3/7 NFS: Check size by inode_newsize_ok in nfs_setattr
Set rlimit for NFS's files is useless right now.
For local process's rlimit, it should be checked by nfs client.
The same, CIFS also call inode_change_ok checking rlimit at its client in cifs_setattr_nounix() and cifs_setattr_unix().
v2, same as v1.
--- fs/nfs/inode.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
fs/nfs/inode.c +5 -6
@@ -513,15 +513,14 @@ nfs_setattr(struct dentry *dentry, struct iattr *attr) attr->ia_valid &= ~ATTR_MODE ;if (attr->ia_valid &ATTR_SIZE ) { -loff_t i_size; -BUG_ON (!S_ISREG (inode->i_mode)); - i_size =i_size_read (inode); -if (attr->ia_size == i_size) + error =inode_newsize_ok (inode, attr->ia_size); +if (error) +return error; + +if (attr->ia_size ==i_size_read (inode)) attr->ia_valid &= ~ATTR_SIZE ; -else if (attr->ia_size < i_size &&IS_SWAPFILE (inode)) -return -ETXTBSY ; }/* Optimization: if the end result is no change, don't RPC */
Signature · 1 line
2.4.3
Re: [PATCH 3/7 v2] NFS: Check size by inode_newsize_ok in nfs_setattr
Quoted 20 lines · Kinglong Mee
Set rlimit for NFS's files is useless right now.
For local process's rlimit, it should be checked by nfs client.The same, CIFS also call
inode_change_okchecking rlimit at its client incifs_setattr_nounix()andcifs_setattr_unix().v2, same as v1.
Signed-off-by Kinglong Mee <[email protected]>--- fs/nfs/inode.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)fs/nfs/inode.c +0
-0@@ -513,15 +513,14 @@ nfs_setattr(struct dentry *dentry, struct iattr *attr) attr->ia_valid &= ~ATTR_MODE ;
fs/nfs/inode.c nfs_setattr(struct dentry *dentry, struct iattr *attr) · line 520
Quoted 10 lines
fs/nfs/inode.c +3
-4if (attr->ia_valid &ATTR_SIZE ) { -loff_t i_size; -BUG_ON (!S_ISREG (inode->i_mode)); - i_size =i_size_read (inode); -if (attr->ia_size == i_size) + error =inode_newsize_ok (inode, attr->ia_size); +if (error) +return error;
So sorry!
Use "error" will cause a bug for the following code of error out. I will update it in the new version.
thanks,
Kinglong Mee
Re: [PATCH 3/7 v2] NFS: Check size by inode_newsize_ok in nfs_setattr
Hi Kinglong,
Quoted 34 lines · Kinglong Mee
Quoted 20 lines · Kinglong Mee
Set rlimit for NFS's files is useless right now.
For local process's rlimit, it should be checked by nfs client.The same, CIFS also call
inode_change_okchecking rlimit at its client incifs_setattr_nounix()andcifs_setattr_unix().v2, same as v1.
Signed-off-by Kinglong Mee <[email protected]>--- fs/nfs/inode.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)fs/nfs/inode.c +0
-0@@ -513,15 +513,14 @@ nfs_setattr(struct dentry *dentry, struct iattr *attr) attr->ia_valid &= ~ATTR_MODE ;fs/nfs/inode.c nfs_setattr(struct dentry *dentry, struct iattr *attr) · line 520
Quoted 10 lines
fs/nfs/inode.c +3
-4if (attr->ia_valid &ATTR_SIZE ) { -loff_t i_size; -BUG_ON (!S_ISREG (inode->i_mode)); - i_size =i_size_read (inode); -if (attr->ia_size == i_size) + error =inode_newsize_ok (inode, attr->ia_size); +if (error) +return error;So sorry!
Quoted 2 lines
Use "error" will cause a bug for the following code of error out. I will update it in the new version.
Did you ever send the update for this? I don't seem to have it in my inbox.
Cheers
Trond
PATCH v2 4/7 NFS: Make opened as optional argument in _nfs4_do_open
In reply to Kinglong MeeCheck opened, only update it when non-NULL. It's not needs define an unused value for the opened when calling _nfs4_do_open.
v2, add change-log.
--- fs/nfs/nfs4file.c | 3 +-- fs/nfs/nfs4proc.c | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-)
fs/nfs/nfs4file.c +1 -2
@@ -27,7 +27,6 @@ nfs4_file_open(struct inode *inode, struct file *filp)struct inode *dir;unsigned openflags = filp->f_flags;struct iattr attr; -int opened =0 ;int err;/*
@@ -66,7 +65,7 @@ nfs4_file_open(struct inode *inode, struct file *filp)nfs_sync_inode (inode); } - inode =NFS_PROTO (dir)->open_context (dir, ctx, openflags, &attr, &opened); + inode =NFS_PROTO (dir)->open_context (dir, ctx, openflags, &attr,NULL );if (IS_ERR (inode)) { err =PTR_ERR (inode);switch (err) {
fs/nfs/nfs4proc.c +2 -3
@@ -2439,7 +2439,7 @@ static int _nfs4_do_open(struct inode *dir,nfs_setsecurity (state->inode, opendata->o_res.f_attr, olabel); } } -if (opendata->file_created) +if (opened && opendata->file_created) *opened |=FILE_CREATED ;if (pnfs_use_threshold (ctx_th, opendata->f_attr.mdsthreshold, server)) {
@@ -3552,7 +3552,6 @@ nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,struct nfs4_label l, *ilabel =NULL ;struct nfs_open_context *ctx;struct nfs4_state *state; -int opened =0 ;int status =0 ; ctx =alloc_nfs_open_context (dentry,FMODE_READ );
@@ -3562,7 +3561,7 @@ nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, ilabel =nfs4_label_init_security (dir, dentry, sattr, &l); sattr->ia_mode &= ~current_umask (); - state =nfs4_do_open (dir, ctx, flags, sattr, ilabel, &opened); + state =nfs4_do_open (dir, ctx, flags, sattr, ilabel,NULL );if (IS_ERR (state)) { status =PTR_ERR (state); goto out;
Signature · 1 line
2.4.3
PATCH v2 4/7 NFS: Make opened as optional argument in _nfs4_do_open
In reply to Kinglong MeeCheck opened, only update it when non-NULL. It's not needs define an unused value for the opened when calling _nfs4_do_open.
v2, add change-log.
--- fs/nfs/nfs4file.c | 3 +-- fs/nfs/nfs4proc.c | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-)
fs/nfs/nfs4file.c +1 -2
@@ -27,7 +27,6 @@ nfs4_file_open(struct inode *inode, struct file *filp)struct inode *dir;unsigned openflags = filp->f_flags;struct iattr attr; -int opened =0 ;int err;/*
@@ -66,7 +65,7 @@ nfs4_file_open(struct inode *inode, struct file *filp)nfs_sync_inode (inode); } - inode =NFS_PROTO (dir)->open_context (dir, ctx, openflags, &attr, &opened); + inode =NFS_PROTO (dir)->open_context (dir, ctx, openflags, &attr,NULL );if (IS_ERR (inode)) { err =PTR_ERR (inode);switch (err) {
fs/nfs/nfs4proc.c +2 -3
@@ -2439,7 +2439,7 @@ static int _nfs4_do_open(struct inode *dir,nfs_setsecurity (state->inode, opendata->o_res.f_attr, olabel); } } -if (opendata->file_created) +if (opened && opendata->file_created) *opened |=FILE_CREATED ;if (pnfs_use_threshold (ctx_th, opendata->f_attr.mdsthreshold, server)) {
@@ -3552,7 +3552,6 @@ nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,struct nfs4_label l, *ilabel =NULL ;struct nfs_open_context *ctx;struct nfs4_state *state; -int opened =0 ;int status =0 ; ctx =alloc_nfs_open_context (dentry,FMODE_READ );
@@ -3562,7 +3561,7 @@ nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, ilabel =nfs4_label_init_security (dir, dentry, sattr, &l); sattr->ia_mode &= ~current_umask (); - state =nfs4_do_open (dir, ctx, flags, sattr, ilabel, &opened); + state =nfs4_do_open (dir, ctx, flags, sattr, ilabel,NULL );if (IS_ERR (state)) { status =PTR_ERR (state); goto out;
Signature · 1 line
2.4.3
PATCH v2 2/7 NFS: Error out when register_shrinker fail in register_nfs_fs
In reply to Kinglong MeeCommit 1d3d4437ea "vmscan: per-node deferred work" have made register_shrinker can return an intergater error.
If register_shrinker() fail, the later unregister_shrinker() will
cause a NULL pointer access.
v2, same as v1.
--- fs/nfs/super.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
fs/nfs/super.c +5 -2
@@ -381,9 +381,12 @@ int __init register_nfs_fs(void) ret =nfs_register_sysctl ();if (ret <0 ) goto error_2; -register_shrinker (&acl_shrinker); + ret =register_shrinker (&acl_shrinker); +if (ret <0 ) + goto error_3;return 0 ; - +error_3: +nfs_unregister_sysctl (); error_2:unregister_nfs4_fs (); error_1:
Signature · 1 line
2.4.3
PATCH v2 5/7 NFS: Update NFS4_BITMAP_SIZE
In reply to Kinglong Meev4.1/v4.2 have define attributes at word2, nfs client also support security label now.
v2, new one.
--- include/uapi/linux/nfs4.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/uapi/linux/nfs4.h +1 -1
@@ -15,7 +15,7 @@#include <linux/types.h> -#define NFS4_BITMAP_SIZE 2 +#define NFS4_BITMAP_SIZE 3#define NFS4_VERIFIER_SIZE 8#define NFS4_STATEID_SEQID_SIZE 4#define NFS4_STATEID_OTHER_SIZE 12
Signature · 1 line
2.4.3
PATCH v2 6/7 NFS: Get suppattr_exclcreat when getting server, capabilities
In reply to Kinglong MeeCreate file with attributs as NFS4_CREATE_EXCLUSIVE4_1 mode depends on suppattr_exclcreat attribut.
v2, new one.
--- fs/nfs/nfs4proc.c | 14 +++++++++++++- fs/nfs/nfs4xdr.c | 26 +++++++++++++++++++++----- include/linux/nfs_fs_sb.h | 5 +++++ include/linux/nfs_xdr.h | 2 ++ 4 files changed, 41 insertions(+), 6 deletions(-)
fs/nfs/nfs4proc.c +13 -1
@@ -2883,8 +2883,10 @@ static void nfs4_close_context(struct nfs_open_context *ctx, int is_sync)static int _nfs4_server_capabilities (struct nfs_server *server,struct nfs_fh *fhandle) { +u32 bitmask[3 ] = {}, minorversion = server->nfs_client->cl_minorversion;struct nfs4_server_caps_arg args = { .fhandle = fhandle, + .bitmask = bitmask, };struct nfs4_server_caps_res res = {};struct rpc_message msg = {
@@ -2894,10 +2896,18 @@ static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *f };int status; + bitmask[0 ] =FATTR4_WORD0_SUPPORTED_ATTRS | +FATTR4_WORD0_FH_EXPIRE_TYPE | +FATTR4_WORD0_LINK_SUPPORT | +FATTR4_WORD0_SYMLINK_SUPPORT | +FATTR4_WORD0_ACLSUPPORT ; +if (minorversion) + bitmask[2 ] =FATTR4_WORD2_SUPPATTR_EXCLCREAT ; + status =nfs4_call_sync (server->client, server, &msg, &args.seq_args, &res.seq_res,0 );if (status ==0 ) {/* Sanity check the server answers */ -switch (server->nfs_client->cl_minorversion) { +switch (minorversion) {case 0 : res.attr_bitmask[1 ] &=FATTR4_WORD1_NFS40_MASK ; res.attr_bitmask[2 ] =0 ;
@@ -2950,6 +2960,8 @@ static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *f server->cache_consistency_bitmask[0 ] &=FATTR4_WORD0_CHANGE |FATTR4_WORD0_SIZE ; server->cache_consistency_bitmask[1 ] &=FATTR4_WORD1_TIME_METADATA |FATTR4_WORD1_TIME_MODIFY ; server->cache_consistency_bitmask[2 ] =0 ; +memcpy (server->exclcreat_bitmask, res.exclcreat_bitmask, +sizeof (server->exclcreat_bitmask)); server->acl_bitmask = res.acl_bitmask; server->fh_expire_type = res.fh_expire_type; }
fs/nfs/nfs4xdr.c +21 -5
@@ -2580,6 +2580,7 @@ static void nfs4_xdr_enc_server_caps(struct rpc_rqst *req,struct xdr_stream *xdr, struct nfs4_server_caps_arg *args) { + const u32 *bitmask = args->bitmask;struct compound_hdr hdr = { .minorversion =nfs4_xdr_minorversion (&args->seq_args), };
@@ -2587,11 +2588,7 @@ static void nfs4_xdr_enc_server_caps(struct rpc_rqst *req,encode_compound_hdr (xdr, req, &hdr);encode_sequence (xdr, &args->seq_args, &hdr);encode_putfh (xdr, args->fhandle, &hdr); -encode_getattr_one (xdr,FATTR4_WORD0_SUPPORTED_ATTRS | -FATTR4_WORD0_FH_EXPIRE_TYPE | -FATTR4_WORD0_LINK_SUPPORT | -FATTR4_WORD0_SYMLINK_SUPPORT | -FATTR4_WORD0_ACLSUPPORT , &hdr); +encode_getattr_three (xdr, bitmask[0 ], bitmask[1 ], bitmask[2 ], &hdr);encode_nops (&hdr); }
@@ -3368,6 +3365,22 @@ out_overflow:return -EIO ; } +static int decode_attr_exclcreat_supported (struct xdr_stream *xdr, +uint32_t *bitmap,uint32_t *bitmask) +{ +if (likely (bitmap[2 ] &FATTR4_WORD2_SUPPATTR_EXCLCREAT )) { +int ret; + ret =decode_attr_bitmap (xdr, bitmask); +if (unlikely (ret <0 )) +return ret; + bitmap[2 ] &= ~FATTR4_WORD2_SUPPATTR_EXCLCREAT ; + }else + bitmask[0 ] = bitmask[1 ] = bitmask[2 ] =0 ; +dprintk ("%s: bitmask=%08x:%08x:%08x\n" , __func__, + bitmask[0 ], bitmask[1 ], bitmask[2 ]); +return 0 ; +} +static int decode_attr_filehandle (struct xdr_stream *xdr,uint32_t *bitmap,struct nfs_fh *fh) {__be32 *p;
@@ -4321,6 +4334,9 @@ static int decode_server_caps(struct xdr_stream *xdr, struct nfs4_server_caps_re goto xdr_error;if ((status =decode_attr_aclsupport (xdr, bitmap, &res->acl_bitmask)) !=0 ) goto xdr_error; +if ((status =decode_attr_exclcreat_supported (xdr, bitmap, + res->exclcreat_bitmask)) !=0 ) + goto xdr_error; status =verify_attr_len (xdr, savep, attrlen); xdr_error:dprintk ("%s: xdr returned %d!\n" , __func__, -status);
include/linux/nfs_fs_sb.h +5 -0
@@ -173,6 +173,11 @@ struct nfs_server {set of attributes supported on this filesystem excluding the label support bit. */ +u32 exclcreat_bitmask[3 ]; +/* V4 bitmask representing the +set of attributes supported +on this filesystem for the +exclusive create. */ u32 cache_consistency_bitmask[3 ];/* V4 bitmask representing the subset of change attribute, size, ctime
include/linux/nfs_xdr.h +2 -0
@@ -1057,11 +1057,13 @@ struct nfs4_statfs_res {struct nfs4_server_caps_arg {struct nfs4_sequence_args seq_args;struct nfs_fh *fhandle; +const u32 * bitmask; };struct nfs4_server_caps_res {struct nfs4_sequence_res seq_res;u32 attr_bitmask[3 ]; +u32 exclcreat_bitmask[3 ];u32 acl_bitmask;u32 has_links;u32 has_symlinks;
Signature · 1 line
2.4.3
PATCH v2 7/7 NFS: Send attributes in OPEN request for NFS4_CREATE_EXCLUSIVE4_1
In reply to Kinglong MeeClient sends a SETATTR request after OPEN for updating attributes. For create file with S_ISGID is set, the S_ISGID in SETATTR will be ignored at nfs server as chmod of no PERMISSION.
v2, base on suppattr_exclcreat.
--- fs/nfs/nfs4proc.c | 18 ++++++++++++++---- fs/nfs/nfs4xdr.c | 26 ++++++++++++++++++-------- include/linux/nfs_xdr.h | 2 +- 3 files changed, 33 insertions(+), 13 deletions(-)
fs/nfs/nfs4proc.c +14 -4
@@ -2294,15 +2294,25 @@ static int nfs41_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *st* fields corresponding to attributes that were used to store the verifier. * Make sure we clobber those fields in the later setattr call */ -static inline void nfs4_exclusive_attrset (struct nfs4_opendata *opendata,struct iattr *sattr) +static inline void nfs4_exclusive_attrset (struct nfs4_opendata *opendata, +struct iattr *sattr,struct nfs4_label **label) { -if ((opendata->o_res.attrset[1 ] &FATTR4_WORD1_TIME_ACCESS ) && +const u32 *attrset = opendata->o_res.attrset; + +if ((attrset[1 ] &FATTR4_WORD1_TIME_ACCESS ) && !(sattr->ia_valid &ATTR_ATIME_SET )) sattr->ia_valid |=ATTR_ATIME ; -if ((opendata->o_res.attrset[1 ] &FATTR4_WORD1_TIME_MODIFY ) && +if ((attrset[1 ] &FATTR4_WORD1_TIME_MODIFY ) && !(sattr->ia_valid &ATTR_MTIME_SET )) sattr->ia_valid |=ATTR_MTIME ; + +/* Except MODE, it seems harmless of setting twice. */ +if ((attrset[1 ] &FATTR4_WORD1_MODE )) + sattr->ia_valid &= ~ATTR_MODE ; + +if (attrset[2 ] &FATTR4_WORD2_SECURITY_LABEL ) + *label =NULL ; } static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
@@ -2427,7 +2437,7 @@ static int _nfs4_do_open(struct inode *dir,if ((opendata->o_arg.open_flags &O_EXCL ) && (opendata->o_arg.createmode !=NFS4_CREATE_GUARDED )) { -nfs4_exclusive_attrset (opendata, sattr); +nfs4_exclusive_attrset (opendata, sattr, &label);nfs_fattr_init (opendata->o_res.f_attr); status = nfs4_do_setattr(state->inode, cred,
fs/nfs/nfs4xdr.c +18 -8
@@ -1001,7 +1001,8 @@ static void encode_nfs4_verifier(struct xdr_stream *xdr, const nfs4_verifier *vestatic void encode_attrs (struct xdr_stream *xdr,const struct iattr *iap,const struct nfs4_label *label, -const struct nfs_server *server) +const struct nfs_server *server, +bool excl_check) {char owner_name[IDMAP_NAMESZ ];char owner_group[IDMAP_NAMESZ ];
@@ -1067,6 +1068,17 @@ static void encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, bmval[1 ] |=FATTR4_WORD1_TIME_MODIFY_SET ; len +=4 ; } + +if (excl_check) { +const u32 *excl_bmval = server->exclcreat_bitmask; + bmval[0 ] &= excl_bmval[0 ]; + bmval[1 ] &= excl_bmval[1 ]; + bmval[2 ] &= excl_bmval[2 ]; + +if (!(excl_bmval[2 ] &FATTR4_WORD2_SECURITY_LABEL )) + label =NULL ; + } +if (label) { len +=4 +4 +4 + (XDR_QUADLEN (label->len) <<2 ); bmval[2 ] |=FATTR4_WORD2_SECURITY_LABEL ;
@@ -1168,7 +1180,7 @@ static void encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg * }encode_string (xdr, create->name->len, create->name->name); -encode_attrs (xdr, create->attrs, create->label, create->server); +encode_attrs (xdr, create->attrs, create->label, create->server, false); }static void encode_getattr_one (struct xdr_stream *xdr,uint32_t bitmap,struct compound_hdr *hdr)
@@ -1382,18 +1394,17 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_openastatic inline void encode_createmode (struct xdr_stream *xdr,const struct nfs_openargs *arg) { -struct iattr dummy;__be32 *p; p =reserve_space (xdr,4 );switch (arg->createmode) {case NFS4_CREATE_UNCHECKED : *p =cpu_to_be32 (NFS4_CREATE_UNCHECKED ); -encode_attrs (xdr, arg->u.attrs, arg->label, arg->server); +encode_attrs (xdr, arg->u.attrs, arg->label, arg->server, false);break ;case NFS4_CREATE_GUARDED : *p =cpu_to_be32 (NFS4_CREATE_GUARDED ); -encode_attrs (xdr, arg->u.attrs, arg->label, arg->server); +encode_attrs (xdr, arg->u.attrs, arg->label, arg->server, false);break ;case NFS4_CREATE_EXCLUSIVE : *p =cpu_to_be32 (NFS4_CREATE_EXCLUSIVE );
@@ -1402,8 +1413,7 @@ static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_opcase NFS4_CREATE_EXCLUSIVE4_1 : *p =cpu_to_be32 (NFS4_CREATE_EXCLUSIVE4_1 );encode_nfs4_verifier (xdr, &arg->u.verifier); - dummy.ia_valid =0 ; -encode_attrs (xdr, &dummy, arg->label, arg->server); +encode_attrs (xdr, arg->u.attrs, arg->label, arg->server, true); } }
@@ -1659,7 +1669,7 @@ static void encode_setattr(struct xdr_stream *xdr, const struct nfs_setattrargs {encode_op_hdr (xdr,OP_SETATTR , decode_setattr_maxsz, hdr);encode_nfs4_stateid (xdr, &arg->stateid); -encode_attrs (xdr, arg->iap, arg->label, server); +encode_attrs (xdr, arg->iap, arg->label, server, false); }static void encode_setclientid (struct xdr_stream *xdr,const struct nfs4_setclientid *setclientid,struct compound_hdr *hdr)
include/linux/nfs_xdr.h +1 -1
@@ -379,7 +379,7 @@ struct nfs_openargs {struct stateowner_id id;union {struct { -struct iattr * attrs;/* UNCHECKED, GUARDED */ +struct iattr * attrs;/* UNCHECKED, GUARDED, EXCLUSIVE4_1 */ nfs4_verifier verifier;/* EXCLUSIVE */ };nfs4_stateid delegation;/* CLAIM_DELEGATE_CUR */
Signature · 1 line
2.4.3