LockD: manage grace list per network namespace
authorStanislav Kinsbursky <skinsbursky@parallels.com>
Wed, 25 Jul 2012 12:57:13 +0000 (16:57 +0400)
committerJ. Bruce Fields <bfields@redhat.com>
Fri, 27 Jul 2012 20:49:22 +0000 (16:49 -0400)
Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/lockd/grace.c
fs/lockd/netns.h
fs/lockd/svc.c

index 183cc1f..8dbaff7 100644 (file)
@@ -4,8 +4,10 @@
 
 #include <linux/module.h>
 #include <linux/lockd/bind.h>
+#include <net/net_namespace.h>
+
+#include "netns.h"
 
-static LIST_HEAD(grace_list);
 static DEFINE_SPINLOCK(grace_lock);
 
 /**
@@ -21,8 +23,11 @@ static DEFINE_SPINLOCK(grace_lock);
  */
 void locks_start_grace(struct lock_manager *lm)
 {
+       struct net *net = &init_net;
+       struct lockd_net *ln = net_generic(net, lockd_net_id);
+
        spin_lock(&grace_lock);
-       list_add(&lm->list, &grace_list);
+       list_add(&lm->list, &ln->grace_list);
        spin_unlock(&grace_lock);
 }
 EXPORT_SYMBOL_GPL(locks_start_grace);
@@ -54,6 +59,9 @@ EXPORT_SYMBOL_GPL(locks_end_grace);
  */
 int locks_in_grace(void)
 {
-       return !list_empty(&grace_list);
+       struct net *net = &init_net;
+       struct lockd_net *ln = net_generic(net, lockd_net_id);
+
+       return !list_empty(&ln->grace_list);
 }
 EXPORT_SYMBOL_GPL(locks_in_grace);
index e78650c..4eee248 100644 (file)
@@ -11,6 +11,7 @@ struct lockd_net {
 
        struct delayed_work grace_period_end;
        struct lock_manager lockd_manager;
+       struct list_head grace_list;
 };
 
 extern int lockd_net_id;
index a9c436b..834dfe2 100644 (file)
@@ -596,6 +596,7 @@ static int lockd_init_net(struct net *net)
        struct lockd_net *ln = net_generic(net, lockd_net_id);
 
        INIT_DELAYED_WORK(&ln->grace_period_end, grace_ender);
+       INIT_LIST_HEAD(&ln->grace_list);
        return 0;
 }