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 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 3/7 NFS: Check size by inode_newsize_ok in nfs_setattr
In reply to Kinglong MeeSet 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
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 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
Re: [PATCH 3/7 v2] NFS: Check size by inode_newsize_ok in nfs_setattr
In reply to Kinglong MeeQuoted 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