Commit 7d3e26a0 authored by Benjamin Coddington's avatar Benjamin Coddington Committed by Trond Myklebust
Browse files

NFS: Cancel all existing RPC tasks when shutdown



Walk existing RPC tasks and cancel them with -EIO when the client is
shutdown.

Signed-off-by: default avatarBenjamin Coddington <bcodding@redhat.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent d9615d16
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -217,6 +217,17 @@ void nfs_netns_sysfs_destroy(struct nfs_net *netns)
	}
}

static bool shutdown_match_client(const struct rpc_task *task, const void *data)
{
	return true;
}

static void shutdown_client(struct rpc_clnt *clnt)
{
	clnt->cl_shutdown = 1;
	rpc_cancel_tasks(clnt, -EIO, shutdown_match_client, NULL);
}

static ssize_t
shutdown_show(struct kobject *kobj, struct kobj_attribute *attr,
				char *buf)
@@ -247,14 +258,14 @@ shutdown_store(struct kobject *kobj, struct kobj_attribute *attr,
		goto out;

	server->flags |= NFS_MOUNT_SHUTDOWN;
	server->client->cl_shutdown = 1;
	server->nfs_client->cl_rpcclient->cl_shutdown = 1;
	shutdown_client(server->client);
	shutdown_client(server->nfs_client->cl_rpcclient);

	if (!IS_ERR(server->client_acl))
		server->client_acl->cl_shutdown = 1;
		shutdown_client(server->client_acl);

	if (server->nlm_host)
		server->nlm_host->h_rpcclnt->cl_shutdown = 1;
		shutdown_client(server->nlm_host->h_rpcclnt);
out:
	return count;
}