diff options
author | Patrick McHardy <kaber@trash.net> | 2008-01-31 07:37:36 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-31 22:27:52 -0500 |
commit | c52fbb410b2662a7bbc5cbe5969d73c733151498 (patch) | |
tree | d449d642b8004a10fa811ad1d0e2af2225788025 | |
parent | 58a3c9bb0c69f8517c2243cd0912b3f87b4f868c (diff) |
[NETFILTER]: nf_conntrack_core: avoid taking nf_conntrack_lock in nf_conntrack_alter_reply
The conntrack is unconfirmed, so we have an exclusive reference, which
means that the write_lock is definitely unneeded. A read_lock used to
be needed for the helper lookup, but since we're using RCU for helpers
now rcu_read_lock is enough.
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/netfilter/nf_conntrack_core.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index aa042c489685..10256079e634 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -729,7 +729,6 @@ void nf_conntrack_alter_reply(struct nf_conn *ct, | |||
729 | struct nf_conn_help *help = nfct_help(ct); | 729 | struct nf_conn_help *help = nfct_help(ct); |
730 | struct nf_conntrack_helper *helper; | 730 | struct nf_conntrack_helper *helper; |
731 | 731 | ||
732 | write_lock_bh(&nf_conntrack_lock); | ||
733 | /* Should be unconfirmed, so not in hash table yet */ | 732 | /* Should be unconfirmed, so not in hash table yet */ |
734 | NF_CT_ASSERT(!nf_ct_is_confirmed(ct)); | 733 | NF_CT_ASSERT(!nf_ct_is_confirmed(ct)); |
735 | 734 | ||
@@ -738,8 +737,9 @@ void nf_conntrack_alter_reply(struct nf_conn *ct, | |||
738 | 737 | ||
739 | ct->tuplehash[IP_CT_DIR_REPLY].tuple = *newreply; | 738 | ct->tuplehash[IP_CT_DIR_REPLY].tuple = *newreply; |
740 | if (ct->master || (help && help->expecting != 0)) | 739 | if (ct->master || (help && help->expecting != 0)) |
741 | goto out; | 740 | return; |
742 | 741 | ||
742 | rcu_read_lock(); | ||
743 | helper = __nf_ct_helper_find(newreply); | 743 | helper = __nf_ct_helper_find(newreply); |
744 | if (helper == NULL) { | 744 | if (helper == NULL) { |
745 | if (help) | 745 | if (help) |
@@ -757,7 +757,7 @@ void nf_conntrack_alter_reply(struct nf_conn *ct, | |||
757 | 757 | ||
758 | rcu_assign_pointer(help->helper, helper); | 758 | rcu_assign_pointer(help->helper, helper); |
759 | out: | 759 | out: |
760 | write_unlock_bh(&nf_conntrack_lock); | 760 | rcu_read_unlock(); |
761 | } | 761 | } |
762 | EXPORT_SYMBOL_GPL(nf_conntrack_alter_reply); | 762 | EXPORT_SYMBOL_GPL(nf_conntrack_alter_reply); |
763 | 763 | ||