I can't understand why ip_irc_lock and ip_amanda_lock are required. Both are used to protect private data in the expectation between the conntrack-helper and the nat-helper. The conntrack-helper holds the lock while setting the data and calling ip_conntrack_expect_related, the nat-helper holds the lock while reading the data. But since - ip_conntrack_expect_related write-locks ip_conntrack_lock - the nat-helpers are called under read-locked ip_conntrack lock - the expectations private data can't change once it's registered it seems to be unnceccessary. Even worse, consider the following sequence CPU1: conntrack-helper:help: lock(private_lock) ip_conntrack_expect_related: write_lock(ip_conntrack_lock) CPU2: nat-core:do_bindings: read_lock(ip_conntrack_lock) nat-helper:help: lock(private_lock) which will cause deadlock. In case i'm not misguided by the late hour, attached is a patch which: - removes the locks from amanda- and irc-helper - fixes the ftp-helper to only use the lock to protect the per-connection data - rename various ct_xxx_info variables to exp_xxx_info so it becomes clear it's expectation-data. The patch is untested and only meant for review. One problem remains, ip_nat_standalone dereferences ct->master->expectant without holding ip_conntrack_lock before calling a nat helpers expect function. The ftp helpers expect-function also dereferences ct->master->expectant without the lock. ip_conntrack_lock probably needs to be grabbed somewhere in ip_nat_standalone. Regards, Patrick