netfilter: ipt_CLUSTERIP: make clusterip_lock per net namespace
authorGao feng <gaofeng@cn.fujitsu.com>
Wed, 25 Sep 2013 07:38:46 +0000 (15:38 +0800)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 17 Oct 2013 08:48:07 +0000 (10:48 +0200)
this lock is used for protecting clusterip_configs of per
net namespace, it should be per net namespace too.

Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/ipv4/netfilter/ipt_CLUSTERIP.c

index 8ef3e6f38635f420a71152fb091f3c7b49a700a4..1bf5aa3096c168c1de59e69a404063ff623cde21 100644 (file)
@@ -58,9 +58,6 @@ struct clusterip_config {
        struct rcu_head rcu;
 };
 
-/* clusterip_lock protects the clusterip_configs list */
-static DEFINE_SPINLOCK(clusterip_lock);
-
 #ifdef CONFIG_PROC_FS
 static const struct file_operations clusterip_proc_fops;
 #endif
@@ -69,6 +66,9 @@ static int clusterip_net_id __read_mostly;
 
 struct clusterip_net {
        struct list_head configs;
+       /* lock protects the configs list */
+       spinlock_t lock;
+
 #ifdef CONFIG_PROC_FS
        struct proc_dir_entry *procdir;
 #endif
@@ -99,10 +99,12 @@ clusterip_config_put(struct clusterip_config *c)
 static inline void
 clusterip_config_entry_put(struct clusterip_config *c)
 {
+       struct clusterip_net *cn = net_generic(&init_net, clusterip_net_id);
+
        local_bh_disable();
-       if (atomic_dec_and_lock(&c->entries, &clusterip_lock)) {
+       if (atomic_dec_and_lock(&c->entries, &cn->lock)) {
                list_del_rcu(&c->list);
-               spin_unlock(&clusterip_lock);
+               spin_unlock(&cn->lock);
                local_bh_enable();
 
                dev_mc_del(c->dev, c->clustermac);
@@ -198,9 +200,9 @@ clusterip_config_init(const struct ipt_clusterip_tgt_info *i, __be32 ip,
        }
 #endif
 
-       spin_lock_bh(&clusterip_lock);
+       spin_lock_bh(&cn->lock);
        list_add_rcu(&c->list, &cn->configs);
-       spin_unlock_bh(&clusterip_lock);
+       spin_unlock_bh(&cn->lock);
 
        return c;
 }
@@ -713,6 +715,8 @@ static int clusterip_net_init(struct net *net)
 
        INIT_LIST_HEAD(&cn->configs);
 
+       spin_lock_init(&cn->lock);
+
 #ifdef CONFIG_PROC_FS
        cn->procdir = proc_mkdir("ipt_CLUSTERIP", net->proc_net);
        if (!cn->procdir) {