NFSv4.1: freeze the session table upon receiving NFS4ERR_BADSESSION
authorOlga Kornievskaia <kolga@netapp.com>
Sun, 18 Jun 2023 21:32:25 +0000 (17:32 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 19 Jun 2023 19:10:57 +0000 (15:10 -0400)
When the client received NFS4ERR_BADSESSION, it schedules recovery
and start the state manager thread which in turn freezes the
session table and does not allow for any new requests to use the
no-longer valid session. However, it is possible that before
the state manager thread runs, a new operation would use the
released slot that received BADSESSION and was therefore not
updated its sequence number. Such re-use of the slot can lead
the application errors.

Fixes: 5c441544f045 ("NFSv4.x: Handle bad/dead sessions correctly in nfs41_sequence_process()")
Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/nfs4proc.c

index 6fcee85e30caec1bf9a079e8f872793e47bb6add..212971ddb14919eb0b223262225c95bae5c3cc7b 100644 (file)
@@ -921,6 +921,7 @@ out:
 out_noaction:
        return ret;
 session_recover:
+       set_bit(NFS4_SLOT_TBL_DRAINING, &session->fc_slot_table.slot_tbl_state);
        nfs4_schedule_session_recovery(session, status);
        dprintk("%s ERROR: %d Reset session\n", __func__, status);
        nfs41_sequence_free_slot(res);