__u32   type; /* TBD to match kind */
        __u32   capab;  /* capabilities includes 4 bit version */
        struct module           *owner;
-       int     (*act)(struct sk_buff **, struct tc_action *, struct tcf_result *);
+       int     (*act)(struct sk_buff *, struct tc_action *, struct tcf_result *);
        int     (*get_stats)(struct sk_buff *, struct tc_action *);
        int     (*dump)(struct sk_buff *, struct tc_action *,int , int);
        int     (*cleanup)(struct tc_action *, int bind);
 
        while ((a = act) != NULL) {
 repeat:
                if (a->ops && a->ops->act) {
-                       ret = a->ops->act(&skb, a, res);
+                       ret = a->ops->act(skb, a, res);
                        if (TC_MUNGED & skb->tc_verd) {
                                /* copied already, allow trampling */
                                skb->tc_verd = SET_TC_OK2MUNGE(skb->tc_verd);
 
 }
 
 static int
-tcf_gact(struct sk_buff **pskb, struct tc_action *a, struct tcf_result *res)
+tcf_gact(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res)
 {
        struct tcf_gact *p = PRIV(a, gact);
-       struct sk_buff *skb = *pskb;
        int action = TC_ACT_SHOT;
 
        spin_lock(&p->lock);
 
 }
 
 static int
-tcf_ipt(struct sk_buff **pskb, struct tc_action *a, struct tcf_result *res)
+tcf_ipt(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res)
 {
        int ret = 0, result = 0;
        struct tcf_ipt *p = PRIV(a, ipt);
-       struct sk_buff *skb = *pskb;
 
        if (skb_cloned(skb)) {
                if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
         worry later - danger - this API seems to have changed
         from earlier kernels */
 
+       /* iptables targets take a double skb pointer in case the skb
+        * needs to be replaced. We don't own the skb, so this must not
+        * happen. The pskb_expand_head above should make sure of this */
        ret = p->t->u.kernel.target->target(&skb, skb->dev, NULL,
                                            p->hook, p->t->data, NULL);
        switch (ret) {
 
 }
 
 static int
-tcf_mirred(struct sk_buff **pskb, struct tc_action *a, struct tcf_result *res)
+tcf_mirred(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res)
 {
        struct tcf_mirred *p = PRIV(a, mirred);
        struct net_device *dev;
        struct sk_buff *skb2 = NULL;
-       struct sk_buff *skb = *pskb;
        u32 at = G_TC_AT(skb->tc_verd);
 
        spin_lock(&p->lock);
 
 }
 
 static int
-tcf_pedit(struct sk_buff **pskb, struct tc_action *a, struct tcf_result *res)
+tcf_pedit(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res)
 {
        struct tcf_pedit *p = PRIV(a, pedit);
-       struct sk_buff *skb = *pskb;
        int i, munged = 0;
        u8 *pptr;
 
 
        return 0;
 }
 
-static int tcf_act_police(struct sk_buff **pskb, struct tc_action *a,
+static int tcf_act_police(struct sk_buff *skb, struct tc_action *a,
                           struct tcf_result *res)
 {
        psched_time_t now;
-       struct sk_buff *skb = *pskb;
        struct tcf_police *p = PRIV(a);
        long toks;
        long ptoks = 0;
 
 #include <net/pkt_act.h>
 #include <net/act_generic.h>
 
-static int tcf_simp(struct sk_buff **pskb, struct tc_action *a, struct tcf_result *res)
+static int tcf_simp(struct sk_buff *skb, struct tc_action *a, struct tcf_result *res)
 {
-       struct sk_buff *skb = *pskb;
        struct tcf_defact *p = PRIV(a, defact);
 
        spin_lock(&p->lock);