[pnfs] [PATCH 2/2] Update stateid generation number handling per latest draft
Spencer Shepler
Spencer.Shepler at Sun.COM
Tue Sep 18 12:52:23 EDT 2007
This is the correct interpretation. If the stateid.seqid is non-
zero, then it
is treated as it is in NFSv4.0. If the stateid.seqid is zero, then
it is "ignored"
and treated as if it were the "latest" stateid.seqid. This is all
caveat special
stateid handling.
Spencer
On Sep 18, 2007, at 11:31 AM, Sager, Mike wrote:
> Hi Andy,
>
> My interpretation of this case comes from the start of the last
> paragraph in 8.2.2:
>
> "When stateids are sent to the server by the client, it has two
> choices with regard to the seqid sent. It may set the seqid to zero
> to indicate to the server that it wishes the most up-to-date seqid
> for that stateid's "other" field to be used. This would be the
> common choice in the case of stateid sent with a READ or WRITE
> operation."
>
> Mike
>
>
> -----Original Message-----
> From: William A. (Andy) Adamson [mailto:andros at citi.umich.edu]
> Sent: Tuesday, September 18, 2007 7:01 AM
> To: Sager, Mike
> Cc: pnfs at linux-nfs.org
> Subject: Fwd: [pnfs] [PATCH 2/2] Update stateid generation number
> handling per latest draft
>
> Hi
>
> I'm still not clear on parts of this patch.
>
> >From my understanding on the discussion of this issue at the
> Austin bakeathon, the 4.1 server is supposed to treat the 32 bit
> stateid seqid just like the 4.0 server, to provide the 4.1 client
> an ordering of server execution when the client "sprays" OPENs (or
> LOCK) across sessions on a single clientid.
>
> This patch allows 4.1 server to skip stateid seqid checks when the
> stateid seqid is zero. Where does the draft say this? I can find a
> discription of three other cases (other and seqid zero, other and
> seqid all ones, other zero and seqid non-zero) but not a
> description of other non-zero and seqid zero.
>
> I'm probably just not finding it.
>
> -->Andy
>
> draft 13 section 8.2.3. Special Stateids
> .......
> The following combinations of "other" and "seqid" are defined in
> NFSv4.1:
>
> o When "other" and "seqid" are both zero, the stateid is
> treated as
> a special anonymous stateid, which can be used in READ,
> WRITE, and
> SETATTR requests to indicate the absence of any open state
> associated with the request. When an anonymous stateid value is
> used, and an existing open denies the form of access requested,
> then access will be denied to the request. This stateid MUST
> NOT
> be used on operations to data servers (Section 14.7), nor may it
> be used as the argument to the WANT_DELEGATTION (Section 18.49)
> operation.
>
> o When "other" and "seqid" are both all ones, the stateid is a
> special read bypass stateid. When this value is used in
> WRITE or
> SETATTR, it is treated like the anonymous value. When used in
> READ, the server MAY grant access, even if access would normally
> be denied to READ requests. This stateid MUST NOT be used on
> operations to data servers, nor may it be used as the
> argument to
>
>
>
> Shepler, et al. Expires January 2, 2008 [Page
> 145]
> ^L
> Internet-Draft NFSv4 Minor Version 1 July
> 2007
>
>
> the WANT_DELEGATION operation.
>
> o When "other" is zero and "seqid" is one, the stateid represents
> the current stateid, which is whatever value is the last stateid
> returned by an operation within the COMPOUND. In the case of an
> OPEN, the stateid returned for the open file, and not the
> delegation is used. 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. If there is no operation in the COMPOUND which
> has returned a stateid value, the server MUST return the error
> NFS4ERR_BAD_STATEID.
>
>
>
>
> ---------- Forwarded message ----------
> From: Sager, Mike <Mike.Sager at netapp.com>
> Date: Sep 12, 2007 3:33 PM
> Subject: [pnfs] [PATCH 2/2] Update stateid generation number
> handling per latest draft
> To: pnfs at linux-nfs.org
>
> If the generation number is 0, use the current generation number.
> Also,
> reinstate generation number checking for bad or old stateids.
>
> Signed-off-by: Mike Sager < sager at netapp.com>
> ---
> fs/nfsd/nfs4state.c | 27 +++++++++++++++++----------
> 1 files changed, 17 insertions(+), 10 deletions(-)
>
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index b364707..be3600b 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -2762,15 +2762,22 @@ nfs4_preprocess_stateid_op(struct svc_fh
> *current_fh, stateid_t *stateid, int fl
> goto out;
> stidp = &stp->st_stateid;
> }
> - if (flags & NFS_4_1 && stateid->si_generation !=0 )
> - goto out;
> - if (!(flags & NFS_4_1) && stateid->si_generation > stidp-
> >si_generation)
> + /*
> + * In 4.1, if the stateid's generation number is 0, use the
> + * current generation
> + */
> + if ((flags & NFS_4_1) && stateid->si_generation == 0)
> + goto checkmode;
> +
> + if (stateid->si_generation > stidp->si_generation)
> goto out;
>
> /* OLD STATEID */
> status = nfserr_old_stateid;
> - if (!(flags & NFS_4_1) && stateid->si_generation < stidp-
> >si_generation)
> + if (stateid->si_generation < stidp->si_generation)
> goto out;
> +
> +checkmode:
> if (stp) {
> if ((status = nfs4_check_openmode(stp-
> >st_access_bmap,flags)))
> goto out;
> @@ -2894,12 +2901,12 @@ nfs4_preprocess_seqid_op(struct svc_fh
> *current_fh, u32 seqid, stateid_t *statei
> return nfserr_bad_stateid;
> }
>
> - if (sop->so_minorversion == 1) {
> - if (stateid->si_generation != 0)
> - return nfserr_bad_stateid;
> - else
> - goto renew; /* skip v4.0 generation number
> checks */
> - }
> + /*
> + * In 4.1, if the stateid's generation number is 0, use the
> + * current generation
> + */
> + if (sop->so_minorversion == 1 && stateid->si_generation == 0)
> + goto renew;
>
> if (stateid->si_generation > stp->st_stateid.si_generation) {
> printk("NFSD: preprocess_seqid_op: future stateid?!
> \n");
> --
> 1.5.2.1
>
>
>
> _______________________________________________
> pNFS mailing list
> pNFS at linux-nfs.org
> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
> _______________________________________________
> pNFS mailing list
> pNFS at linux-nfs.org
> http://linux-nfs.org/cgi-bin/mailman/listinfo/pnfs
More information about the pNFS
mailing list