summaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorBenjamin Coddington <bcodding@redhat.com>2023-06-15 20:07:31 +0200
committerTrond Myklebust <trond.myklebust@hammerspace.com>2023-06-19 21:08:46 +0200
commit7d3e26a054c88477b26adda3542d66271a943968 (patch)
tree2c7ee52084037e41b88b5f1807d4016af799391c /fs/nfs
parentNFS: add sysfs shutdown knob (diff)
downloadlinux-7d3e26a054c88477b26adda3542d66271a943968.tar.xz
linux-7d3e26a054c88477b26adda3542d66271a943968.zip
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: Benjamin Coddington <bcodding@redhat.com> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/sysfs.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/fs/nfs/sysfs.c b/fs/nfs/sysfs.c
index 1fedbaff10e9..acda8f033d30 100644
--- a/fs/nfs/sysfs.c
+++ b/fs/nfs/sysfs.c
@@ -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;
}