return fwd;
 }
 
-extern int ip_vs_make_skb_writable(struct sk_buff **pskb, int len);
 extern void ip_vs_nat_icmp(struct sk_buff *skb, struct ip_vs_protocol *pp,
                struct ip_vs_conn *cp, int dir);
 
 
 #include <linux/skbuff.h>
 #include <linux/in.h>
 #include <linux/ip.h>
+#include <linux/netfilter.h>
 #include <net/net_namespace.h>
 #include <net/protocol.h>
 #include <net/tcp.h>
        struct tcphdr *th;
        __u32 seq;
 
-       if (!ip_vs_make_skb_writable(pskb, tcp_offset + sizeof(*th)))
+       if (!skb_make_writable(*pskb, tcp_offset + sizeof(*th)))
                return 0;
 
        th = (struct tcphdr *)(skb_network_header(*pskb) + tcp_offset);
        struct tcphdr *th;
        __u32 seq;
 
-       if (!ip_vs_make_skb_writable(pskb, tcp_offset + sizeof(*th)))
+       if (!skb_make_writable(*pskb, tcp_offset + sizeof(*th)))
                return 0;
 
        th = (struct tcphdr *)(skb_network_header(*pskb) + tcp_offset);
 
 #ifdef CONFIG_IP_VS_DEBUG
 EXPORT_SYMBOL(ip_vs_get_debug_level);
 #endif
-EXPORT_SYMBOL(ip_vs_make_skb_writable);
 
 
 /* ID used in ICMP lookups */
 }
 
 
-int ip_vs_make_skb_writable(struct sk_buff **pskb, int writable_len)
-{
-       struct sk_buff *skb = *pskb;
-
-       /* skb is already used, better copy skb and its payload */
-       if (unlikely(skb_shared(skb) || skb->sk))
-               goto copy_skb;
-
-       /* skb data is already used, copy it */
-       if (unlikely(skb_cloned(skb)))
-               goto copy_data;
-
-       return pskb_may_pull(skb, writable_len);
-
-  copy_data:
-       if (unlikely(writable_len > skb->len))
-               return 0;
-       return !pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
-
-  copy_skb:
-       if (unlikely(writable_len > skb->len))
-               return 0;
-       skb = skb_copy(skb, GFP_ATOMIC);
-       if (!skb)
-               return 0;
-       BUG_ON(skb_is_nonlinear(skb));
-
-       /* Rest of kernel will get very unhappy if we pass it a
-          suddenly-orphaned skbuff */
-       if ((*pskb)->sk)
-               skb_set_owner_w(skb, (*pskb)->sk);
-       kfree_skb(*pskb);
-       *pskb = skb;
-       return 1;
-}
-
 /*
  *  IPVS persistent scheduling function
  *  It creates a connection entry according to its template if exists,
 
        if (IPPROTO_TCP == cih->protocol || IPPROTO_UDP == cih->protocol)
                offset += 2 * sizeof(__u16);
-       if (!ip_vs_make_skb_writable(pskb, offset))
+       if (!skb_make_writable(skb, offset))
                goto out;
-       skb = *pskb;
 
        ip_vs_nat_icmp(skb, pp, cp, 1);
 
 
        IP_VS_DBG_PKT(11, pp, skb, 0, "Outgoing packet");
 
-       if (!ip_vs_make_skb_writable(pskb, ihl))
+       if (!skb_make_writable(skb, ihl))
                goto drop;
 
        /* mangle the packet */
 
 #include <linux/skbuff.h>
 #include <linux/in.h>
 #include <linux/ip.h>
+#include <linux/netfilter.h>
 #include <net/protocol.h>
 #include <net/tcp.h>
 #include <asm/unaligned.h>
                return 1;
 
        /* Linear packets are much easier to deal with. */
-       if (!ip_vs_make_skb_writable(pskb, (*pskb)->len))
+       if (!skb_make_writable(*pskb, (*pskb)->len))
                return 0;
 
        if (cp->app_data == &ip_vs_ftp_pasv) {
                return 1;
 
        /* Linear packets are much easier to deal with. */
-       if (!ip_vs_make_skb_writable(pskb, (*pskb)->len))
+       if (!skb_make_writable(*pskb, (*pskb)->len))
                return 0;
 
        /*
 
 #include <linux/tcp.h>                  /* for tcphdr */
 #include <net/ip.h>
 #include <net/tcp.h>                    /* for csum_tcpudp_magic */
+#include <linux/netfilter.h>
 #include <linux/netfilter_ipv4.h>
 
 #include <net/ip_vs.h>
        const unsigned int tcphoff = ip_hdrlen(*pskb);
 
        /* csum_check requires unshared skb */
-       if (!ip_vs_make_skb_writable(pskb, tcphoff+sizeof(*tcph)))
+       if (!skb_make_writable(*pskb, tcphoff+sizeof(*tcph)))
                return 0;
 
        if (unlikely(cp->app != NULL)) {
        const unsigned int tcphoff = ip_hdrlen(*pskb);
 
        /* csum_check requires unshared skb */
-       if (!ip_vs_make_skb_writable(pskb, tcphoff+sizeof(*tcph)))
+       if (!skb_make_writable(*pskb, tcphoff+sizeof(*tcph)))
                return 0;
 
        if (unlikely(cp->app != NULL)) {
 
 #include <linux/in.h>
 #include <linux/ip.h>
 #include <linux/kernel.h>
+#include <linux/netfilter.h>
 #include <linux/netfilter_ipv4.h>
 #include <linux/udp.h>
 
        const unsigned int udphoff = ip_hdrlen(*pskb);
 
        /* csum_check requires unshared skb */
-       if (!ip_vs_make_skb_writable(pskb, udphoff+sizeof(*udph)))
+       if (!skb_make_writable(*pskb, udphoff+sizeof(*udph)))
                return 0;
 
        if (unlikely(cp->app != NULL)) {
        unsigned int udphoff = ip_hdrlen(*pskb);
 
        /* csum_check requires unshared skb */
-       if (!ip_vs_make_skb_writable(pskb, udphoff+sizeof(*udph)))
+       if (!skb_make_writable(*pskb, udphoff+sizeof(*udph)))
                return 0;
 
        if (unlikely(cp->app != NULL)) {
 
        }
 
        /* copy-on-write the packet before mangling it */
-       if (!ip_vs_make_skb_writable(&skb, sizeof(struct iphdr)))
+       if (!skb_make_writable(skb, sizeof(struct iphdr)))
                goto tx_error_put;
 
        if (skb_cow(skb, rt->u.dst.dev->hard_header_len))
        }
 
        /* copy-on-write the packet before mangling it */
-       if (!ip_vs_make_skb_writable(&skb, offset))
+       if (!skb_make_writable(skb, offset))
                goto tx_error_put;
 
        if (skb_cow(skb, rt->u.dst.dev->hard_header_len))