shoud we add one line to the remove_expectations() as the following:
1.the one line as:
       ip_conntrack_put(ct);

2.the new remove_expectations() as:
static void remove_expectations(struct ip_conntrack *ct)
{
    struct list_head *exp_entry, *next;
    struct ip_conntrack_expect *exp;

    DEBUGP("remove_expectations(%p)\n", ct);

    for (exp_entry = ct->sibling_list.next;
         exp_entry != &ct->sibling_list; exp_entry = next) {
        next = exp_entry->next;
        exp = list_entry(exp_entry, struct ip_conntrack_expect,
                 expected_list);

        /* we skip established expectations, as we want to delete
         * the un-established ones only */
        if (exp->sibling) {
            DEBUGP("remove_expectations: skipping established %p of %p\n", exp->sibling, ct);
            /* Indicate that this expectations parent is dead */
            exp->expectant = NULL;

        /* here we let the use -1,otherwise some day the child connection die, he'll fail to put his parent's ct use,
         * so I'm afraid that this ct cache will hang forever!!!*/
            ip_conntrack_put(ct); ;-)

            continue;
        }

        IP_NF_ASSERT(list_inlist(&ip_conntrack_expect_list, exp));
        IP_NF_ASSERT(exp->expectant == ct);

        /* delete expectation from global and private lists */
        unexpect_related(exp);
    }
}