netfilter: ctnetlink: fix scheduling while atomic
authorPatrick McHardy <kaber@trash.net>
Wed, 21 Jan 2009 20:19:49 +0000 (12:19 -0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 21 Jan 2009 20:19:49 +0000 (12:19 -0800)
Caused by call to request_module() while holding nf_conntrack_lock.

Reported-and-tested-by: Kövesdi György <kgy@teledigit.hu>
Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/netfilter/nf_conntrack_netlink.c

index 3dddec6d2f7ed05ed4de8a1a38c0b2ce572cdb9c..c32a7e8e3a1b0e18a358aa45e3624754346de436 100644 (file)
@@ -831,13 +831,16 @@ ctnetlink_parse_nat_setup(struct nf_conn *ct,
        if (!parse_nat_setup) {
 #ifdef CONFIG_MODULES
                rcu_read_unlock();
+               spin_unlock_bh(&nf_conntrack_lock);
                nfnl_unlock();
                if (request_module("nf-nat-ipv4") < 0) {
                        nfnl_lock();
+                       spin_lock_bh(&nf_conntrack_lock);
                        rcu_read_lock();
                        return -EOPNOTSUPP;
                }
                nfnl_lock();
+               spin_lock_bh(&nf_conntrack_lock);
                rcu_read_lock();
                if (nfnetlink_parse_nat_setup_hook)
                        return -EAGAIN;