Commit 25a1a621 authored by Trond Myklebust's avatar Trond Myklebust

NFSv4.1: Deal with wraparound when updating the layout "barrier" seqid

...and fix a bug in pnfs_set_layout_stateid.
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 5a65503f
...@@ -572,7 +572,7 @@ pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo, const nfs4_stateid *new, ...@@ -572,7 +572,7 @@ pnfs_set_layout_stateid(struct pnfs_layout_hdr *lo, const nfs4_stateid *new,
if (update_barrier) { if (update_barrier) {
u32 new_barrier = be32_to_cpu(new->seqid); 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; lo->plh_barrier = new_barrier;
} else { } else {
/* Because of wraparound, we want to keep the barrier /* Because of wraparound, we want to keep the barrier
...@@ -593,9 +593,12 @@ static bool ...@@ -593,9 +593,12 @@ static bool
pnfs_layoutgets_blocked(struct pnfs_layout_hdr *lo, nfs4_stateid *stateid, pnfs_layoutgets_blocked(struct pnfs_layout_hdr *lo, nfs4_stateid *stateid,
int lget) int lget)
{ {
if ((stateid) && if (stateid != NULL) {
(int)(lo->plh_barrier - be32_to_cpu(stateid->seqid)) >= 0) u32 seqid = be32_to_cpu(stateid->seqid);
return true;
if (!pnfs_seqid_is_newer(seqid, lo->plh_barrier))
return true;
}
return lo->plh_block_lgets || return lo->plh_block_lgets ||
test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) || test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) ||
(list_empty(&lo->plh_segs) && (list_empty(&lo->plh_segs) &&
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment