NFSv4.1: Reset the sequence number for slots that have been deallocated
When the server tells us that it is dynamically resizing the session
replay cache, we should reset the sequence number for those slots
that have been deallocated.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index d91abaa..52435ec 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -498,6 +498,22 @@
tbl->generation++;
}
+static void nfs41_set_server_slotid_locked(struct nfs4_slot_table *tbl,
+ u32 highest_slotid)
+{
+ unsigned int max_slotid, i;
+
+ if (tbl->server_highest_slotid == highest_slotid)
+ return;
+ if (tbl->highest_used_slotid > highest_slotid)
+ return;
+ max_slotid = min(tbl->max_slots - 1, highest_slotid);
+ /* Reset the seq_nr for deallocated slots */
+ for (i = tbl->server_highest_slotid + 1; i <= max_slotid; i++)
+ tbl->slots[i].seq_nr = 1;
+ tbl->server_highest_slotid = highest_slotid;
+}
+
static void nfs41_update_target_slotid(struct nfs4_slot_table *tbl,
struct nfs4_slot *slot,
struct nfs4_sequence_res *res)
@@ -505,6 +521,7 @@
spin_lock(&tbl->slot_tbl_lock);
if (tbl->generation != slot->generation)
goto out;
+ nfs41_set_server_slotid_locked(tbl, res->sr_highest_slotid);
nfs41_set_target_slotid_locked(tbl, res->sr_target_highest_slotid);
out:
spin_unlock(&tbl->slot_tbl_lock);
@@ -5718,6 +5735,7 @@
}
tbl->highest_used_slotid = NFS4_NO_SLOT;
tbl->target_highest_slotid = max_slots - 1;
+ tbl->server_highest_slotid = max_slots - 1;
for (i = 0; i < tbl->max_slots; i++)
tbl->slots[i].seq_nr = ivalue;
spin_unlock(&tbl->slot_tbl_lock);