forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
lockd: add a /proc/fs/lockd/nlm_end_grace file
Add a new procfile that will allow a (privileged) userland process to end the NLM grace period early. The basic idea here will be to have sm-notify write to this file, if it sent out no NOTIFY requests when it runs. In that situation, we can generally expect that there will be no reclaim requests so the grace period can be lifted early. Signed-off-by: Jeff Layton <[email protected]>
- Loading branch information
Jeff Layton
authored and
J. Bruce Fields
committed
Sep 17, 2014
1 parent
3b3e7b7
commit d68e3c4
Showing
4 changed files
with
130 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
/* | ||
* Procfs support for lockd | ||
* | ||
* Copyright (c) 2014 Jeff Layton <[email protected]> | ||
*/ | ||
|
||
#include <linux/fs.h> | ||
#include <linux/proc_fs.h> | ||
#include <linux/module.h> | ||
#include <linux/nsproxy.h> | ||
#include <net/net_namespace.h> | ||
|
||
#include "netns.h" | ||
#include "procfs.h" | ||
|
||
/* | ||
* We only allow strings that start with 'Y', 'y', or '1'. | ||
*/ | ||
static ssize_t | ||
nlm_end_grace_write(struct file *file, const char __user *buf, size_t size, | ||
loff_t *pos) | ||
{ | ||
char *data; | ||
struct lockd_net *ln = net_generic(current->nsproxy->net_ns, | ||
lockd_net_id); | ||
|
||
if (size < 1) | ||
return -EINVAL; | ||
|
||
data = simple_transaction_get(file, buf, size); | ||
if (IS_ERR(data)) | ||
return PTR_ERR(data); | ||
|
||
switch(data[0]) { | ||
case 'Y': | ||
case 'y': | ||
case '1': | ||
locks_end_grace(&ln->lockd_manager); | ||
break; | ||
default: | ||
return -EINVAL; | ||
} | ||
|
||
return size; | ||
} | ||
|
||
static ssize_t | ||
nlm_end_grace_read(struct file *file, char __user *buf, size_t size, | ||
loff_t *pos) | ||
{ | ||
struct lockd_net *ln = net_generic(current->nsproxy->net_ns, | ||
lockd_net_id); | ||
char resp[3]; | ||
|
||
resp[0] = list_empty(&ln->lockd_manager.list) ? 'Y' : 'N'; | ||
resp[1] = '\n'; | ||
resp[2] = '\0'; | ||
|
||
return simple_read_from_buffer(buf, size, pos, resp, sizeof(resp)); | ||
} | ||
|
||
static const struct file_operations lockd_end_grace_operations = { | ||
.write = nlm_end_grace_write, | ||
.read = nlm_end_grace_read, | ||
.llseek = default_llseek, | ||
.release = simple_transaction_release, | ||
.owner = THIS_MODULE, | ||
}; | ||
|
||
int __init | ||
lockd_create_procfs(void) | ||
{ | ||
struct proc_dir_entry *entry; | ||
|
||
entry = proc_mkdir("fs/lockd", NULL); | ||
if (!entry) | ||
return -ENOMEM; | ||
entry = proc_create("nlm_end_grace", S_IRUGO|S_IWUSR, entry, | ||
&lockd_end_grace_operations); | ||
if (!entry) { | ||
remove_proc_entry("fs/lockd", NULL); | ||
return -ENOMEM; | ||
} | ||
return 0; | ||
} | ||
|
||
void __exit | ||
lockd_remove_procfs(void) | ||
{ | ||
remove_proc_entry("fs/lockd/nlm_end_grace", NULL); | ||
remove_proc_entry("fs/lockd", NULL); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
/* | ||
* Procfs support for lockd | ||
* | ||
* Copyright (c) 2014 Jeff Layton <[email protected]> | ||
*/ | ||
#ifndef _LOCKD_PROCFS_H | ||
#define _LOCKD_PROCFS_H | ||
|
||
#include <linux/kconfig.h> | ||
|
||
#if IS_ENABLED(CONFIG_PROC_FS) | ||
int lockd_create_procfs(void); | ||
void lockd_remove_procfs(void); | ||
#else | ||
static inline int | ||
lockd_create_procfs(void) | ||
{ | ||
return 0; | ||
} | ||
|
||
static inline void | ||
lockd_remove_procfs(void) | ||
{ | ||
return; | ||
} | ||
#endif /* IS_ENABLED(CONFIG_PROC_FS) */ | ||
|
||
#endif /* _LOCKD_PROCFS_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters