On 2011-12-12 23:00, Tigran Mkrtchyan wrote: > From: Tigran Mkrtchyan <kofemann@xxxxxxxxx> > > plus minor fixes hopefully that's not the case anymore :) > > Conflicts: > > fs/nfsd/nfs4proc.c ditto > > Signed-off-by: Tigran Mkrtchyan <kofemann@xxxxxxxxx> > --- > fs/nfsd/current_stateid.h | 11 ++++++++++- > fs/nfsd/nfs4proc.c | 2 ++ > fs/nfsd/nfs4state.c | 22 ++++++++++++++++++++-- > 3 files changed, 32 insertions(+), 3 deletions(-) > > diff --git a/fs/nfsd/current_stateid.h b/fs/nfsd/current_stateid.h > index a83dd50..21550b6 100644 > --- a/fs/nfsd/current_stateid.h > +++ b/fs/nfsd/current_stateid.h > @@ -4,8 +4,17 @@ > #include "state.h" > #include "xdr4.h" > > +/* > + * functions to set current state id > + */ > extern void nfsd4_set_openstateid(struct nfsd4_compound_state *, struct nfsd4_open *); > -extern void nfsd4_get_closestateid(struct nfsd4_compound_state *, struct nfsd4_close *); > +extern void nfsd4_set_lockstateid(struct nfsd4_compound_state *, struct nfsd4_lock *); > extern void nfsd4_set_closestateid(struct nfsd4_compound_state *, struct nfsd4_close *); > > +/* > + * functions to consume current state id > + */ > +extern void nfsd4_get_closestateid(struct nfsd4_compound_state *, struct nfsd4_close *); > +extern void nfsd4_get_lockustateid(struct nfsd4_compound_state *, struct nfsd4_locku *); > + > #endif /* _NFSD4_CURRENT_STATE_H */ > diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c > index 3dfb235..90c532b 100644 > --- a/fs/nfsd/nfs4proc.c > +++ b/fs/nfsd/nfs4proc.c > @@ -1478,6 +1478,7 @@ static struct nfsd4_operation nfsd4_ops[] = { > .op_flags = OP_MODIFIES_SOMETHING, > .op_name = "OP_LOCK", > .op_rsize_bop = (nfsd4op_rsize)nfsd4_lock_rsize, > + .op_set_currentstateid = (stateid_setter)nfsd4_set_lockstateid, > }, > [OP_LOCKT] = { > .op_func = (nfsd4op_func)nfsd4_lockt, > @@ -1488,6 +1489,7 @@ static struct nfsd4_operation nfsd4_ops[] = { > .op_flags = OP_MODIFIES_SOMETHING, > .op_name = "OP_LOCKU", > .op_rsize_bop = (nfsd4op_rsize)nfsd4_status_stateid_rsize, > + .op_get_currentstateid = (stateid_getter)nfsd4_get_lockustateid, > }, > [OP_LOOKUP] = { > .op_func = (nfsd4op_func)nfsd4_lookup, > diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c > index 594b44e..58410b2 100644 > --- a/fs/nfsd/nfs4state.c > +++ b/fs/nfsd/nfs4state.c > @@ -4564,6 +4564,9 @@ put_stateid(struct nfsd4_compound_state *cstate, stateid_t *stateid) > cstate->current_stateid = stateid; > } > > +/* > + * functions to set current state id > + */ > void > nfsd4_set_openstateid(struct nfsd4_compound_state *cstate, struct nfsd4_open *open) > { > @@ -4571,13 +4574,28 @@ nfsd4_set_openstateid(struct nfsd4_compound_state *cstate, struct nfsd4_open *op > } > > void > +nfsd4_set_closestateid(struct nfsd4_compound_state *cstate, struct nfsd4_close *close) > +{ > + put_stateid(cstate, &close->cl_stateid); > +} > + > +void > +nfsd4_set_lockstateid(struct nfsd4_compound_state *cstate, struct nfsd4_lock *lock) > +{ > + put_stateid(cstate, &lock->lk_resp_stateid); > +} > + > +/* > + * functions to consume current state id > + */ > +void > nfsd4_get_closestateid(struct nfsd4_compound_state *cstate, struct nfsd4_close *close) > { > get_stateid(cstate, &close->cl_stateid); > } > > void > -nfsd4_set_closestateid(struct nfsd4_compound_state *cstate, struct nfsd4_close *close) > +nfsd4_get_lockustateid(struct nfsd4_compound_state *cstate, struct nfsd4_locku *locku) > { > - get_stateid(cstate, &close->cl_stateid); > + get_stateid(cstate, &locku->lu_stateid); Reading Section 8.2.3. Special Stateids, for some reason (that I'm not sure of) RFC5661 requires the following: The stateid passed to the operation in place of the special value has its "seqid" value set to zero, except when the current stateid is used by the operation CLOSE or OPEN_DOWNGRADE. How about defining another get_stateid helper that will clear si_generation? Benny > } -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html