Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 67e7b52d authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4: Ensure state recovery handles ETIMEDOUT correctly



Ensure that the state recovery code handles ETIMEDOUT correctly,
and also that we set RPC_TASK_TIMEOUT when recovering open state.

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent dea1bb35
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -2179,6 +2179,7 @@ static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct
		case -ENOENT:
		case -ENOENT:
		case -EAGAIN:
		case -EAGAIN:
		case -ESTALE:
		case -ESTALE:
		case -ETIMEDOUT:
			break;
			break;
		case -NFS4ERR_BADSESSION:
		case -NFS4ERR_BADSESSION:
		case -NFS4ERR_BADSLOT:
		case -NFS4ERR_BADSLOT:
@@ -2499,6 +2500,7 @@ static int nfs4_run_open_task(struct nfs4_opendata *data,
	if (!ctx) {
	if (!ctx) {
		nfs4_init_sequence(&o_arg->seq_args, &o_res->seq_res, 1, 1);
		nfs4_init_sequence(&o_arg->seq_args, &o_res->seq_res, 1, 1);
		data->is_recover = true;
		data->is_recover = true;
		task_setup_data.flags |= RPC_TASK_TIMEOUT;
	} else {
	} else {
		nfs4_init_sequence(&o_arg->seq_args, &o_res->seq_res, 1, 0);
		nfs4_init_sequence(&o_arg->seq_args, &o_res->seq_res, 1, 0);
		pnfs_lgopen_prepare(data, ctx);
		pnfs_lgopen_prepare(data, ctx);
+5 −2
Original line number Original line Diff line number Diff line
@@ -1529,6 +1529,7 @@ static int nfs4_reclaim_locks(struct nfs4_state *state, const struct nfs4_state_
		switch (status) {
		switch (status) {
		case 0:
		case 0:
			break;
			break;
		case -ETIMEDOUT:
		case -ESTALE:
		case -ESTALE:
		case -NFS4ERR_ADMIN_REVOKED:
		case -NFS4ERR_ADMIN_REVOKED:
		case -NFS4ERR_STALE_STATEID:
		case -NFS4ERR_STALE_STATEID:
@@ -1682,11 +1683,13 @@ static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp, const struct nfs
		case -NFS4ERR_EXPIRED:
		case -NFS4ERR_EXPIRED:
		case -NFS4ERR_NO_GRACE:
		case -NFS4ERR_NO_GRACE:
			nfs4_state_mark_reclaim_nograce(sp->so_server->nfs_client, state);
			nfs4_state_mark_reclaim_nograce(sp->so_server->nfs_client, state);
			/* Fall through */
		case -NFS4ERR_STALE_CLIENTID:
		case -NFS4ERR_STALE_CLIENTID:
		case -NFS4ERR_BADSESSION:
		case -NFS4ERR_BADSESSION:
		case -NFS4ERR_BADSLOT:
		case -NFS4ERR_BADSLOT:
		case -NFS4ERR_BAD_HIGH_SLOT:
		case -NFS4ERR_BAD_HIGH_SLOT:
		case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
		case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
		case -ETIMEDOUT:
			goto out_err;
			goto out_err;
		}
		}
		nfs4_put_open_state(state);
		nfs4_put_open_state(state);
@@ -1971,7 +1974,6 @@ static int nfs4_handle_reclaim_lease_error(struct nfs_client *clp, int status)
		return -EPERM;
		return -EPERM;
	case -EACCES:
	case -EACCES:
	case -NFS4ERR_DELAY:
	case -NFS4ERR_DELAY:
	case -ETIMEDOUT:
	case -EAGAIN:
	case -EAGAIN:
		ssleep(1);
		ssleep(1);
		break;
		break;
@@ -2600,7 +2602,7 @@ static void nfs4_state_manager(struct nfs_client *clp)
		}
		}


		/* Now recover expired state... */
		/* Now recover expired state... */
		if (test_and_clear_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state)) {
		if (test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state)) {
			section = "reclaim nograce";
			section = "reclaim nograce";
			status = nfs4_do_reclaim(clp,
			status = nfs4_do_reclaim(clp,
				clp->cl_mvops->nograce_recovery_ops);
				clp->cl_mvops->nograce_recovery_ops);
@@ -2608,6 +2610,7 @@ static void nfs4_state_manager(struct nfs_client *clp)
				continue;
				continue;
			if (status < 0)
			if (status < 0)
				goto out_error;
				goto out_error;
			clear_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state);
		}
		}


		nfs4_end_drain_session(clp);
		nfs4_end_drain_session(clp);