Commit 5423732a authored by Benny Halevy's avatar Benny Halevy Committed by J. Bruce Fields

nfsd41: use SEQ4_STATUS_BACKCHANNEL_FAULT when cb_sequence is invalid

Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 8b289b2c
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
#define NFSDDBG_FACILITY NFSDDBG_PROC #define NFSDDBG_FACILITY NFSDDBG_PROC
static void nfsd4_mark_cb_fault(struct nfs4_client *, int reason);
#define NFSPROC4_CB_NULL 0 #define NFSPROC4_CB_NULL 0
#define NFSPROC4_CB_COMPOUND 1 #define NFSPROC4_CB_COMPOUND 1
...@@ -460,6 +462,8 @@ static int decode_cb_sequence4resok(struct xdr_stream *xdr, ...@@ -460,6 +462,8 @@ static int decode_cb_sequence4resok(struct xdr_stream *xdr,
*/ */
status = 0; status = 0;
out: out:
if (status)
nfsd4_mark_cb_fault(cb->cb_clp, status);
return status; return status;
out_overflow: out_overflow:
print_overflow_msg(__func__, xdr); print_overflow_msg(__func__, xdr);
...@@ -686,6 +690,12 @@ static void nfsd4_mark_cb_down(struct nfs4_client *clp, int reason) ...@@ -686,6 +690,12 @@ static void nfsd4_mark_cb_down(struct nfs4_client *clp, int reason)
warn_no_callback_path(clp, reason); warn_no_callback_path(clp, reason);
} }
static void nfsd4_mark_cb_fault(struct nfs4_client *clp, int reason)
{
clp->cl_cb_state = NFSD4_CB_FAULT;
warn_no_callback_path(clp, reason);
}
static void nfsd4_cb_probe_done(struct rpc_task *task, void *calldata) static void nfsd4_cb_probe_done(struct rpc_task *task, void *calldata)
{ {
struct nfs4_client *clp = container_of(calldata, struct nfs4_client, cl_cb_null); struct nfs4_client *clp = container_of(calldata, struct nfs4_client, cl_cb_null);
......
...@@ -1945,8 +1945,14 @@ nfsd4_sequence(struct svc_rqst *rqstp, ...@@ -1945,8 +1945,14 @@ nfsd4_sequence(struct svc_rqst *rqstp,
nfsd4_get_session(cstate->session); nfsd4_get_session(cstate->session);
atomic_inc(&clp->cl_refcount); atomic_inc(&clp->cl_refcount);
if (clp->cl_cb_state == NFSD4_CB_DOWN) switch (clp->cl_cb_state) {
case NFSD4_CB_DOWN:
seq->status_flags |= SEQ4_STATUS_CB_PATH_DOWN; seq->status_flags |= SEQ4_STATUS_CB_PATH_DOWN;
break;
case NFSD4_CB_FAULT:
seq->status_flags |= SEQ4_STATUS_BACKCHANNEL_FAULT;
break;
}
} }
kfree(conn); kfree(conn);
spin_unlock(&client_lock); spin_unlock(&client_lock);
......
...@@ -258,6 +258,7 @@ struct nfs4_client { ...@@ -258,6 +258,7 @@ struct nfs4_client {
#define NFSD4_CB_UP 0 #define NFSD4_CB_UP 0
#define NFSD4_CB_UNKNOWN 1 #define NFSD4_CB_UNKNOWN 1
#define NFSD4_CB_DOWN 2 #define NFSD4_CB_DOWN 2
#define NFSD4_CB_FAULT 3
int cl_cb_state; int cl_cb_state;
struct nfsd4_callback cl_cb_null; struct nfsd4_callback cl_cb_null;
struct nfsd4_session *cl_cb_session; struct nfsd4_session *cl_cb_session;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment