#include <linux/ipv6.h>
 #include <linux/hardirq.h>
 #include <linux/jhash.h>
+#include <linux/refcount.h>
 #include <net/if_inet6.h>
 #include <net/ndisc.h>
 #include <net/flow.h>
  */
 
 struct ipv6_txoptions {
-       atomic_t                refcnt;
+       refcount_t              refcnt;
        /* Length of this structure */
        int                     tot_len;
 
        rcu_read_lock();
        opt = rcu_dereference(np->opt);
        if (opt) {
-               if (!atomic_inc_not_zero(&opt->refcnt))
+               if (!refcount_inc_not_zero(&opt->refcnt))
                        opt = NULL;
                else
                        opt = rcu_pointer_handoff(opt);
 
 static inline void txopt_put(struct ipv6_txoptions *opt)
 {
-       if (opt && atomic_dec_and_test(&opt->refcnt))
+       if (opt && refcount_dec_and_test(&opt->refcnt))
                kfree_rcu(opt, rcu);
 }
 
 
                        *((char **)&opt2->dst1opt) += dif;
                if (opt2->srcrt)
                        *((char **)&opt2->srcrt) += dif;
-               atomic_set(&opt2->refcnt, 1);
+               refcount_set(&opt2->refcnt, 1);
        }
        return opt2;
 }
                return ERR_PTR(-ENOBUFS);
 
        memset(opt2, 0, tot_len);
-       atomic_set(&opt2->refcnt, 1);
+       refcount_set(&opt2->refcnt, 1);
        opt2->tot_len = tot_len;
        p = (char *)(opt2 + 1);
 
 
                        break;
 
                memset(opt, 0, sizeof(*opt));
-               atomic_set(&opt->refcnt, 1);
+               refcount_set(&opt->refcnt, 1);
                opt->tot_len = sizeof(*opt) + optlen;
                retv = -EFAULT;
                if (copy_from_user(opt+1, optval, optlen))