nfsd41: use SEQ4_STATUS_BACKCHANNEL_FAULT when cb_sequence is invalid

Signed-off-by: Benny Halevy <bhalevy@panasas.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
Benny Halevy 2011-10-19 19:12:58 -07:00 committed by J. Bruce Fields
parent 8b289b2c23
commit 5423732a71
3 changed files with 18 additions and 1 deletions

View File

@ -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,
*/ */
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)
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);

View File

@ -1945,8 +1945,14 @@ out:
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);

View File

@ -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;