Commit 49daee21 authored by Harald Welte's avatar Harald Welte Committed by David S. Miller

[NETFILTER]: Avoid nesting readlocks in conntrack code.

parent c6e56994
...@@ -17,7 +17,7 @@ extern void ip_conntrack_cleanup(void); ...@@ -17,7 +17,7 @@ extern void ip_conntrack_cleanup(void);
struct ip_conntrack_protocol; struct ip_conntrack_protocol;
extern struct ip_conntrack_protocol *ip_ct_find_proto(u_int8_t protocol); extern struct ip_conntrack_protocol *ip_ct_find_proto(u_int8_t protocol);
/* Like above, but you already have conntrack read lock. */ /* Like above, but you already have conntrack read lock. */
extern struct ip_conntrack_protocol *__find_proto(u_int8_t protocol); extern struct ip_conntrack_protocol *__ip_ct_find_proto(u_int8_t protocol);
extern struct list_head protocol_list; extern struct list_head protocol_list;
/* Returns conntrack if it dealt with ICMP, and filled in skb->nfct */ /* Returns conntrack if it dealt with ICMP, and filled in skb->nfct */
......
...@@ -75,7 +75,7 @@ static inline int proto_cmpfn(const struct ip_conntrack_protocol *curr, ...@@ -75,7 +75,7 @@ static inline int proto_cmpfn(const struct ip_conntrack_protocol *curr,
return protocol == curr->proto; return protocol == curr->proto;
} }
struct ip_conntrack_protocol *__find_proto(u_int8_t protocol) struct ip_conntrack_protocol *__ip_ct_find_proto(u_int8_t protocol)
{ {
struct ip_conntrack_protocol *p; struct ip_conntrack_protocol *p;
...@@ -93,7 +93,7 @@ struct ip_conntrack_protocol *ip_ct_find_proto(u_int8_t protocol) ...@@ -93,7 +93,7 @@ struct ip_conntrack_protocol *ip_ct_find_proto(u_int8_t protocol)
struct ip_conntrack_protocol *p; struct ip_conntrack_protocol *p;
READ_LOCK(&ip_conntrack_lock); READ_LOCK(&ip_conntrack_lock);
p = __find_proto(protocol); p = __ip_ct_find_proto(protocol);
READ_UNLOCK(&ip_conntrack_lock); READ_UNLOCK(&ip_conntrack_lock);
return p; return p;
} }
......
...@@ -71,7 +71,7 @@ print_expect(char *buffer, const struct ip_conntrack_expect *expect) ...@@ -71,7 +71,7 @@ print_expect(char *buffer, const struct ip_conntrack_expect *expect)
len += sprintf(buffer + len, "use=%u proto=%u ", len += sprintf(buffer + len, "use=%u proto=%u ",
atomic_read(&expect->use), expect->tuple.dst.protonum); atomic_read(&expect->use), expect->tuple.dst.protonum);
len += print_tuple(buffer + len, &expect->tuple, len += print_tuple(buffer + len, &expect->tuple,
__find_proto(expect->tuple.dst.protonum)); __ip_ct_find_proto(expect->tuple.dst.protonum));
len += sprintf(buffer + len, "\n"); len += sprintf(buffer + len, "\n");
return len; return len;
} }
...@@ -81,7 +81,7 @@ print_conntrack(char *buffer, const struct ip_conntrack *conntrack) ...@@ -81,7 +81,7 @@ print_conntrack(char *buffer, const struct ip_conntrack *conntrack)
{ {
unsigned int len; unsigned int len;
struct ip_conntrack_protocol *proto struct ip_conntrack_protocol *proto
= __find_proto(conntrack->tuplehash[IP_CT_DIR_ORIGINAL] = __ip_ct_find_proto(conntrack->tuplehash[IP_CT_DIR_ORIGINAL]
.tuple.dst.protonum); .tuple.dst.protonum);
len = sprintf(buffer, "%-8s %u %lu ", len = sprintf(buffer, "%-8s %u %lu ",
...@@ -361,6 +361,7 @@ EXPORT_SYMBOL(ip_conntrack_helper_unregister); ...@@ -361,6 +361,7 @@ EXPORT_SYMBOL(ip_conntrack_helper_unregister);
EXPORT_SYMBOL(ip_ct_selective_cleanup); EXPORT_SYMBOL(ip_ct_selective_cleanup);
EXPORT_SYMBOL(ip_ct_refresh); EXPORT_SYMBOL(ip_ct_refresh);
EXPORT_SYMBOL(ip_ct_find_proto); EXPORT_SYMBOL(ip_ct_find_proto);
EXPORT_SYMBOL(__ip_ct_find_proto);
EXPORT_SYMBOL(ip_ct_find_helper); EXPORT_SYMBOL(ip_ct_find_helper);
EXPORT_SYMBOL(ip_conntrack_expect_related); EXPORT_SYMBOL(ip_conntrack_expect_related);
EXPORT_SYMBOL(ip_conntrack_change_expect); EXPORT_SYMBOL(ip_conntrack_change_expect);
......
...@@ -740,7 +740,7 @@ static inline int exp_for_packet(struct ip_conntrack_expect *exp, ...@@ -740,7 +740,7 @@ static inline int exp_for_packet(struct ip_conntrack_expect *exp,
int ret = 1; int ret = 1;
MUST_BE_READ_LOCKED(&ip_conntrack_lock); MUST_BE_READ_LOCKED(&ip_conntrack_lock);
proto = ip_ct_find_proto((*pskb)->nh.iph->protocol); proto = __ip_ct_find_proto((*pskb)->nh.iph->protocol);
if (proto->exp_matches_pkt) if (proto->exp_matches_pkt)
ret = proto->exp_matches_pkt(exp, pskb); ret = proto->exp_matches_pkt(exp, pskb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment