]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
NFSv4.1: Ensure that the layout sequence id stays 'close' to the current
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 4 Oct 2012 23:32:22 +0000 (16:32 -0700)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 4 Oct 2012 23:57:48 +0000 (16:57 -0700)
Clamp the layout barrier sequence id to the current sequence id
minus the maximum number of outstanding layoutget requests.

Also ensure that we correctly initialise lo->plh_barrier if there are
no layout segments associated to this layout header.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/pnfs.c

index 42613bd19f8e77dcfe4d4b7803c0d7969c4f1354..861dd97b569ee28553c3785803bab159ba238c7c 100644 (file)
@@ -563,28 +563,23 @@ void
 pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo, const nfs4_stateid *new,
                        bool update_barrier)
 {
-       u32 oldseq, newseq;
+       u32 oldseq, newseq, new_barrier;
+       int empty = list_empty(&lo->plh_segs);
 
        oldseq = be32_to_cpu(lo->plh_stateid.seqid);
        newseq = be32_to_cpu(new->seqid);
-       if (list_empty(&lo->plh_segs) || pnfs_seqid_is_newer(newseq, oldseq)) {
+       if (empty || pnfs_seqid_is_newer(newseq, oldseq)) {
                nfs4_stateid_copy(&lo->plh_stateid, new);
                if (update_barrier) {
-                       u32 new_barrier = be32_to_cpu(new->seqid);
-
-                       if (pnfs_seqid_is_newer(new_barrier, lo->plh_barrier))
-                               lo->plh_barrier = new_barrier;
+                       new_barrier = be32_to_cpu(new->seqid);
                } else {
                        /* Because of wraparound, we want to keep the barrier
-                        * "close" to the current seqids.  It needs to be
-                        * within 2**31 to count as "behind", so if it
-                        * gets too near that limit, give us a litle leeway
-                        * and bring it to within 2**30.
-                        * NOTE - and yes, this is all unsigned arithmetic.
+                        * "close" to the current seqids.
                         */
-                       if (unlikely((newseq - lo->plh_barrier) > (3 << 29)))
-                               lo->plh_barrier = newseq - (1 << 30);
+                       new_barrier = newseq - atomic_read(&lo->plh_outstanding);
                }
+               if (empty || pnfs_seqid_is_newer(new_barrier, lo->plh_barrier))
+                       lo->plh_barrier = new_barrier;
        }
 }