aboutsummaryrefslogtreecommitdiff
path: root/net/netfilter/nf_log.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/netfilter/nf_log.c')
-rw-r--r--net/netfilter/nf_log.c63
1 files changed, 32 insertions, 31 deletions
diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c
index 8901b3a07f7..91b220cf5a1 100644
--- a/net/netfilter/nf_log.c
+++ b/net/netfilter/nf_log.c
@@ -14,62 +14,63 @@
#define NF_LOG_PREFIXLEN 128
-static struct nf_logger *nf_logging[NPROTO]; /* = NULL */
-static DEFINE_SPINLOCK(nf_log_lock);
+static struct nf_logger *nf_loggers[NPROTO];
+static DEFINE_MUTEX(nf_log_mutex);
/* return EBUSY if somebody else is registered, EEXIST if the same logger
* is registred, 0 on success. */
int nf_log_register(int pf, struct nf_logger *logger)
{
- int ret = -EBUSY;
+ int ret;
if (pf >= NPROTO)
return -EINVAL;
/* Any setup of logging members must be done before
* substituting pointer. */
- spin_lock(&nf_log_lock);
- if (!nf_logging[pf]) {
- rcu_assign_pointer(nf_logging[pf], logger);
- ret = 0;
- } else if (nf_logging[pf] == logger)
+ ret = mutex_lock_interruptible(&nf_log_mutex);
+ if (ret < 0)
+ return ret;
+
+ if (!nf_loggers[pf])
+ rcu_assign_pointer(nf_loggers[pf], logger);
+ else if (nf_loggers[pf] == logger)
ret = -EEXIST;
+ else
+ ret = -EBUSY;
- spin_unlock(&nf_log_lock);
+ mutex_unlock(&nf_log_mutex);
return ret;
-}
+}
EXPORT_SYMBOL(nf_log_register);
-int nf_log_unregister_pf(int pf)
+void nf_log_unregister_pf(int pf)
{
if (pf >= NPROTO)
- return -EINVAL;
-
- spin_lock(&nf_log_lock);
- nf_logging[pf] = NULL;
- spin_unlock(&nf_log_lock);
+ return;
+ mutex_lock(&nf_log_mutex);
+ rcu_assign_pointer(nf_loggers[pf], NULL);
+ mutex_unlock(&nf_log_mutex);
/* Give time to concurrent readers. */
- synchronize_net();
-
- return 0;
+ synchronize_rcu();
}
EXPORT_SYMBOL(nf_log_unregister_pf);
-void nf_log_unregister_logger(struct nf_logger *logger)
+void nf_log_unregister(struct nf_logger *logger)
{
int i;
- spin_lock(&nf_log_lock);
+ mutex_lock(&nf_log_mutex);
for (i = 0; i < NPROTO; i++) {
- if (nf_logging[i] == logger)
- nf_logging[i] = NULL;
+ if (nf_loggers[i] == logger)
+ rcu_assign_pointer(nf_loggers[i], NULL);
}
- spin_unlock(&nf_log_lock);
+ mutex_unlock(&nf_log_mutex);
- synchronize_net();
+ synchronize_rcu();
}
-EXPORT_SYMBOL(nf_log_unregister_logger);
+EXPORT_SYMBOL(nf_log_unregister);
void nf_log_packet(int pf,
unsigned int hooknum,
@@ -82,9 +83,9 @@ void nf_log_packet(int pf,
va_list args;
char prefix[NF_LOG_PREFIXLEN];
struct nf_logger *logger;
-
+
rcu_read_lock();
- logger = rcu_dereference(nf_logging[pf]);
+ logger = rcu_dereference(nf_loggers[pf]);
if (logger) {
va_start(args, fmt);
vsnprintf(prefix, sizeof(prefix), fmt, args);
@@ -131,11 +132,11 @@ static int seq_show(struct seq_file *s, void *v)
loff_t *pos = v;
const struct nf_logger *logger;
- logger = rcu_dereference(nf_logging[*pos]);
+ logger = rcu_dereference(nf_loggers[*pos]);
if (!logger)
return seq_printf(s, "%2lld NONE\n", *pos);
-
+
return seq_printf(s, "%2lld %s\n", *pos, logger->name);
}
@@ -151,7 +152,7 @@ static int nflog_open(struct inode *inode, struct file *file)
return seq_open(file, &nflog_seq_ops);
}
-static struct file_operations nflog_file_ops = {
+static const struct file_operations nflog_file_ops = {
.owner = THIS_MODULE,
.open = nflog_open,
.read = seq_read,