On Fri, Oct 19, 2018 at 11:29:00AM -0400, Olga Kornievskaia wrote: > Needed for copy to add nfs4_cp_state to the nfs4_stid. > > Signed-off-by: Andy Adamson <andros@xxxxxxxxxx> > Signed-off-by: Olga Kornievskaia <kolga@xxxxxxxxxx> > --- > fs/nfsd/nfs4proc.c | 17 ++++++++++------- > fs/nfsd/nfs4state.c | 8 ++++++-- > fs/nfsd/state.h | 3 ++- > 3 files changed, 18 insertions(+), 10 deletions(-) > > diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c > index edff074..29686df 100644 > --- a/fs/nfsd/nfs4proc.c > +++ b/fs/nfsd/nfs4proc.c > @@ -781,7 +781,8 @@ static __be32 nfsd4_do_lookupp(struct svc_rqst *rqstp, struct svc_fh *fh) By the way, I wonder why git-diff is doing such a bad job of guessing the right function? Not a big deal, the patches still apply fine, it just makes reading them in email a little harder. --b. > /* check stateid */ > status = nfs4_preprocess_stateid_op(rqstp, cstate, &cstate->current_fh, > &read->rd_stateid, RD_STATE, > - &read->rd_filp, &read->rd_tmp_file); > + &read->rd_filp, &read->rd_tmp_file, > + NULL); > if (status) { > dprintk("NFSD: nfsd4_read: couldn't process stateid!\n"); > goto out; > @@ -954,7 +955,7 @@ static __be32 nfsd4_do_lookupp(struct svc_rqst *rqstp, struct svc_fh *fh) > if (setattr->sa_iattr.ia_valid & ATTR_SIZE) { > status = nfs4_preprocess_stateid_op(rqstp, cstate, > &cstate->current_fh, &setattr->sa_stateid, > - WR_STATE, NULL, NULL); > + WR_STATE, NULL, NULL, NULL); > if (status) { > dprintk("NFSD: nfsd4_setattr: couldn't process stateid!\n"); > return status; > @@ -1005,7 +1006,7 @@ static __be32 nfsd4_do_lookupp(struct svc_rqst *rqstp, struct svc_fh *fh) > trace_nfsd_write_start(rqstp, &cstate->current_fh, > write->wr_offset, cnt); > status = nfs4_preprocess_stateid_op(rqstp, cstate, &cstate->current_fh, > - stateid, WR_STATE, &filp, NULL); > + stateid, WR_STATE, &filp, NULL, NULL); > if (status) { > dprintk("NFSD: nfsd4_write: couldn't process stateid!\n"); > return status; > @@ -1039,14 +1040,16 @@ static __be32 nfsd4_do_lookupp(struct svc_rqst *rqstp, struct svc_fh *fh) > __be32 status; > > status = nfs4_preprocess_stateid_op(rqstp, cstate, &cstate->save_fh, > - src_stateid, RD_STATE, src, NULL); > + src_stateid, RD_STATE, src, NULL, > + NULL); > if (status) { > dprintk("NFSD: %s: couldn't process src stateid!\n", __func__); > goto out; > } > > status = nfs4_preprocess_stateid_op(rqstp, cstate, &cstate->current_fh, > - dst_stateid, WR_STATE, dst, NULL); > + dst_stateid, WR_STATE, dst, NULL, > + NULL); > if (status) { > dprintk("NFSD: %s: couldn't process dst stateid!\n", __func__); > goto out_put_src; > @@ -1350,7 +1353,7 @@ struct nfsd4_copy * > > status = nfs4_preprocess_stateid_op(rqstp, cstate, &cstate->current_fh, > &fallocate->falloc_stateid, > - WR_STATE, &file, NULL); > + WR_STATE, &file, NULL, NULL); > if (status != nfs_ok) { > dprintk("NFSD: nfsd4_fallocate: couldn't process stateid!\n"); > return status; > @@ -1409,7 +1412,7 @@ struct nfsd4_copy * > > status = nfs4_preprocess_stateid_op(rqstp, cstate, &cstate->current_fh, > &seek->seek_stateid, > - RD_STATE, &file, NULL); > + RD_STATE, &file, NULL, NULL); > if (status) { > dprintk("NFSD: nfsd4_seek: couldn't process stateid!\n"); > return status; > diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c > index 07a57d0..e263fd0 100644 > --- a/fs/nfsd/nfs4state.c > +++ b/fs/nfsd/nfs4state.c > @@ -5159,7 +5159,8 @@ static __be32 nfsd4_validate_stateid(struct nfs4_client *cl, stateid_t *stateid) > __be32 > nfs4_preprocess_stateid_op(struct svc_rqst *rqstp, > struct nfsd4_compound_state *cstate, struct svc_fh *fhp, > - stateid_t *stateid, int flags, struct file **filpp, bool *tmp_file) > + stateid_t *stateid, int flags, struct file **filpp, > + bool *tmp_file, struct nfs4_stid **cstid) > { > struct inode *ino = d_inode(fhp->fh_dentry); > struct net *net = SVC_NET(rqstp); > @@ -5210,8 +5211,11 @@ static __be32 nfsd4_validate_stateid(struct nfs4_client *cl, stateid_t *stateid) > if (!status && filpp) > status = nfs4_check_file(rqstp, fhp, s, filpp, tmp_file, flags); > out: > - if (s) > + if (s) { > + if (!status && cstid) > + *cstid = s; > nfs4_put_stid(s); > + } > return status; > } > > diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h > index 6aacb32..304de3b 100644 > --- a/fs/nfsd/state.h > +++ b/fs/nfsd/state.h > @@ -606,7 +606,8 @@ struct nfsd4_blocked_lock { > > extern __be32 nfs4_preprocess_stateid_op(struct svc_rqst *rqstp, > struct nfsd4_compound_state *cstate, struct svc_fh *fhp, > - stateid_t *stateid, int flags, struct file **filp, bool *tmp_file); > + stateid_t *stateid, int flags, struct file **filp, > + bool *tmp_file, struct nfs4_stid **cstid); > __be32 nfsd4_lookup_stateid(struct nfsd4_compound_state *cstate, > stateid_t *stateid, unsigned char typemask, > struct nfs4_stid **s, struct nfsd_net *nn); > -- > 1.8.3.1