Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[deliverable/linux.git] / net / batman-adv / translation-table.c
index 0e80fd1461ab9062fed09a11373ea0f9a2817752..0b43e86328a59bb42f7200380b840b0209fd26a1 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2015 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-201 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich, Antonio Quartulli
  *
@@ -31,6 +31,7 @@
 #include <linux/jhash.h>
 #include <linux/jiffies.h>
 #include <linux/kernel.h>
+#include <linux/kref.h>
 #include <linux/list.h>
 #include <linux/lockdep.h>
 #include <linux/netdevice.h>
@@ -68,7 +69,15 @@ static void batadv_tt_global_del(struct batadv_priv *bat_priv,
                                 unsigned short vid, const char *message,
                                 bool roaming);
 
-/* returns 1 if they are the same mac addr and vid */
+/**
+ * batadv_compare_tt - check if two TT entries are the same
+ * @node: the list element pointer of the first TT entry
+ * @data2: pointer to the tt_common_entry of the second TT entry
+ *
+ * Compare the MAC address and the VLAN ID of the two TT entries and check if
+ * they are the same TT client.
+ * Return: 1 if the two TT clients are the same, 0 otherwise
+ */
 static int batadv_compare_tt(const struct hlist_node *node, const void *data2)
 {
        const void *data1 = container_of(node, struct batadv_tt_common_entry,
@@ -84,7 +93,7 @@ static int batadv_compare_tt(const struct hlist_node *node, const void *data2)
  * @data: pointer to the tt_common_entry object to map
  * @size: the size of the hash table
  *
- * Returns the hash index where the object represented by 'data' should be
+ * Return: the hash index where the object represented by 'data' should be
  * stored at.
  */
 static inline u32 batadv_choose_tt(const void *data, u32 size)
@@ -105,7 +114,7 @@ static inline u32 batadv_choose_tt(const void *data, u32 size)
  * @addr: the mac address of the client to look for
  * @vid: VLAN identifier
  *
- * Returns a pointer to the tt_common struct belonging to the searched client if
+ * Return: a pointer to the tt_common struct belonging to the searched client if
  * found, NULL otherwise.
  */
 static struct batadv_tt_common_entry *
@@ -133,7 +142,7 @@ batadv_tt_hash_find(struct batadv_hashtable *hash, const u8 *addr,
                if (tt->vid != vid)
                        continue;
 
-               if (!atomic_inc_not_zero(&tt->refcount))
+               if (!kref_get_unless_zero(&tt->refcount))
                        continue;
 
                tt_tmp = tt;
@@ -150,7 +159,7 @@ batadv_tt_hash_find(struct batadv_hashtable *hash, const u8 *addr,
  * @addr: the mac address of the client to look for
  * @vid: VLAN identifier
  *
- * Returns a pointer to the corresponding tt_local_entry struct if the client is
+ * Return: a pointer to the corresponding tt_local_entry struct if the client is
  * found, NULL otherwise.
  */
 static struct batadv_tt_local_entry *
@@ -175,7 +184,7 @@ batadv_tt_local_hash_find(struct batadv_priv *bat_priv, const u8 *addr,
  * @addr: the mac address of the client to look for
  * @vid: VLAN identifier
  *
- * Returns a pointer to the corresponding tt_global_entry struct if the client
+ * Return: a pointer to the corresponding tt_global_entry struct if the client
  * is found, NULL otherwise.
  */
 static struct batadv_tt_global_entry *
@@ -194,34 +203,68 @@ batadv_tt_global_hash_find(struct batadv_priv *bat_priv, const u8 *addr,
        return tt_global_entry;
 }
 
+/**
+ * batadv_tt_local_entry_release - release tt_local_entry from lists and queue
+ *  for free after rcu grace period
+ * @ref: kref pointer of the nc_node
+ */
+static void batadv_tt_local_entry_release(struct kref *ref)
+{
+       struct batadv_tt_local_entry *tt_local_entry;
+
+       tt_local_entry = container_of(ref, struct batadv_tt_local_entry,
+                                     common.refcount);
+
+       kfree_rcu(tt_local_entry, common.rcu);
+}
+
+/**
+ * batadv_tt_local_entry_put - decrement the tt_local_entry refcounter and
+ *  possibly release it
+ * @tt_local_entry: tt_local_entry to be free'd
+ */
 static void
-batadv_tt_local_entry_free_ref(struct batadv_tt_local_entry *tt_local_entry)
+batadv_tt_local_entry_put(struct batadv_tt_local_entry *tt_local_entry)
 {
-       if (atomic_dec_and_test(&tt_local_entry->common.refcount))
-               kfree_rcu(tt_local_entry, common.rcu);
+       kref_put(&tt_local_entry->common.refcount,
+                batadv_tt_local_entry_release);
 }
 
 /**
- * batadv_tt_global_entry_free_ref - decrement the refcounter for a
- *  tt_global_entry and possibly free it
- * @tt_global_entry: the object to free
+ * batadv_tt_global_entry_release - release tt_global_entry from lists and queue
+ *  for free after rcu grace period
+ * @ref: kref pointer of the nc_node
+ */
+static void batadv_tt_global_entry_release(struct kref *ref)
+{
+       struct batadv_tt_global_entry *tt_global_entry;
+
+       tt_global_entry = container_of(ref, struct batadv_tt_global_entry,
+                                      common.refcount);
+
+       batadv_tt_global_del_orig_list(tt_global_entry);
+       kfree_rcu(tt_global_entry, common.rcu);
+}
+
+/**
+ * batadv_tt_global_entry_put - decrement the tt_global_entry refcounter and
+ *  possibly release it
+ * @tt_global_entry: tt_global_entry to be free'd
  */
 static void
-batadv_tt_global_entry_free_ref(struct batadv_tt_global_entry *tt_global_entry)
+batadv_tt_global_entry_put(struct batadv_tt_global_entry *tt_global_entry)
 {
-       if (atomic_dec_and_test(&tt_global_entry->common.refcount)) {
-               batadv_tt_global_del_orig_list(tt_global_entry);
-               kfree_rcu(tt_global_entry, common.rcu);
-       }
+       kref_put(&tt_global_entry->common.refcount,
+                batadv_tt_global_entry_release);
 }
 
 /**
  * batadv_tt_global_hash_count - count the number of orig entries
- * @hash: hash table containing the tt entries
+ * @bat_priv: the bat priv with all the soft interface information
  * @addr: the mac address of the client to count entries for
  * @vid: VLAN identifier
  *
- * Return the number of originators advertising the given address/data
+ * Return: the number of originators advertising the given address/data
  * (excluding ourself).
  */
 int batadv_tt_global_hash_count(struct batadv_priv *bat_priv,
@@ -235,7 +278,7 @@ int batadv_tt_global_hash_count(struct batadv_priv *bat_priv,
                return 0;
 
        count = atomic_read(&tt_global_entry->orig_list_count);
-       batadv_tt_global_entry_free_ref(tt_global_entry);
+       batadv_tt_global_entry_put(tt_global_entry);
 
        return count;
 }
@@ -258,7 +301,7 @@ static void batadv_tt_local_size_mod(struct batadv_priv *bat_priv,
 
        atomic_add(v, &vlan->tt.num_entries);
 
-       batadv_softif_vlan_free_ref(vlan);
+       batadv_softif_vlan_put(vlan);
 }
 
 /**
@@ -286,9 +329,9 @@ static void batadv_tt_local_size_dec(struct batadv_priv *bat_priv,
 }
 
 /**
- * batadv_tt_global_size_mod - change the size by v of the local table
- *  identified by vid
- * @bat_priv: the bat priv with all the soft interface information
+ * batadv_tt_global_size_mod - change the size by v of the global table
+ *  for orig_node identified by vid
+ * @orig_node: the originator for which the table has to be modified
  * @vid: the VLAN identifier
  * @v: the amount to sum to the global table size
  */
@@ -305,12 +348,12 @@ static void batadv_tt_global_size_mod(struct batadv_orig_node *orig_node,
                spin_lock_bh(&orig_node->vlan_list_lock);
                if (!hlist_unhashed(&vlan->list)) {
                        hlist_del_init_rcu(&vlan->list);
-                       batadv_orig_node_vlan_free_ref(vlan);
+                       batadv_orig_node_vlan_put(vlan);
                }
                spin_unlock_bh(&orig_node->vlan_list_lock);
        }
 
-       batadv_orig_node_vlan_free_ref(vlan);
+       batadv_orig_node_vlan_put(vlan);
 }
 
 /**
@@ -340,22 +383,28 @@ static void batadv_tt_global_size_dec(struct batadv_orig_node *orig_node,
 /**
  * batadv_tt_orig_list_entry_release - release tt orig entry from lists and
  *  queue for free after rcu grace period
- * @orig_entry: tt orig entry to be free'd
+ * @ref: kref pointer of the tt orig entry
  */
-static void
-batadv_tt_orig_list_entry_release(struct batadv_tt_orig_list_entry *orig_entry)
+static void batadv_tt_orig_list_entry_release(struct kref *ref)
 {
-       batadv_orig_node_free_ref(orig_entry->orig_node);
+       struct batadv_tt_orig_list_entry *orig_entry;
+
+       orig_entry = container_of(ref, struct batadv_tt_orig_list_entry,
+                                 refcount);
+
+       batadv_orig_node_put(orig_entry->orig_node);
        kfree_rcu(orig_entry, rcu);
 }
 
+/**
+ * batadv_tt_orig_list_entry_put - decrement the tt orig entry refcounter and
+ *  possibly release it
+ * @orig_entry: tt orig entry to be free'd
+ */
 static void
-batadv_tt_orig_list_entry_free_ref(struct batadv_tt_orig_list_entry *orig_entry)
+batadv_tt_orig_list_entry_put(struct batadv_tt_orig_list_entry *orig_entry)
 {
-       if (!atomic_dec_and_test(&orig_entry->refcount))
-               return;
-
-       batadv_tt_orig_list_entry_release(orig_entry);
+       kref_put(&orig_entry->refcount, batadv_tt_orig_list_entry_release);
 }
 
 /**
@@ -437,7 +486,7 @@ unlock:
  * batadv_tt_len - compute length in bytes of given number of tt changes
  * @changes_num: number of tt changes
  *
- * Returns computed length in bytes.
+ * Return: computed length in bytes.
  */
 static int batadv_tt_len(int changes_num)
 {
@@ -448,7 +497,7 @@ static int batadv_tt_len(int changes_num)
  * batadv_tt_entries - compute the number of entries fitting in tt_len bytes
  * @tt_len: available space
  *
- * Returns the number of entries.
+ * Return: the number of entries.
  */
 static u16 batadv_tt_entries(u16 tt_len)
 {
@@ -460,7 +509,7 @@ static u16 batadv_tt_entries(u16 tt_len)
  *  size when transmitted over the air
  * @bat_priv: the bat priv with all the soft interface information
  *
- * Returns local translation table size in bytes.
+ * Return: local translation table size in bytes.
  */
 static int batadv_tt_local_table_transmit_size(struct batadv_priv *bat_priv)
 {
@@ -512,7 +561,7 @@ static void batadv_tt_global_free(struct batadv_priv *bat_priv,
 
        batadv_hash_remove(bat_priv->tt.global_hash, batadv_compare_tt,
                           batadv_choose_tt, &tt_global->common);
-       batadv_tt_global_entry_free_ref(tt_global);
+       batadv_tt_global_entry_put(tt_global);
 }
 
 /**
@@ -526,7 +575,7 @@ static void batadv_tt_global_free(struct batadv_priv *bat_priv,
  * @mark: the value contained in the skb->mark field of the received packet (if
  *  any)
  *
- * Returns true if the client was successfully added, false otherwise.
+ * Return: true if the client was successfully added, false otherwise.
  */
 bool batadv_tt_local_add(struct net_device *soft_iface, const u8 *addr,
                         unsigned short vid, int ifindex, u32 mark)
@@ -620,7 +669,8 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const u8 *addr,
        tt_local->common.vid = vid;
        if (batadv_is_wifi_netdev(in_dev))
                tt_local->common.flags |= BATADV_TT_CLIENT_WIFI;
-       atomic_set(&tt_local->common.refcount, 2);
+       kref_init(&tt_local->common.refcount);
+       kref_get(&tt_local->common.refcount);
        tt_local->last_seen = jiffies;
        tt_local->common.added_at = tt_local->last_seen;
 
@@ -637,8 +687,8 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const u8 *addr,
 
        if (unlikely(hash_added != 0)) {
                /* remove the reference for the hash */
-               batadv_tt_local_entry_free_ref(tt_local);
-               batadv_softif_vlan_free_ref(vlan);
+               batadv_tt_local_entry_put(tt_local);
+               batadv_softif_vlan_put(vlan);
                goto out;
        }
 
@@ -704,9 +754,9 @@ out:
        if (in_dev)
                dev_put(in_dev);
        if (tt_local)
-               batadv_tt_local_entry_free_ref(tt_local);
+               batadv_tt_local_entry_put(tt_local);
        if (tt_global)
-               batadv_tt_global_entry_free_ref(tt_global);
+               batadv_tt_global_entry_put(tt_global);
        return ret;
 }
 
@@ -721,12 +771,11 @@ out:
  *  function reserves the amount of space needed to send the entire global TT
  *  table. In case of success the value is updated with the real amount of
  *  reserved bytes
-
  * Allocate the needed amount of memory for the entire TT TVLV and write its
  * header made up by one tvlv_tt_data object and a series of tvlv_tt_vlan_data
  * objects, one per active VLAN served by the originator node.
  *
- * Return the size of the allocated buffer or 0 in case of failure.
+ * Return: the size of the allocated buffer or 0 in case of failure.
  */
 static u16
 batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node,
@@ -800,7 +849,7 @@ out:
  * header made up by one tvlv_tt_data object and a series of tvlv_tt_vlan_data
  * objects, one per active VLAN.
  *
- * Return the size of the allocated buffer or 0 in case of failure.
+ * Return: the size of the allocated buffer or 0 in case of failure.
  */
 static u16
 batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
@@ -1005,13 +1054,13 @@ int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset)
                                   no_purge ? 0 : last_seen_msecs,
                                   vlan->tt.crc);
 
-                       batadv_softif_vlan_free_ref(vlan);
+                       batadv_softif_vlan_put(vlan);
                }
                rcu_read_unlock();
        }
 out:
        if (primary_if)
-               batadv_hardif_free_ref(primary_if);
+               batadv_hardif_put(primary_if);
        return 0;
 }
 
@@ -1042,7 +1091,7 @@ batadv_tt_local_set_pending(struct batadv_priv *bat_priv,
  * @message: message to append to the log on deletion
  * @roaming: true if the deletion is due to a roaming event
  *
- * Returns the flags assigned to the local entry before being deleted
+ * Return: the flags assigned to the local entry before being deleted
  */
 u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr,
                           unsigned short vid, const char *message,
@@ -1088,19 +1137,19 @@ u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr,
                goto out;
 
        /* extra call to free the local tt entry */
-       batadv_tt_local_entry_free_ref(tt_local_entry);
+       batadv_tt_local_entry_put(tt_local_entry);
 
        /* decrease the reference held for this vlan */
        vlan = batadv_softif_vlan_get(bat_priv, vid);
        if (!vlan)
                goto out;
 
-       batadv_softif_vlan_free_ref(vlan);
-       batadv_softif_vlan_free_ref(vlan);
+       batadv_softif_vlan_put(vlan);
+       batadv_softif_vlan_put(vlan);
 
 out:
        if (tt_local_entry)
-               batadv_tt_local_entry_free_ref(tt_local_entry);
+               batadv_tt_local_entry_put(tt_local_entry);
 
        return curr_flags;
 }
@@ -1196,11 +1245,11 @@ static void batadv_tt_local_table_free(struct batadv_priv *bat_priv)
                        vlan = batadv_softif_vlan_get(bat_priv,
                                                      tt_common_entry->vid);
                        if (vlan) {
-                               batadv_softif_vlan_free_ref(vlan);
-                               batadv_softif_vlan_free_ref(vlan);
+                               batadv_softif_vlan_put(vlan);
+                               batadv_softif_vlan_put(vlan);
                        }
 
-                       batadv_tt_local_entry_free_ref(tt_local);
+                       batadv_tt_local_entry_put(tt_local);
                }
                spin_unlock_bh(list_lock);
        }
@@ -1242,10 +1291,16 @@ static void batadv_tt_changes_list_free(struct batadv_priv *bat_priv)
        spin_unlock_bh(&bat_priv->tt.changes_list_lock);
 }
 
-/* retrieves the orig_tt_list_entry belonging to orig_node from the
+/**
+ * batadv_tt_global_orig_entry_find - find a TT orig_list_entry
+ * @entry: the TT global entry where the orig_list_entry has to be
+ *  extracted from
+ * @orig_node: the originator for which the orig_list_entry has to be found
+ *
+ * retrieve the orig_tt_list_entry belonging to orig_node from the
  * batadv_tt_global_entry list
  *
- * returns it with an increased refcounter, NULL if not found
+ * Return: it with an increased refcounter, NULL if not found
  */
 static struct batadv_tt_orig_list_entry *
 batadv_tt_global_orig_entry_find(const struct batadv_tt_global_entry *entry,
@@ -1259,7 +1314,7 @@ batadv_tt_global_orig_entry_find(const struct batadv_tt_global_entry *entry,
        hlist_for_each_entry_rcu(tmp_orig_entry, head, list) {
                if (tmp_orig_entry->orig_node != orig_node)
                        continue;
-               if (!atomic_inc_not_zero(&tmp_orig_entry->refcount))
+               if (!kref_get_unless_zero(&tmp_orig_entry->refcount))
                        continue;
 
                orig_entry = tmp_orig_entry;
@@ -1270,8 +1325,15 @@ batadv_tt_global_orig_entry_find(const struct batadv_tt_global_entry *entry,
        return orig_entry;
 }
 
-/* find out if an orig_node is already in the list of a tt_global_entry.
- * returns true if found, false otherwise
+/**
+ * batadv_tt_global_entry_has_orig - check if a TT global entry is also handled
+ *  by a given originator
+ * @entry: the TT global entry to check
+ * @orig_node: the originator to search in the list
+ *
+ * find out if an orig_node is already in the list of a tt_global_entry.
+ *
+ * Return: true if found, false otherwise
  */
 static bool
 batadv_tt_global_entry_has_orig(const struct batadv_tt_global_entry *entry,
@@ -1283,7 +1345,7 @@ batadv_tt_global_entry_has_orig(const struct batadv_tt_global_entry *entry,
        orig_entry = batadv_tt_global_orig_entry_find(entry, orig_node);
        if (orig_entry) {
                found = true;
-               batadv_tt_orig_list_entry_free_ref(orig_entry);
+               batadv_tt_orig_list_entry_put(orig_entry);
        }
 
        return found;
@@ -1309,11 +1371,12 @@ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
                goto out;
 
        INIT_HLIST_NODE(&orig_entry->list);
-       atomic_inc(&orig_node->refcount);
+       kref_get(&orig_node->refcount);
        batadv_tt_global_size_inc(orig_node, tt_global->common.vid);
        orig_entry->orig_node = orig_node;
        orig_entry->ttvn = ttvn;
-       atomic_set(&orig_entry->refcount, 2);
+       kref_init(&orig_entry->refcount);
+       kref_get(&orig_entry->refcount);
 
        spin_lock_bh(&tt_global->list_lock);
        hlist_add_head_rcu(&orig_entry->list,
@@ -1323,7 +1386,7 @@ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
 
 out:
        if (orig_entry)
-               batadv_tt_orig_list_entry_free_ref(orig_entry);
+               batadv_tt_orig_list_entry_put(orig_entry);
 }
 
 /**
@@ -1343,7 +1406,7 @@ out:
  *
  * The caller must hold orig_node refcount.
  *
- * Return true if the new entry has been added, false otherwise
+ * Return: true if the new entry has been added, false otherwise
  */
 static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
                                 struct batadv_orig_node *orig_node,
@@ -1389,7 +1452,8 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
                 */
                if (flags & BATADV_TT_CLIENT_ROAM)
                        tt_global_entry->roam_at = jiffies;
-               atomic_set(&common->refcount, 2);
+               kref_init(&common->refcount);
+               kref_get(&common->refcount);
                common->added_at = jiffies;
 
                INIT_HLIST_HEAD(&tt_global_entry->orig_list);
@@ -1403,7 +1467,7 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
 
                if (unlikely(hash_added != 0)) {
                        /* remove the reference for the hash */
-                       batadv_tt_global_entry_free_ref(tt_global_entry);
+                       batadv_tt_global_entry_put(tt_global_entry);
                        goto out_remove;
                }
        } else {
@@ -1489,9 +1553,9 @@ out_remove:
 
 out:
        if (tt_global_entry)
-               batadv_tt_global_entry_free_ref(tt_global_entry);
+               batadv_tt_global_entry_put(tt_global_entry);
        if (tt_local_entry)
-               batadv_tt_local_entry_free_ref(tt_local_entry);
+               batadv_tt_local_entry_put(tt_local_entry);
        return ret;
 }
 
@@ -1501,7 +1565,7 @@ out:
  * @tt_global_entry: global translation table entry to be analyzed
  *
  * This functon assumes the caller holds rcu_read_lock().
- * Returns best originator list entry or NULL on errors.
+ * Return: best originator list entry or NULL on errors.
  */
 static struct batadv_tt_orig_list_entry *
 batadv_transtable_best_orig(struct batadv_priv *bat_priv,
@@ -1522,20 +1586,20 @@ batadv_transtable_best_orig(struct batadv_priv *bat_priv,
                if (best_router &&
                    bao->bat_neigh_cmp(router, BATADV_IF_DEFAULT,
                                       best_router, BATADV_IF_DEFAULT) <= 0) {
-                       batadv_neigh_node_free_ref(router);
+                       batadv_neigh_node_put(router);
                        continue;
                }
 
                /* release the refcount for the "old" best */
                if (best_router)
-                       batadv_neigh_node_free_ref(best_router);
+                       batadv_neigh_node_put(best_router);
 
                best_entry = orig_entry;
                best_router = router;
        }
 
        if (best_router)
-               batadv_neigh_node_free_ref(best_router);
+               batadv_neigh_node_put(best_router);
 
        return best_entry;
 }
@@ -1588,7 +1652,7 @@ batadv_tt_global_print_entry(struct batadv_priv *bat_priv,
                           ((flags & BATADV_TT_CLIENT_ISOLA) ? 'I' : '.'),
                           ((flags & BATADV_TT_CLIENT_TEMP) ? 'T' : '.'));
 
-               batadv_orig_node_vlan_free_ref(vlan);
+               batadv_orig_node_vlan_put(vlan);
        }
 
 print_list:
@@ -1620,7 +1684,7 @@ print_list:
                           ((flags & BATADV_TT_CLIENT_ISOLA) ? 'I' : '.'),
                           ((flags & BATADV_TT_CLIENT_TEMP) ? 'T' : '.'));
 
-               batadv_orig_node_vlan_free_ref(vlan);
+               batadv_orig_node_vlan_put(vlan);
        }
 }
 
@@ -1661,7 +1725,7 @@ int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset)
        }
 out:
        if (primary_if)
-               batadv_hardif_free_ref(primary_if);
+               batadv_hardif_put(primary_if);
        return 0;
 }
 
@@ -1689,7 +1753,7 @@ _batadv_tt_global_del_orig_entry(struct batadv_tt_global_entry *tt_global_entry,
         * being part of a list
         */
        hlist_del_rcu(&orig_entry->list);
-       batadv_tt_orig_list_entry_free_ref(orig_entry);
+       batadv_tt_orig_list_entry_put(orig_entry);
 }
 
 /* deletes the orig list of a tt_global_entry */
@@ -1845,9 +1909,9 @@ static void batadv_tt_global_del(struct batadv_priv *bat_priv,
 
 out:
        if (tt_global_entry)
-               batadv_tt_global_entry_free_ref(tt_global_entry);
+               batadv_tt_global_entry_put(tt_global_entry);
        if (local_entry)
-               batadv_tt_local_entry_free_ref(local_entry);
+               batadv_tt_local_entry_put(local_entry);
 }
 
 /**
@@ -1901,7 +1965,7 @@ void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
                                           tt_global->common.addr,
                                           BATADV_PRINT_VID(vid), message);
                                hlist_del_rcu(&tt_common_entry->hash_entry);
-                               batadv_tt_global_entry_free_ref(tt_global);
+                               batadv_tt_global_entry_put(tt_global);
                        }
                }
                spin_unlock_bh(list_lock);
@@ -1964,7 +2028,7 @@ static void batadv_tt_global_purge(struct batadv_priv *bat_priv)
 
                        hlist_del_rcu(&tt_common->hash_entry);
 
-                       batadv_tt_global_entry_free_ref(tt_global);
+                       batadv_tt_global_entry_put(tt_global);
                }
                spin_unlock_bh(list_lock);
        }
@@ -1996,7 +2060,7 @@ static void batadv_tt_global_table_free(struct batadv_priv *bat_priv)
                        tt_global = container_of(tt_common_entry,
                                                 struct batadv_tt_global_entry,
                                                 common);
-                       batadv_tt_global_entry_free_ref(tt_global);
+                       batadv_tt_global_entry_put(tt_global);
                }
                spin_unlock_bh(list_lock);
        }
@@ -2031,7 +2095,7 @@ _batadv_is_ap_isolated(struct batadv_tt_local_entry *tt_local_entry,
  * @addr: mac address of the destination client
  * @vid: VLAN identifier
  *
- * Returns a pointer to the originator that was selected as destination in the
+ * Return: a pointer to the originator that was selected as destination in the
  * mesh for contacting the client 'addr', NULL otherwise.
  * In case of multiple originators serving the same client, the function returns
  * the best one (best in terms of metric towards the destination node).
@@ -2071,15 +2135,15 @@ struct batadv_orig_node *batadv_transtable_search(struct batadv_priv *bat_priv,
        /* found anything? */
        if (best_entry)
                orig_node = best_entry->orig_node;
-       if (orig_node && !atomic_inc_not_zero(&orig_node->refcount))
+       if (orig_node && !kref_get_unless_zero(&orig_node->refcount))
                orig_node = NULL;
        rcu_read_unlock();
 
 out:
        if (tt_global_entry)
-               batadv_tt_global_entry_free_ref(tt_global_entry);
+               batadv_tt_global_entry_put(tt_global_entry);
        if (tt_local_entry)
-               batadv_tt_local_entry_free_ref(tt_local_entry);
+               batadv_tt_local_entry_put(tt_local_entry);
 
        return orig_node;
 }
@@ -2106,7 +2170,7 @@ out:
  * because the XOR operation can combine them all while trying to reduce the
  * noise as much as possible.
  *
- * Returns the checksum of the global table of a given originator.
+ * Return: the checksum of the global table of a given originator.
  */
 static u32 batadv_tt_global_crc(struct batadv_priv *bat_priv,
                                struct batadv_orig_node *orig_node,
@@ -2183,7 +2247,7 @@ static u32 batadv_tt_global_crc(struct batadv_priv *bat_priv,
  * For details about the computation, please refer to the documentation for
  * batadv_tt_global_crc().
  *
- * Returns the checksum of the local table
+ * Return: the checksum of the local table
  */
 static u32 batadv_tt_local_crc(struct batadv_priv *bat_priv,
                               unsigned short vid)
@@ -2289,7 +2353,7 @@ static void batadv_tt_req_purge(struct batadv_priv *bat_priv)
  * @bat_priv: the bat priv with all the soft interface information
  * @orig_node: orig node this request is being issued for
  *
- * Returns the pointer to the new tt_req_node struct if no request
+ * Return: the pointer to the new tt_req_node struct if no request
  * has already been issued for this orig_node, NULL otherwise.
  */
 static struct batadv_tt_req_node *
@@ -2324,7 +2388,7 @@ unlock:
  * @entry_ptr: to be checked local tt entry
  * @data_ptr: not used but definition required to satisfy the callback prototype
  *
- * Returns 1 if the entry is a valid, 0 otherwise.
+ * Return: 1 if the entry is a valid, 0 otherwise.
  */
 static int batadv_tt_local_valid(const void *entry_ptr, const void *data_ptr)
 {
@@ -2408,9 +2472,8 @@ static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
  * @orig_node: originator for which the CRCs have to be checked
  * @tt_vlan: pointer to the first tvlv VLAN entry
  * @num_vlan: number of tvlv VLAN entries
- * @create: if true, create VLAN objects if not found
  *
- * Return true if all the received CRCs match the locally stored ones, false
+ * Return: true if all the received CRCs match the locally stored ones, false
  * otherwise
  */
 static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node,
@@ -2440,7 +2503,7 @@ static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node,
                        return false;
 
                crc = vlan->tt.crc;
-               batadv_orig_node_vlan_free_ref(vlan);
+               batadv_orig_node_vlan_put(vlan);
 
                if (crc != ntohl(tt_vlan_tmp->crc))
                        return false;
@@ -2513,6 +2576,8 @@ static void batadv_tt_global_update_crc(struct batadv_priv *bat_priv,
  * @num_vlan: number of tvlv VLAN entries
  * @full_table: ask for the entire translation table if true, while only for the
  *  last TT diff otherwise
+ *
+ * Return: true if the TT Request was sent, false otherwise
  */
 static int batadv_send_tt_request(struct batadv_priv *bat_priv,
                                  struct batadv_orig_node *dst_orig_node,
@@ -2573,7 +2638,7 @@ static int batadv_send_tt_request(struct batadv_priv *bat_priv,
 
 out:
        if (primary_if)
-               batadv_hardif_free_ref(primary_if);
+               batadv_hardif_put(primary_if);
        if (ret && tt_req_node) {
                spin_lock_bh(&bat_priv->tt.req_list_lock);
                /* hlist_del_init() verifies tt_req_node still is in the list */
@@ -2593,7 +2658,7 @@ out:
  * @req_src: mac address of tt request sender
  * @req_dst: mac address of tt request recipient
  *
- * Returns true if tt request reply was sent, false otherwise.
+ * Return: true if tt request reply was sent, false otherwise.
  */
 static bool batadv_send_other_tt_response(struct batadv_priv *bat_priv,
                                          struct batadv_tvlv_tt_data *tt_data,
@@ -2711,9 +2776,9 @@ unlock:
 
 out:
        if (res_dst_orig_node)
-               batadv_orig_node_free_ref(res_dst_orig_node);
+               batadv_orig_node_put(res_dst_orig_node);
        if (req_dst_orig_node)
-               batadv_orig_node_free_ref(req_dst_orig_node);
+               batadv_orig_node_put(req_dst_orig_node);
        kfree(tvlv_tt_data);
        return ret;
 }
@@ -2725,7 +2790,7 @@ out:
  * @tt_data: tt data containing the tt request information
  * @req_src: mac address of tt request sender
  *
- * Returns true if tt request reply was sent, false otherwise.
+ * Return: true if tt request reply was sent, false otherwise.
  */
 static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv,
                                       struct batadv_tvlv_tt_data *tt_data,
@@ -2828,9 +2893,9 @@ unlock:
 out:
        spin_unlock_bh(&bat_priv->tt.commit_lock);
        if (orig_node)
-               batadv_orig_node_free_ref(orig_node);
+               batadv_orig_node_put(orig_node);
        if (primary_if)
-               batadv_hardif_free_ref(primary_if);
+               batadv_hardif_put(primary_if);
        kfree(tvlv_tt_data);
        /* The packet was for this host, so it doesn't need to be re-routed */
        return true;
@@ -2843,7 +2908,7 @@ out:
  * @req_src: mac address of tt request sender
  * @req_dst: mac address of tt request recipient
  *
- * Returns true if tt request reply was sent, false otherwise.
+ * Return: true if tt request reply was sent, false otherwise.
  */
 static bool batadv_send_tt_response(struct batadv_priv *bat_priv,
                                    struct batadv_tvlv_tt_data *tt_data,
@@ -2916,7 +2981,7 @@ static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv,
 
 out:
        if (orig_node)
-               batadv_orig_node_free_ref(orig_node);
+               batadv_orig_node_put(orig_node);
 }
 
 static void batadv_tt_update_changes(struct batadv_priv *bat_priv,
@@ -2938,7 +3003,7 @@ static void batadv_tt_update_changes(struct batadv_priv *bat_priv,
  * @addr: the mac address of the client to check
  * @vid: VLAN identifier
  *
- * Returns true if the client is served by this node, false otherwise.
+ * Return: true if the client is served by this node, false otherwise.
  */
 bool batadv_is_my_client(struct batadv_priv *bat_priv, const u8 *addr,
                         unsigned short vid)
@@ -2958,7 +3023,7 @@ bool batadv_is_my_client(struct batadv_priv *bat_priv, const u8 *addr,
        ret = true;
 out:
        if (tt_local_entry)
-               batadv_tt_local_entry_free_ref(tt_local_entry);
+               batadv_tt_local_entry_put(tt_local_entry);
        return ret;
 }
 
@@ -3022,7 +3087,7 @@ static void batadv_handle_tt_response(struct batadv_priv *bat_priv,
        spin_unlock_bh(&bat_priv->tt.req_list_lock);
 out:
        if (orig_node)
-               batadv_orig_node_free_ref(orig_node);
+               batadv_orig_node_put(orig_node);
 }
 
 static void batadv_tt_roam_list_free(struct batadv_priv *bat_priv)
@@ -3055,11 +3120,16 @@ static void batadv_tt_roam_purge(struct batadv_priv *bat_priv)
        spin_unlock_bh(&bat_priv->tt.roam_list_lock);
 }
 
-/* This function checks whether the client already reached the
+/**
+ * batadv_tt_check_roam_count - check if a client has roamed too frequently
+ * @bat_priv: the bat priv with all the soft interface information
+ * @client: mac address of the roaming client
+ *
+ * This function checks whether the client already reached the
  * maximum number of possible roaming phases. In this case the ROAMING_ADV
  * will not be sent.
  *
- * returns true if the ROAMING_ADV can be sent, false otherwise
+ * Return: true if the ROAMING_ADV can be sent, false otherwise
  */
 static bool batadv_tt_check_roam_count(struct batadv_priv *bat_priv, u8 *client)
 {
@@ -3148,7 +3218,7 @@ static void batadv_send_roam_adv(struct batadv_priv *bat_priv, u8 *client,
 
 out:
        if (primary_if)
-               batadv_hardif_free_ref(primary_if);
+               batadv_hardif_put(primary_if);
 }
 
 static void batadv_tt_purge(struct work_struct *work)
@@ -3272,11 +3342,11 @@ static void batadv_tt_local_purge_pending_clients(struct batadv_priv *bat_priv)
                        /* decrease the reference held for this vlan */
                        vlan = batadv_softif_vlan_get(bat_priv, tt_common->vid);
                        if (vlan) {
-                               batadv_softif_vlan_free_ref(vlan);
-                               batadv_softif_vlan_free_ref(vlan);
+                               batadv_softif_vlan_put(vlan);
+                               batadv_softif_vlan_put(vlan);
                        }
 
-                       batadv_tt_local_entry_free_ref(tt_local);
+                       batadv_tt_local_entry_put(tt_local);
                }
                spin_unlock_bh(list_lock);
        }
@@ -3359,11 +3429,11 @@ bool batadv_is_ap_isolated(struct batadv_priv *bat_priv, u8 *src, u8 *dst,
        ret = true;
 
 out:
-       batadv_softif_vlan_free_ref(vlan);
+       batadv_softif_vlan_put(vlan);
        if (tt_global_entry)
-               batadv_tt_global_entry_free_ref(tt_global_entry);
+               batadv_tt_global_entry_put(tt_global_entry);
        if (tt_local_entry)
-               batadv_tt_local_entry_free_ref(tt_local_entry);
+               batadv_tt_local_entry_put(tt_local_entry);
        return ret;
 }
 
@@ -3371,13 +3441,12 @@ out:
  * batadv_tt_update_orig - update global translation table with new tt
  *  information received via ogms
  * @bat_priv: the bat priv with all the soft interface information
- * @orig: the orig_node of the ogm
- * @tt_vlan: pointer to the first tvlv VLAN entry
+ * @orig_node: the orig_node of the ogm
+ * @tt_buff: pointer to the first tvlv VLAN entry
  * @tt_num_vlan: number of tvlv VLAN entries
  * @tt_change: pointer to the first entry in the TT buffer
  * @tt_num_changes: number of tt changes inside the tt buffer
  * @ttvn: translation table version number of this changeset
- * @tt_crc: crc32 checksum of orig node's translation table
  */
 static void batadv_tt_update_orig(struct batadv_priv *bat_priv,
                                  struct batadv_orig_node *orig_node,
@@ -3459,7 +3528,7 @@ request_table:
  * @addr: the mac address of the client to check
  * @vid: VLAN identifier
  *
- * Returns true if we know that the client has moved from its old originator
+ * Return: true if we know that the client has moved from its old originator
  * to another one. This entry is still kept for consistency purposes and will be
  * deleted later by a DEL or because of timeout
  */
@@ -3474,7 +3543,7 @@ bool batadv_tt_global_client_is_roaming(struct batadv_priv *bat_priv,
                goto out;
 
        ret = tt_global_entry->common.flags & BATADV_TT_CLIENT_ROAM;
-       batadv_tt_global_entry_free_ref(tt_global_entry);
+       batadv_tt_global_entry_put(tt_global_entry);
 out:
        return ret;
 }
@@ -3485,7 +3554,7 @@ out:
  * @addr: the mac address of the local client to query
  * @vid: VLAN identifier
  *
- * Returns true if the local client is known to be roaming (it is not served by
+ * Return: true if the local client is known to be roaming (it is not served by
  * this node anymore) or not. If yes, the client is still present in the table
  * to keep the latter consistent with the node TTVN
  */
@@ -3500,7 +3569,7 @@ bool batadv_tt_local_client_is_roaming(struct batadv_priv *bat_priv,
                goto out;
 
        ret = tt_local_entry->common.flags & BATADV_TT_CLIENT_ROAM;
-       batadv_tt_local_entry_free_ref(tt_local_entry);
+       batadv_tt_local_entry_put(tt_local_entry);
 out:
        return ret;
 }
@@ -3614,7 +3683,7 @@ static void batadv_tt_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv,
  * @tvlv_value: tvlv buffer containing the tt data
  * @tvlv_value_len: tvlv buffer length
  *
- * Returns NET_RX_DROP if the tt tvlv is to be re-routed, NET_RX_SUCCESS
+ * Return: NET_RX_DROP if the tt tvlv is to be re-routed, NET_RX_SUCCESS
  * otherwise.
  */
 static int batadv_tt_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv,
@@ -3695,7 +3764,7 @@ static int batadv_tt_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv,
  * @tvlv_value: tvlv buffer containing the tt data
  * @tvlv_value_len: tvlv buffer length
  *
- * Returns NET_RX_DROP if the tt roam tvlv is to be re-routed, NET_RX_SUCCESS
+ * Return: NET_RX_DROP if the tt roam tvlv is to be re-routed, NET_RX_SUCCESS
  * otherwise.
  */
 static int batadv_roam_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv,
@@ -3733,7 +3802,7 @@ static int batadv_roam_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv,
 
 out:
        if (orig_node)
-               batadv_orig_node_free_ref(orig_node);
+               batadv_orig_node_put(orig_node);
        return NET_RX_SUCCESS;
 }
 
@@ -3741,7 +3810,7 @@ out:
  * batadv_tt_init - initialise the translation table internals
  * @bat_priv: the bat priv with all the soft interface information
  *
- * Return 0 on success or negative error number in case of failure.
+ * Return: 0 on success or negative error number in case of failure.
  */
 int batadv_tt_init(struct batadv_priv *bat_priv)
 {
@@ -3779,7 +3848,7 @@ int batadv_tt_init(struct batadv_priv *bat_priv)
  * @addr: the mac address of the client
  * @vid: the identifier of the VLAN where this client is connected
  *
- * Returns true if the client is marked with the TT_CLIENT_ISOLA flag, false
+ * Return: true if the client is marked with the TT_CLIENT_ISOLA flag, false
  * otherwise
  */
 bool batadv_tt_global_is_isolated(struct batadv_priv *bat_priv,
@@ -3794,7 +3863,7 @@ bool batadv_tt_global_is_isolated(struct batadv_priv *bat_priv,
 
        ret = tt->common.flags & BATADV_TT_CLIENT_ISOLA;
 
-       batadv_tt_global_entry_free_ref(tt);
+       batadv_tt_global_entry_put(tt);
 
        return ret;
 }
This page took 0.043266 seconds and 5 git commands to generate.