No subject


Wed Sep 5 20:48:46 EDT 2007


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

------=_Part_16701_32751871.1190124086635
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Hi<br>
<br>
I&#39;m still not clear on parts of this patch.<br>
<br>


More information about the pNFS mailing list