History

NFSv4.1: Handle NFS4ERR_DELAY when resetting the NFSv4.1 session

NFS4ERR_DELAY is a legal reply when we call DESTROY_SESSION. It usually means that the server is busy handling an unfinished RPC request. Just sleep for a second and then retry. We also need to be able to handle the NFS4ERR_BACK_CHAN_BUSY return value. If the NFS server has outstanding callbacks, we just want to similarly sleep & retry.

Trond Myklebust committed 13 years ago

Commit c489ee21 parent edd2e361 file · +12 −2Browse files

Unified · Split

fs/nfs/nfs4state.c+12−2
@@ -2018,8 +2018,18 @@ static int nfs4_reset_session(struct nfs_client *clp) · 2017 unmodified lines
20182018 nfs4_begin_drain_session(clp);
20192019 cred = nfs4_get_exchange_id_cred(clp);
20202020 status = nfs4_proc_destroy_session(clp->cl_session, cred);
2021− if (status && status != -NFS4ERR_BADSESSION &&
2022− status != -NFS4ERR_DEADSESSION) {
2021+ switch (status) {
2022+ case 0:
2023+ case -NFS4ERR_BADSESSION:
2024+ case -NFS4ERR_DEADSESSION:
2025+ break;
2026+ case -NFS4ERR_BACK_CHAN_BUSY:
2027+ case -NFS4ERR_DELAY:
2028+ set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state);
2029+ status = 0;
2030+ ssleep(1);
2031+ goto out;
2032+ default:
20232033 status = nfs4_recovery_handle_error(clp, status);
20242034 goto out;
20252035 }