diff options
author | Patrick McHardy <kaber@trash.net> | 2007-02-12 14:11:39 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-02-12 14:11:39 -0500 |
commit | 9b73534dc57fa2fd5ef567586adb83c16e88a52f (patch) | |
tree | 7ebf77f9dc34f06acfac126ce496442a5735625e | |
parent | 9dc6aa5fcfc104becd86c89c5e7ec90e840e0163 (diff) |
[NETFILTER]: nf_log: switch logger registration/unregistration 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>
-rw-r--r-- | net/netfilter/nf_log.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c index 814bab700db6..243d66b1c02c 100644 --- a/net/netfilter/nf_log.c +++ b/net/netfilter/nf_log.c | |||
@@ -15,27 +15,31 @@ | |||
15 | #define NF_LOG_PREFIXLEN 128 | 15 | #define NF_LOG_PREFIXLEN 128 |
16 | 16 | ||
17 | static struct nf_logger *nf_logging[NPROTO]; /* = NULL */ | 17 | static struct nf_logger *nf_logging[NPROTO]; /* = NULL */ |
18 | static DEFINE_SPINLOCK(nf_log_lock); | 18 | static DEFINE_MUTEX(nf_log_mutex); |
19 | 19 | ||
20 | /* return EBUSY if somebody else is registered, EEXIST if the same logger | 20 | /* return EBUSY if somebody else is registered, EEXIST if the same logger |
21 | * is registred, 0 on success. */ | 21 | * is registred, 0 on success. */ |
22 | int nf_log_register(int pf, struct nf_logger *logger) | 22 | int nf_log_register(int pf, struct nf_logger *logger) |
23 | { | 23 | { |
24 | int ret = -EBUSY; | 24 | int ret; |
25 | 25 | ||
26 | if (pf >= NPROTO) | 26 | if (pf >= NPROTO) |
27 | return -EINVAL; | 27 | return -EINVAL; |
28 | 28 | ||
29 | /* Any setup of logging members must be done before | 29 | /* Any setup of logging members must be done before |
30 | * substituting pointer. */ | 30 | * substituting pointer. */ |
31 | spin_lock(&nf_log_lock); | 31 | ret = mutex_lock_interruptible(&nf_log_mutex); |
32 | if (!nf_logging[pf]) { | 32 | if (ret < 0) |
33 | return ret; | ||
34 | |||
35 | if (!nf_logging[pf]) | ||
33 | rcu_assign_pointer(nf_logging[pf], logger); | 36 | rcu_assign_pointer(nf_logging[pf], logger); |
34 | ret = 0; | 37 | else if (nf_logging[pf] == logger) |
35 | } else if (nf_logging[pf] == logger) | ||
36 | ret = -EEXIST; | 38 | ret = -EEXIST; |
39 | else | ||
40 | ret = -EBUSY; | ||
37 | 41 | ||
38 | spin_unlock(&nf_log_lock); | 42 | mutex_unlock(&nf_log_mutex); |
39 | return ret; | 43 | return ret; |
40 | } | 44 | } |
41 | EXPORT_SYMBOL(nf_log_register); | 45 | EXPORT_SYMBOL(nf_log_register); |
@@ -44,9 +48,9 @@ void nf_log_unregister_pf(int pf) | |||
44 | { | 48 | { |
45 | if (pf >= NPROTO) | 49 | if (pf >= NPROTO) |
46 | return; | 50 | return; |
47 | spin_lock(&nf_log_lock); | 51 | mutex_lock(&nf_log_mutex); |
48 | rcu_assign_pointer(nf_logging[pf], NULL); | 52 | rcu_assign_pointer(nf_logging[pf], NULL); |
49 | spin_unlock(&nf_log_lock); | 53 | mutex_unlock(&nf_log_mutex); |
50 | 54 | ||
51 | /* Give time to concurrent readers. */ | 55 | /* Give time to concurrent readers. */ |
52 | synchronize_rcu(); | 56 | synchronize_rcu(); |
@@ -57,12 +61,12 @@ void nf_log_unregister_logger(struct nf_logger *logger) | |||
57 | { | 61 | { |
58 | int i; | 62 | int i; |
59 | 63 | ||
60 | spin_lock(&nf_log_lock); | 64 | mutex_lock(&nf_log_mutex); |
61 | for (i = 0; i < NPROTO; i++) { | 65 | for (i = 0; i < NPROTO; i++) { |
62 | if (nf_logging[i] == logger) | 66 | if (nf_logging[i] == logger) |
63 | rcu_assign_pointer(nf_logging[i], NULL); | 67 | rcu_assign_pointer(nf_logging[i], NULL); |
64 | } | 68 | } |
65 | spin_unlock(&nf_log_lock); | 69 | mutex_unlock(&nf_log_mutex); |
66 | 70 | ||
67 | synchronize_rcu(); | 71 | synchronize_rcu(); |
68 | } | 72 | } |