NFSv4.1: Deal with wraparound when updating the layout "barrier" seqid
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 2 Oct 2012 23:56:49 +0000 (16:56 -0700)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 3 Oct 2012 00:04:33 +0000 (17:04 -0700)
...and fix a bug in pnfs_set_layout_stateid.

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

index f1387e87513ff619bcea36117fc29795106ec559..de827251bdac192863eb6951b0556b948ecdfce1 100644 (file)
@@ -572,7 +572,7 @@ pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo, const nfs4_stateid *new,
                if (update_barrier) {
                        u32 new_barrier = be32_to_cpu(new->seqid);
 
-                       if ((int)(new_barrier - lo->plh_barrier))
+                       if (pnfs_seqid_is_newer(new_barrier, lo->plh_barrier))
                                lo->plh_barrier = new_barrier;
                } else {
                        /* Because of wraparound, we want to keep the barrier
@@ -593,9 +593,12 @@ static bool
 pnfs_layoutgets_blocked(struct pnfs_layout_hdr *lo, nfs4_stateid *stateid,
                        int lget)
 {
-       if ((stateid) &&
-           (int)(lo->plh_barrier - be32_to_cpu(stateid->seqid)) >= 0)
-               return true;
+       if (stateid != NULL) {
+               u32 seqid = be32_to_cpu(stateid->seqid);
+
+               if (!pnfs_seqid_is_newer(seqid, lo->plh_barrier))
+                       return true;
+       }
        return lo->plh_block_lgets ||
                test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) ||
                (list_empty(&lo->plh_segs) &&