Skip to content

Commit 43912bb

Browse files
trondmypdamschuma-ntap
authored andcommitted
NFSv4.1: Allow test_stateid to handle session errors without waiting
If the server crashes while we're testing stateids for validity, then we want to initiate session recovery. Usually, we will be calling from a state manager thread, though, so we don't really want to wait. Signed-off-by: Trond Myklebust <[email protected]> Tested-by: Oleg Drokin <[email protected]> Signed-off-by: Anna Schumaker <[email protected]>
1 parent 4c8e544 commit 43912bb

File tree

1 file changed

+18
-3
lines changed

1 file changed

+18
-3
lines changed

fs/nfs/nfs4proc.c

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8797,6 +8797,23 @@ static int _nfs41_test_stateid(struct nfs_server *server,
87978797
return -res.status;
87988798
}
87998799

8800+
static void nfs4_handle_delay_or_session_error(struct nfs_server *server,
8801+
int err, struct nfs4_exception *exception)
8802+
{
8803+
exception->retry = 0;
8804+
switch(err) {
8805+
case -NFS4ERR_DELAY:
8806+
nfs4_handle_exception(server, err, exception);
8807+
break;
8808+
case -NFS4ERR_BADSESSION:
8809+
case -NFS4ERR_BADSLOT:
8810+
case -NFS4ERR_BAD_HIGH_SLOT:
8811+
case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
8812+
case -NFS4ERR_DEADSESSION:
8813+
nfs4_do_handle_exception(server, err, exception);
8814+
}
8815+
}
8816+
88008817
/**
88018818
* nfs41_test_stateid - perform a TEST_STATEID operation
88028819
*
@@ -8816,9 +8833,7 @@ static int nfs41_test_stateid(struct nfs_server *server,
88168833
int err;
88178834
do {
88188835
err = _nfs41_test_stateid(server, stateid, cred);
8819-
if (err != -NFS4ERR_DELAY)
8820-
break;
8821-
nfs4_handle_exception(server, err, &exception);
8836+
nfs4_handle_delay_or_session_error(server, err, &exception);
88228837
} while (exception.retry);
88238838
return err;
88248839
}

0 commit comments

Comments
 (0)