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

Commit cb73a9f4 authored by J. Bruce Fields's avatar J. Bruce Fields
Browse files

nfsd4: implement backchannel_ctl operation



This operation is mandatory for servers to implement.

Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent c6bb3ca2
Loading
Loading
Loading
Loading
+1 −6
Original line number Diff line number Diff line
@@ -39,11 +39,6 @@ interoperability problems with future clients. Known issues:
	  from a linux client are possible, but we aren't really
	  conformant with the spec (for example, we don't use kerberos
	  on the backchannel correctly).
	- Incomplete backchannel support: incomplete backchannel gss
	  support and no support for BACKCHANNEL_CTL mean that
	  callbacks (hence delegations and layouts) may not be
	  available and clients confused by the incomplete
	  implementation may fail.
	- We do not support SSV, which provides security for shared
	  client-server state (thus preventing unauthorized tampering
	  with locks and opens, for example).  It is mandatory for
@@ -89,7 +84,7 @@ Operations
   |                      | MNI        | or OPT)      |                |
   +----------------------+------------+--------------+----------------+
   | ACCESS               | REQ        |              | Section 18.1   |
NS | BACKCHANNEL_CTL      | REQ        |              | Section 18.33  |
I  | BACKCHANNEL_CTL      | REQ        |              | Section 18.33  |
I  | BIND_CONN_TO_SESSION | REQ        |              | Section 18.34  |
   | CLOSE                | REQ        |              | Section 18.2   |
   | COMMIT               | REQ        |              | Section 18.3   |
+6 −0
Original line number Diff line number Diff line
@@ -1666,6 +1666,12 @@ static struct nfsd4_operation nfsd4_ops[] = {
		.op_name = "OP_EXCHANGE_ID",
		.op_rsize_bop = (nfsd4op_rsize)nfsd4_exchange_id_rsize,
	},
	[OP_BACKCHANNEL_CTL] = {
		.op_func = (nfsd4op_func)nfsd4_backchannel_ctl,
		.op_flags = ALLOWED_WITHOUT_FH | OP_MODIFIES_SOMETHING,
		.op_name = "OP_BACKCHANNEL_CTL",
		.op_rsize_bop = (nfsd4op_rsize)nfsd4_only_status_rsize,
	},
	[OP_BIND_CONN_TO_SESSION] = {
		.op_func = (nfsd4op_func)nfsd4_bind_conn_to_session,
		.op_flags = ALLOWED_WITHOUT_FH | ALLOWED_AS_FIRST_OP
+14 −0
Original line number Diff line number Diff line
@@ -1865,6 +1865,20 @@ static __be32 nfsd4_map_bcts_dir(u32 *dir)
	return nfserr_inval;
}

__be32 nfsd4_backchannel_ctl(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, struct nfsd4_backchannel_ctl *bc)
{
	struct nfsd4_session *session = cstate->session;

	spin_lock(&client_lock);
	session->se_cb_prog = bc->bc_cb_program;
	session->se_cb_sec = bc->bc_cb_sec;
	spin_unlock(&client_lock);

	nfsd4_probe_callback(session->se_client);

	return nfs_ok;
}

__be32 nfsd4_bind_conn_to_session(struct svc_rqst *rqstp,
		     struct nfsd4_compound_state *cstate,
		     struct nfsd4_bind_conn_to_session *bcts)
+12 −1
Original line number Diff line number Diff line
@@ -483,6 +483,17 @@ static __be32 nfsd4_decode_cb_sec(struct nfsd4_compoundargs *argp, struct nfsd4_
	DECODE_TAIL;
}

static __be32 nfsd4_decode_backchannel_ctl(struct nfsd4_compoundargs *argp, struct nfsd4_backchannel_ctl *bc)
{
	DECODE_HEAD;

	READ_BUF(4);
	READ32(bc->bc_cb_program);
	nfsd4_decode_cb_sec(argp, &bc->bc_cb_sec);

	DECODE_TAIL;
}

static __be32 nfsd4_decode_bind_conn_to_session(struct nfsd4_compoundargs *argp, struct nfsd4_bind_conn_to_session *bcts)
{
	DECODE_HEAD;
@@ -1536,7 +1547,7 @@ static nfsd4_dec nfsd41_dec_ops[] = {
	[OP_RELEASE_LOCKOWNER]	= (nfsd4_dec)nfsd4_decode_notsupp,

	/* new operations for NFSv4.1 */
	[OP_BACKCHANNEL_CTL]	= (nfsd4_dec)nfsd4_decode_notsupp,
	[OP_BACKCHANNEL_CTL]	= (nfsd4_dec)nfsd4_decode_backchannel_ctl,
	[OP_BIND_CONN_TO_SESSION]= (nfsd4_dec)nfsd4_decode_bind_conn_to_session,
	[OP_EXCHANGE_ID]	= (nfsd4_dec)nfsd4_decode_exchange_id,
	[OP_CREATE_SESSION]	= (nfsd4_dec)nfsd4_decode_create_session,
+5 −0
Original line number Diff line number Diff line
@@ -166,6 +166,11 @@ struct nfsd4_create_session {
	struct nfsd4_cb_sec		cb_sec;
};

struct nfsd4_backchannel_ctl {
	u32	bc_cb_program;
	struct nfsd4_cb_sec		bc_cb_sec;
};

struct nfsd4_bind_conn_to_session {
	struct nfs4_sessionid		sessionid;
	u32				dir;
Loading