The "kill" client entry in debugfs can be used to kill client tasks. Writing "0" causes only the currently pending tasks to be killed, while writing "1" all currently pending, and any future pending tasks to be killed. Signed-off-by: Joshua Watt <JPEWhacker@xxxxxxxxx> --- net/sunrpc/debugfs.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/net/sunrpc/debugfs.c b/net/sunrpc/debugfs.c index e980d2a493de..a2f33d168873 100644 --- a/net/sunrpc/debugfs.c +++ b/net/sunrpc/debugfs.c @@ -118,6 +118,50 @@ static const struct file_operations tasks_fops = { .release = tasks_release, }; +static int +kill_set(void *data, u64 val) +{ + struct rpc_clnt *clnt = data; + + rpc_killall_tasks(clnt, (int)val); + return 0; +} + +static int +kill_open(struct inode *inode, struct file *filp) +{ + int ret = simple_attr_open(inode, filp, NULL, kill_set, "%i"); + + if (!ret) { + struct rpc_clnt *clnt = inode->i_private; + + if (!atomic_inc_not_zero(&clnt->cl_count)) { + simple_attr_release(inode, filp); + ret = -EINVAL; + } + } + + return ret; +} + +static int +kill_release(struct inode *inode, struct file *filp) +{ + struct rpc_clnt *clnt = inode->i_private; + + rpc_release_client(clnt); + + return simple_attr_release(inode, filp); +} + +static const struct file_operations kill_fops = { + .owner = THIS_MODULE, + .open = kill_open, + .release = kill_release, + .write = debugfs_attr_write, + .llseek = no_llseek, +}; + void rpc_clnt_debugfs_register(struct rpc_clnt *clnt) { @@ -160,6 +204,10 @@ rpc_clnt_debugfs_register(struct rpc_clnt *clnt) if (!debugfs_create_symlink("xprt", clnt->cl_debugfs, name)) goto out_err; + if (!debugfs_create_file("kill", S_IFREG | 0200, clnt->cl_debugfs, + clnt, &kill_fops)) + goto out_err; + return; out_err: debugfs_remove_recursive(clnt->cl_debugfs); -- 2.13.6 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html