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

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

nfsd41: use SEQ4_STATUS_BACKCHANNEL_FAULT when cb_sequence is invalid

parent 8b289b2c
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -39,6 +39,8 @@

#define NFSDDBG_FACILITY                NFSDDBG_PROC

static void nfsd4_mark_cb_fault(struct nfs4_client *, int reason);

#define NFSPROC4_CB_NULL 0
#define NFSPROC4_CB_COMPOUND 1

@@ -460,6 +462,8 @@ static int decode_cb_sequence4resok(struct xdr_stream *xdr,
	 */
	status = 0;
out:
	if (status)
		nfsd4_mark_cb_fault(cb->cb_clp, status);
	return status;
out_overflow:
	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);
}

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)
{
	struct nfs4_client *clp = container_of(calldata, struct nfs4_client, cl_cb_null);
+7 −1
Original line number Diff line number Diff line
@@ -1945,8 +1945,14 @@ out:

		nfsd4_get_session(cstate->session);
		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;
			break;
		case NFSD4_CB_FAULT:
			seq->status_flags |= SEQ4_STATUS_BACKCHANNEL_FAULT;
			break;
		}
	}
	kfree(conn);
	spin_unlock(&client_lock);
+1 −0
Original line number Diff line number Diff line
@@ -258,6 +258,7 @@ struct nfs4_client {
#define NFSD4_CB_UP		0
#define NFSD4_CB_UNKNOWN	1
#define NFSD4_CB_DOWN		2
#define NFSD4_CB_FAULT		3
	int			cl_cb_state;
	struct nfsd4_callback	cl_cb_null;
	struct nfsd4_session	*cl_cb_session;