NFSv4.1: Add DESTROY_CLIENTID

Ensure that we destroy our lease on last unmount

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Trond Myklebust
2012-05-25 17:18:09 -04:00
parent 2cf047c994
commit 6624553910
5 changed files with 114 additions and 0 deletions

View File

@@ -5261,6 +5261,65 @@ out:
return status;
}
static int _nfs4_proc_destroy_clientid(struct nfs_client *clp,
struct rpc_cred *cred)
{
struct rpc_message msg = {
.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_CLIENTID],
.rpc_argp = clp,
.rpc_cred = cred,
};
int status;
status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
if (status)
pr_warn("NFS: Got error %d from the server %s on "
"DESTROY_CLIENTID.", status, clp->cl_hostname);
return status;
}
static int nfs4_proc_destroy_clientid(struct nfs_client *clp,
struct rpc_cred *cred)
{
unsigned int loop;
int ret;
for (loop = NFS4_MAX_LOOP_ON_RECOVER; loop != 0; loop--) {
ret = _nfs4_proc_destroy_clientid(clp, cred);
switch (ret) {
case -NFS4ERR_DELAY:
case -NFS4ERR_CLIENTID_BUSY:
ssleep(1);
break;
default:
return ret;
}
}
return 0;
}
int nfs4_destroy_clientid(struct nfs_client *clp)
{
struct rpc_cred *cred;
int ret = 0;
if (clp->cl_mvops->minor_version < 1)
goto out;
if (clp->cl_exchange_flags == 0)
goto out;
cred = nfs4_get_exchange_id_cred(clp);
ret = nfs4_proc_destroy_clientid(clp, cred);
if (cred)
put_rpccred(cred);
switch (ret) {
case 0:
case -NFS4ERR_STALE_CLIENTID:
clp->cl_exchange_flags = 0;
}
out:
return ret;
}
struct nfs4_get_lease_time_data {
struct nfs4_get_lease_time_args *args;
struct nfs4_get_lease_time_res *res;