send DESTROY_CLIENTID on unmount

This commit is contained in:
Olga Kornievskaia 2011-03-21 14:13:08 -04:00 committed by unknown
parent 5e5d1d21d5
commit 8d171e71a0
4 changed files with 69 additions and 1 deletions

View file

@ -209,6 +209,7 @@ void nfs41_client_free(
{ {
dprintf(2, "nfs41_client_free(%llu)\n", client->clnt_id); dprintf(2, "nfs41_client_free(%llu)\n", client->clnt_id);
if (client->session) nfs41_session_free(client->session); if (client->session) nfs41_session_free(client->session);
nfs41_destroy_clientid(client->rpc, client->clnt_id);
if (client->server) nfs41_server_deref(client->server); if (client->server) nfs41_server_deref(client->server);
nfs41_rpc_clnt_free(client->rpc); nfs41_rpc_clnt_free(client->rpc);
if (client->layouts) pnfs_layout_list_free(client->layouts); if (client->layouts) pnfs_layout_list_free(client->layouts);

View file

@ -231,6 +231,31 @@ out:
return status; return status;
} }
int nfs41_destroy_clientid(
IN nfs41_rpc_clnt *rpc,
IN uint64_t clientid)
{
int status;
nfs41_compound compound;
nfs_argop4 argops;
nfs_resop4 resops;
nfs41_destroy_clientid_args dc_args;
nfs41_destroy_clientid_res dc_res;
compound_init(&compound, &argops, &resops, "destroy_clientid");
compound_add_op(&compound, OP_DESTROY_CLIENTID, &dc_args, &dc_res);
status = nfs41_send_compound(rpc, (char *)&compound.args,
(char *)&compound.res);
if (status)
goto out;
compound_error(status = compound.res.status);
out:
return status;
}
enum nfsstat4 nfs41_reclaim_complete( enum nfsstat4 nfs41_reclaim_complete(
IN nfs41_session *session) IN nfs41_session *session)
{ {

View file

@ -197,6 +197,17 @@ typedef struct __nfs41_destroy_session_res {
} nfs41_destroy_session_res; } nfs41_destroy_session_res;
/* OP_DESTROY_CLIENTID */
typedef struct __nfs41_destroy_clientid_args {
uint64_t dca_clientid;
} nfs41_destroy_clientid_args;
typedef struct __nfs41_destroy_clientid_res {
uint32_t dcr_status;
} nfs41_destroy_clientid_res;
/* OP_SEQUENCE */ /* OP_SEQUENCE */
typedef struct __nfs41_sequence_args { typedef struct __nfs41_sequence_args {
unsigned char *sa_sessionid; unsigned char *sa_sessionid;
@ -898,6 +909,10 @@ enum nfsstat4 nfs41_bind_conn_to_session(
int nfs41_destroy_session( int nfs41_destroy_session(
IN nfs41_session *session); IN nfs41_session *session);
int nfs41_destroy_clientid(
IN nfs41_rpc_clnt *rpc,
IN uint64_t clientid);
int nfs41_send_sequence( int nfs41_send_sequence(
IN nfs41_session *session); IN nfs41_session *session);

View file

@ -888,6 +888,33 @@ static bool_t decode_op_destroy_session(
return xdr_u_int32_t(xdr, &res->dsr_status); return xdr_u_int32_t(xdr, &res->dsr_status);
} }
/*
* OP_DESTROY_CLIENTID
*/
static bool_t encode_op_destroy_clientid(
XDR *xdr,
nfs_argop4 *argop)
{
nfs41_destroy_clientid_args *args = (nfs41_destroy_clientid_args*)argop->arg;
if (unexpected_op(argop->op, OP_DESTROY_CLIENTID))
return FALSE;
return xdr_u_hyper(xdr, &args->dca_clientid);
}
static bool_t decode_op_destroy_clientid(
XDR *xdr,
nfs_resop4 *resop)
{
nfs41_destroy_clientid_res *res = (nfs41_destroy_clientid_res*)resop->res;
if (unexpected_op(resop->op, OP_DESTROY_CLIENTID))
return FALSE;
return xdr_u_int32_t(xdr, &res->dcr_status);
}
/* /*
* OP_SEQUENCE * OP_SEQUENCE
@ -3171,7 +3198,7 @@ static const op_table_entry g_op_table[] = {
{ NULL, NULL }, /* OP_SET_SSV = 54 */ { NULL, NULL }, /* OP_SET_SSV = 54 */
{ NULL, NULL }, /* OP_TEST_STATEID = 55 */ { NULL, NULL }, /* OP_TEST_STATEID = 55 */
{ NULL, NULL }, /* OP_WANT_DELEGATION = 56 */ { NULL, NULL }, /* OP_WANT_DELEGATION = 56 */
{ NULL, NULL }, /* OP_DESTROY_CLIENTID = 57 */ { encode_op_destroy_clientid, decode_op_destroy_clientid }, /* OP_DESTROY_CLIENTID = 57 */
{ encode_op_reclaim_complete, decode_op_reclaim_complete }, /* OP_RECLAIM_COMPLETE = 58 */ { encode_op_reclaim_complete, decode_op_reclaim_complete }, /* OP_RECLAIM_COMPLETE = 58 */
}; };
static const uint32_t g_op_table_size = ARRAYSIZE(g_op_table); static const uint32_t g_op_table_size = ARRAYSIZE(g_op_table);