diff options
author | Patrick McHardy <kaber@trash.net> | 2007-02-12 11:09:55 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-02-12 11:09:55 -0800 |
commit | d486dd1fb8573fad5b8dab61a7d1406116fd4baf (patch) | |
tree | f9cbb12e031beb6d0038846b731a62c0b85804d7 /net | |
parent | e4ba13088de7fa384087af398df6629fadb363ba (diff) |
[NETFILTER]: Switch nf_register_afinfo/nf_unregister_afinfo to mutex
The spinlock is only used in process context (register/unregister),
switch to a mutex.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/netfilter/core.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/net/netfilter/core.c b/net/netfilter/core.c index a66bd6af44fa..716603f05c02 100644 --- a/net/netfilter/core.c +++ b/net/netfilter/core.c @@ -22,29 +22,34 @@ #include <linux/netdevice.h> #include <linux/inetdevice.h> #include <linux/proc_fs.h> +#include <linux/mutex.h> #include <net/sock.h> #include "nf_internals.h" -static DEFINE_SPINLOCK(afinfo_lock); +static DEFINE_MUTEX(afinfo_mutex); struct nf_afinfo *nf_afinfo[NPROTO] __read_mostly; EXPORT_SYMBOL(nf_afinfo); int nf_register_afinfo(struct nf_afinfo *afinfo) { - spin_lock(&afinfo_lock); + int err; + + err = mutex_lock_interruptible(&afinfo_mutex); + if (err < 0) + return err; rcu_assign_pointer(nf_afinfo[afinfo->family], afinfo); - spin_unlock(&afinfo_lock); + mutex_unlock(&afinfo_mutex); return 0; } EXPORT_SYMBOL_GPL(nf_register_afinfo); void nf_unregister_afinfo(struct nf_afinfo *afinfo) { - spin_lock(&afinfo_lock); + mutex_lock(&afinfo_mutex); rcu_assign_pointer(nf_afinfo[afinfo->family], NULL); - spin_unlock(&afinfo_lock); + mutex_unlock(&afinfo_mutex); synchronize_rcu(); } EXPORT_SYMBOL_GPL(nf_unregister_afinfo); |