|
@@ -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 <jlayton@primarydata.com>");
|
|
|
+MODULE_LICENSE("GPL");
|
|
|
+module_init(init_grace)
|
|
|
+module_exit(exit_grace)
|