|
12 | 12 | #include <linux/string.h> |
13 | 13 | #include <linux/nfs_fs.h> |
14 | 14 | #include <linux/rcupdate.h> |
| 15 | +#include <linux/lockd/lockd.h> |
15 | 16 |
|
16 | 17 | #include "nfs4_fs.h" |
17 | 18 | #include "netns.h" |
@@ -216,6 +217,50 @@ void nfs_netns_sysfs_destroy(struct nfs_net *netns) |
216 | 217 | } |
217 | 218 | } |
218 | 219 |
|
| 220 | +static ssize_t |
| 221 | +shutdown_show(struct kobject *kobj, struct kobj_attribute *attr, |
| 222 | + char *buf) |
| 223 | +{ |
| 224 | + struct nfs_server *server = container_of(kobj, struct nfs_server, kobj); |
| 225 | + bool shutdown = server->flags & NFS_MOUNT_SHUTDOWN; |
| 226 | + return sysfs_emit(buf, "%d\n", shutdown); |
| 227 | +} |
| 228 | + |
| 229 | +static ssize_t |
| 230 | +shutdown_store(struct kobject *kobj, struct kobj_attribute *attr, |
| 231 | + const char *buf, size_t count) |
| 232 | +{ |
| 233 | + struct nfs_server *server; |
| 234 | + int ret, val; |
| 235 | + |
| 236 | + server = container_of(kobj, struct nfs_server, kobj); |
| 237 | + |
| 238 | + ret = kstrtoint(buf, 0, &val); |
| 239 | + if (ret) |
| 240 | + return ret; |
| 241 | + |
| 242 | + if (val != 1) |
| 243 | + return -EINVAL; |
| 244 | + |
| 245 | + /* already shut down? */ |
| 246 | + if (server->flags & NFS_MOUNT_SHUTDOWN) |
| 247 | + goto out; |
| 248 | + |
| 249 | + server->flags |= NFS_MOUNT_SHUTDOWN; |
| 250 | + server->client->cl_shutdown = 1; |
| 251 | + server->nfs_client->cl_rpcclient->cl_shutdown = 1; |
| 252 | + |
| 253 | + if (!IS_ERR(server->client_acl)) |
| 254 | + server->client_acl->cl_shutdown = 1; |
| 255 | + |
| 256 | + if (server->nlm_host) |
| 257 | + server->nlm_host->h_rpcclnt->cl_shutdown = 1; |
| 258 | +out: |
| 259 | + return count; |
| 260 | +} |
| 261 | + |
| 262 | +static struct kobj_attribute nfs_sysfs_attr_shutdown = __ATTR_RW(shutdown); |
| 263 | + |
219 | 264 | #define RPC_CLIENT_NAME_SIZE 64 |
220 | 265 |
|
221 | 266 | void nfs_sysfs_link_rpc_client(struct nfs_server *server, |
@@ -259,9 +304,16 @@ void nfs_sysfs_add_server(struct nfs_server *server) |
259 | 304 |
|
260 | 305 | ret = kobject_init_and_add(&server->kobj, &nfs_sb_ktype, |
261 | 306 | &nfs_kset->kobj, "server-%d", server->s_sysfs_id); |
262 | | - if (ret < 0) |
| 307 | + if (ret < 0) { |
263 | 308 | pr_warn("NFS: nfs sysfs add server-%d failed (%d)\n", |
264 | 309 | server->s_sysfs_id, ret); |
| 310 | + return; |
| 311 | + } |
| 312 | + ret = sysfs_create_file_ns(&server->kobj, &nfs_sysfs_attr_shutdown.attr, |
| 313 | + nfs_netns_server_namespace(&server->kobj)); |
| 314 | + if (ret < 0) |
| 315 | + pr_warn("NFS: sysfs_create_file_ns for server-%d failed (%d)\n", |
| 316 | + server->s_sysfs_id, ret); |
265 | 317 | } |
266 | 318 | EXPORT_SYMBOL_GPL(nfs_sysfs_add_server); |
267 | 319 |
|
|
0 commit comments