aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xt_FULLCONENAT.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/xt_FULLCONENAT.c b/xt_FULLCONENAT.c
index cf34cc2..98e24e2 100644
--- a/xt_FULLCONENAT.c
+++ b/xt_FULLCONENAT.c
@@ -226,9 +226,11 @@ static int check_mapping(struct nat_mapping* mapping, struct net *net, const str
kfree(original_tuple_item);
(mapping->refer_count)--;
} else {
+ atomic_set(&mapping_check_busy, 1);
ct = nf_ct_tuplehash_to_ctrack(tuple_hash);
if (ct != NULL)
nf_ct_put(ct);
+ atomic_set(&mapping_check_busy, 0);
}
}
@@ -255,6 +257,8 @@ static int ct_event_cb(unsigned int events, struct nf_ct_event *item) {
struct list_head *iter, *tmp;
struct nat_mapping_original_tuple *original_tuple_item;
+ unsigned long irq_flags;
+
ct = item->ct;
/* we handle only conntrack destroy events */
if (ct == NULL || !(events & (1 << IPCT_DESTROY))) {
@@ -277,8 +281,16 @@ static int ct_event_cb(unsigned int events, struct nf_ct_event *item) {
return 0;
}
+ local_irq_save(irq_flags);
+ local_irq_disable();
+ preempt_disable();
+
if (!spin_trylock(&fullconenat_lock)) {
pr_debug("xt_FULLCONENAT: ct_event_cb(): [==================================WARNING================================] spin lock busy, handler skipped.\n");
+
+ local_irq_restore(irq_flags);
+ preempt_enable();
+
return -EAGAIN;
}
@@ -324,6 +336,9 @@ static int ct_event_cb(unsigned int events, struct nf_ct_event *item) {
out:
spin_unlock(&fullconenat_lock);
+ local_irq_restore(irq_flags);
+ preempt_enable();
+
return 0;
}