From 44523c7e5b190b1a26c18391f1a2a02ffdcedb54 Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Mon, 12 Feb 2007 11:10:14 -0800 Subject: [PATCH] --- yaml --- r: 48099 b: refs/heads/master c: fd706d6957b3c66ae70b4bbdb9e13993213697f7 h: refs/heads/master i: 48097: 95062dbfe6f41b8265cf6bf7ddf095adc8540301 48095: b6d9fdcbf4403682209add00912a88c6316efc92 v: v3 --- [refs] | 2 +- trunk/net/netfilter/core.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index c0baedd7e0c1..df0f4283023d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d486dd1fb8573fad5b8dab61a7d1406116fd4baf +refs/heads/master: fd706d6957b3c66ae70b4bbdb9e13993213697f7 diff --git a/trunk/net/netfilter/core.c b/trunk/net/netfilter/core.c index 716603f05c02..f61e0c2eece9 100644 --- a/trunk/net/netfilter/core.c +++ b/trunk/net/netfilter/core.c @@ -61,28 +61,31 @@ EXPORT_SYMBOL_GPL(nf_unregister_afinfo); * packets come back: if the hook is gone, the packet is discarded. */ struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS] __read_mostly; EXPORT_SYMBOL(nf_hooks); -static DEFINE_SPINLOCK(nf_hook_lock); +static DEFINE_MUTEX(nf_hook_mutex); int nf_register_hook(struct nf_hook_ops *reg) { struct list_head *i; + int err; - spin_lock_bh(&nf_hook_lock); + err = mutex_lock_interruptible(&nf_hook_mutex); + if (err < 0) + return err; list_for_each(i, &nf_hooks[reg->pf][reg->hooknum]) { if (reg->priority < ((struct nf_hook_ops *)i)->priority) break; } list_add_rcu(®->list, i->prev); - spin_unlock_bh(&nf_hook_lock); + mutex_unlock(&nf_hook_mutex); return 0; } EXPORT_SYMBOL(nf_register_hook); void nf_unregister_hook(struct nf_hook_ops *reg) { - spin_lock_bh(&nf_hook_lock); + mutex_lock(&nf_hook_mutex); list_del_rcu(®->list); - spin_unlock_bh(&nf_hook_lock); + mutex_unlock(&nf_hook_mutex); synchronize_net(); }