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.
Merge branch 'for-3.18' of git://linux-nfs.org/~bfields/linux
Pull nfsd updates from Bruce Fields: "Highlights: - support the NFSv4.2 SEEK operation (allowing clients to support SEEK_HOLE/SEEK_DATA), thanks to Anna. - end the grace period early in a number of cases, mitigating a long-standing annoyance, thanks to Jeff - improve SMP scalability, thanks to Trond" * 'for-3.18' of git://linux-nfs.org/~bfields/linux: (55 commits) nfsd: eliminate "to_delegation" define NFSD: Implement SEEK NFSD: Add generic v4.2 infrastructure svcrdma: advertise the correct max payload nfsd: introduce nfsd4_callback_ops nfsd: split nfsd4_callback initialization and use nfsd: introduce a generic nfsd4_cb nfsd: remove nfsd4_callback.cb_op nfsd: do not clear rpc_resp in nfsd4_cb_done_sequence nfsd: fix nfsd4_cb_recall_done error handling nfsd4: clarify how grace period ends nfsd4: stop grace_time update at end of grace period nfsd: skip subsequent UMH "create" operations after the first one for v4.0 clients nfsd: set and test NFSD4_CLIENT_STABLE bit to reduce nfsdcltrack upcalls nfsd: serialize nfsdcltrack upcalls for a particular client nfsd: pass extra info in env vars to upcalls to allow for early grace period end nfsd: add a v4_end_grace file to /proc/fs/nfsd lockd: add a /proc/fs/lockd/nlm_end_grace file nfsd: reject reclaim request when client has already sent RECLAIM_COMPLETE nfsd: remove redundant boot_time parm from grace_done client tracking op ...
- Loading branch information
Showing
35 changed files
with
942 additions
and
406 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
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
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 |
---|---|---|
|
@@ -3,5 +3,6 @@ | |
# | ||
|
||
obj-$(CONFIG_NFS_ACL_SUPPORT) += nfs_acl.o | ||
|
||
nfs_acl-objs := nfsacl.o | ||
|
||
obj-$(CONFIG_GRACE_PERIOD) += grace.o |
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 |
---|---|---|
@@ -1,17 +1,20 @@ | ||
/* | ||
* Common code for control of lockd and nfsv4 grace periods. | ||
* | ||
* Transplanted from lockd code | ||
*/ | ||
|
||
#include <linux/module.h> | ||
#include <linux/lockd/bind.h> | ||
#include <net/net_namespace.h> | ||
#include <net/netns/generic.h> | ||
#include <linux/fs.h> | ||
|
||
#include "netns.h" | ||
|
||
static int grace_net_id; | ||
static DEFINE_SPINLOCK(grace_lock); | ||
|
||
/** | ||
* locks_start_grace | ||
* @net: net namespace that this lock manager belongs to | ||
* @lm: who this grace period is for | ||
* | ||
* A grace period is a period during which locks should not be given | ||
|
@@ -21,18 +24,20 @@ static DEFINE_SPINLOCK(grace_lock); | |
* | ||
* This function is called to start a grace period. | ||
*/ | ||
void locks_start_grace(struct net *net, struct lock_manager *lm) | ||
void | ||
locks_start_grace(struct net *net, struct lock_manager *lm) | ||
{ | ||
struct lockd_net *ln = net_generic(net, lockd_net_id); | ||
struct list_head *grace_list = net_generic(net, grace_net_id); | ||
|
||
spin_lock(&grace_lock); | ||
list_add(&lm->list, &ln->grace_list); | ||
list_add(&lm->list, grace_list); | ||
spin_unlock(&grace_lock); | ||
} | ||
EXPORT_SYMBOL_GPL(locks_start_grace); | ||
|
||
/** | ||
* locks_end_grace | ||
* @net: net namespace that this lock manager belongs to | ||
* @lm: who this grace period is for | ||
* | ||
* Call this function to state that the given lock manager is ready to | ||
|
@@ -41,7 +46,8 @@ EXPORT_SYMBOL_GPL(locks_start_grace); | |
* Note that callers count on it being safe to call this more than once, | ||
* and the second call should be a no-op. | ||
*/ | ||
void locks_end_grace(struct lock_manager *lm) | ||
void | ||
locks_end_grace(struct lock_manager *lm) | ||
{ | ||
spin_lock(&grace_lock); | ||
list_del_init(&lm->list); | ||
|
@@ -56,10 +62,52 @@ EXPORT_SYMBOL_GPL(locks_end_grace); | |
* to answer ordinary lock requests, and when they should accept only | ||
* lock reclaims. | ||
*/ | ||
int locks_in_grace(struct net *net) | ||
int | ||
locks_in_grace(struct net *net) | ||
{ | ||
struct lockd_net *ln = net_generic(net, lockd_net_id); | ||
struct list_head *grace_list = net_generic(net, grace_net_id); | ||
|
||
return !list_empty(&ln->grace_list); | ||
return !list_empty(grace_list); | ||
} | ||
EXPORT_SYMBOL_GPL(locks_in_grace); | ||
|
||
static int __net_init | ||
grace_init_net(struct net *net) | ||
{ | ||
struct list_head *grace_list = net_generic(net, grace_net_id); | ||
|
||
INIT_LIST_HEAD(grace_list); | ||
return 0; | ||
} | ||
|
||
static void __net_exit | ||
grace_exit_net(struct net *net) | ||
{ | ||
struct list_head *grace_list = net_generic(net, grace_net_id); | ||
|
||
BUG_ON(!list_empty(grace_list)); | ||
} | ||
|
||
static struct pernet_operations grace_net_ops = { | ||
.init = grace_init_net, | ||
.exit = grace_exit_net, | ||
.id = &grace_net_id, | ||
.size = sizeof(struct list_head), | ||
}; | ||
|
||
static int __init | ||
init_grace(void) | ||
{ | ||
return register_pernet_subsys(&grace_net_ops); | ||
} | ||
|
||
static void __exit | ||
exit_grace(void) | ||
{ | ||
unregister_pernet_subsys(&grace_net_ops); | ||
} | ||
|
||
MODULE_AUTHOR("Jeff Layton <[email protected]>"); | ||
MODULE_LICENSE("GPL"); | ||
module_init(init_grace) | ||
module_exit(exit_grace) |
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
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
Oops, something went wrong.