]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - net/ipv4/fib_semantics.c
ipv4: convert dst_metrics.refcnt from atomic_t to refcount_t
[mirror_ubuntu-artful-kernel.git] / net / ipv4 / fib_semantics.c
index b8d18171cca33ab5dab67408c3cd11ad57f25b83..a663c09c9910cd882c68ed845f7bcb8c710c80f9 100644 (file)
@@ -219,7 +219,7 @@ static void free_fib_info_rcu(struct rcu_head *head)
        } endfor_nexthops(fi);
 
        m = fi->fib_metrics;
-       if (m != &dst_default_metrics && atomic_dec_and_test(&m->refcnt))
+       if (m != &dst_default_metrics && refcount_dec_and_test(&m->refcnt))
                kfree(m);
        kfree(fi);
 }
@@ -1083,15 +1083,17 @@ struct fib_info *fib_create_info(struct fib_config *cfg,
        fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL);
        if (!fi)
                goto failure;
-       fib_info_cnt++;
        if (cfg->fc_mx) {
                fi->fib_metrics = kzalloc(sizeof(*fi->fib_metrics), GFP_KERNEL);
-               if (!fi->fib_metrics)
-                       goto failure;
-               atomic_set(&fi->fib_metrics->refcnt, 1);
-       } else
+               if (unlikely(!fi->fib_metrics)) {
+                       kfree(fi);
+                       return ERR_PTR(err);
+               }
+               refcount_set(&fi->fib_metrics->refcnt, 1);
+       } else {
                fi->fib_metrics = (struct dst_metrics *)&dst_default_metrics;
-
+       }
+       fib_info_cnt++;
        fi->fib_net = net;
        fi->fib_protocol = cfg->fc_protocol;
        fi->fib_scope = cfg->fc_scope;