]> err.no Git - linux-2.6/blobdiff - net/ipv6/addrlabel.c
[IPV4]: esp_output() misannotations
[linux-2.6] / net / ipv6 / addrlabel.c
index 38674121ae5f930a08e5a24076d298935fe2c57b..a3c5a72218fd629b88ec41c587780d635e0b9b66 100644 (file)
@@ -106,6 +106,11 @@ static inline void ip6addrlbl_free(struct ip6addrlbl_entry *p)
        kfree(p);
 }
 
+static void ip6addrlbl_free_rcu(struct rcu_head *h)
+{
+       ip6addrlbl_free(container_of(h, struct ip6addrlbl_entry, rcu));
+}
+
 static inline int ip6addrlbl_hold(struct ip6addrlbl_entry *p)
 {
        return atomic_inc_not_zero(&p->refcnt);
@@ -114,12 +119,7 @@ static inline int ip6addrlbl_hold(struct ip6addrlbl_entry *p)
 static inline void ip6addrlbl_put(struct ip6addrlbl_entry *p)
 {
        if (atomic_dec_and_test(&p->refcnt))
-               ip6addrlbl_free(p);
-}
-
-static void ip6addrlbl_free_rcu(struct rcu_head *h)
-{
-       ip6addrlbl_free(container_of(h, struct ip6addrlbl_entry, rcu));
+               call_rcu(&p->rcu, ip6addrlbl_free_rcu);
 }
 
 /* Find label */
@@ -240,7 +240,6 @@ static int __ip6addrlbl_add(struct ip6addrlbl_entry *newp, int replace)
                                }
                                hlist_replace_rcu(&p->list, &newp->list);
                                ip6addrlbl_put(p);
-                               call_rcu(&p->rcu, ip6addrlbl_free_rcu);
                                goto out;
                        } else if ((p->prefixlen == newp->prefixlen && !p->ifindex) ||
                                   (p->prefixlen < newp->prefixlen)) {
@@ -300,7 +299,6 @@ static int __ip6addrlbl_del(const struct in6_addr *prefix, int prefixlen,
                    ipv6_addr_equal(&p->prefix, prefix)) {
                        hlist_del_rcu(&p->list);
                        ip6addrlbl_put(p);
-                       call_rcu(&p->rcu, ip6addrlbl_free_rcu);
                        ret = 0;
                        break;
                }