void *data_hard_start;
 };
 
-/* compute the linear packet data range [data, data_end) which
- * will be accessed by cls_bpf, act_bpf and lwt programs
+/* Compute the linear packet data range [data, data_end) which
+ * will be accessed by various program types (cls_bpf, act_bpf,
+ * lwt, ...). Subsystems allowing direct data access must (!)
+ * ensure that cb[] area can be written to when BPF program is
+ * invoked (otherwise cb[] save/restore is necessary).
  */
-static inline void bpf_compute_data_end(struct sk_buff *skb)
+static inline void bpf_compute_data_pointers(struct sk_buff *skb)
 {
        struct bpf_skb_data_end *cb = (struct bpf_skb_data_end *)skb->cb;
 
 
 
        skb_orphan(skb);
        skb->sk = psock->sock;
-       bpf_compute_data_end(skb);
+       bpf_compute_data_pointers(skb);
        rc = (*prog->bpf_func)(skb, prog->insnsi);
        skb->sk = NULL;
 
         * any socket yet.
         */
        skb->sk = psock->sock;
-       bpf_compute_data_end(skb);
+       bpf_compute_data_pointers(skb);
        rc = (*prog->bpf_func)(skb, prog->insnsi);
        skb->sk = NULL;
        rcu_read_unlock();
 
        if (is_l2)
                __skb_push(skb, ETH_HLEN);
        if (is_direct_pkt_access)
-               bpf_compute_data_end(skb);
+               bpf_compute_data_pointers(skb);
        retval = bpf_test_run(prog, skb, repeat, &duration);
        if (!is_l2)
                __skb_push(skb, ETH_HLEN);
 
 {
        int err = __bpf_try_make_writable(skb, write_len);
 
-       bpf_compute_data_end(skb);
+       bpf_compute_data_pointers(skb);
        return err;
 }
 
        ret = skb_vlan_push(skb, vlan_proto, vlan_tci);
        bpf_pull_mac_rcsum(skb);
 
-       bpf_compute_data_end(skb);
+       bpf_compute_data_pointers(skb);
        return ret;
 }
 
        ret = skb_vlan_pop(skb);
        bpf_pull_mac_rcsum(skb);
 
-       bpf_compute_data_end(skb);
+       bpf_compute_data_pointers(skb);
        return ret;
 }
 
         * need to be verified first.
         */
        ret = bpf_skb_proto_xlat(skb, proto);
-       bpf_compute_data_end(skb);
+       bpf_compute_data_pointers(skb);
        return ret;
 }
 
        ret = shrink ? bpf_skb_net_shrink(skb, len_diff_abs) :
                       bpf_skb_net_grow(skb, len_diff_abs);
 
-       bpf_compute_data_end(skb);
+       bpf_compute_data_pointers(skb);
        return ret;
 }
 
                        skb_gso_reset(skb);
        }
 
-       bpf_compute_data_end(skb);
+       bpf_compute_data_pointers(skb);
        return ret;
 }
 
                skb_reset_mac_header(skb);
        }
 
-       bpf_compute_data_end(skb);
+       bpf_compute_data_pointers(skb);
        return 0;
 }
 
 
         */
        preempt_disable();
        rcu_read_lock();
-       bpf_compute_data_end(skb);
+       bpf_compute_data_pointers(skb);
        ret = bpf_prog_run_save_cb(lwt->prog, skb);
        rcu_read_unlock();
 
 
        filter = rcu_dereference(prog->filter);
        if (at_ingress) {
                __skb_push(skb, skb->mac_len);
-               bpf_compute_data_end(skb);
+               bpf_compute_data_pointers(skb);
                filter_res = BPF_PROG_RUN(filter, skb);
                __skb_pull(skb, skb->mac_len);
        } else {
-               bpf_compute_data_end(skb);
+               bpf_compute_data_pointers(skb);
                filter_res = BPF_PROG_RUN(filter, skb);
        }
        rcu_read_unlock();
 
                } else if (at_ingress) {
                        /* It is safe to push/pull even if skb_shared() */
                        __skb_push(skb, skb->mac_len);
-                       bpf_compute_data_end(skb);
+                       bpf_compute_data_pointers(skb);
                        filter_res = BPF_PROG_RUN(prog->filter, skb);
                        __skb_pull(skb, skb->mac_len);
                } else {
-                       bpf_compute_data_end(skb);
+                       bpf_compute_data_pointers(skb);
                        filter_res = BPF_PROG_RUN(prog->filter, skb);
                }