: Prepare mesh_table_grow to failing copy_node callback.
Subsystems (3)
PATCH 2/7 : Prepare mesh_table_grow to failing copy_node callback.
The mesh_path_node_copy() performs kmalloc() and thus - may fail (well, it does not now, but I'm fixing this right now). Its caller - the mesh_table_grow() - isn't prepared for such a trick yet.
This preparation is just flush the new hash and make copy_node() return an int value.
Signed-off-by Pavel Emelyanov <[email protected]>
--- net/mac80211/mesh.c | 15 +++++++++++++-- net/mac80211/mesh.h | 2 +- net/mac80211/mesh_pathtbl.c | 3 ++- 3 files changed, 16 insertions(+), 4 deletions(-)
net/mac80211/mesh.c +13 -2
@@ -349,7 +349,7 @@ struct mesh_table *mesh_table_grow(struct mesh_table *tbl) {struct mesh_table *newtbl;struct hlist_head *oldhash; -struct hlist_node *p; +struct hlist_node *p, *q;int err =0 ;int i;
@@ -373,13 +373,24 @@ struct mesh_table *mesh_table_grow(struct mesh_table *tbl) oldhash = tbl->hash_buckets;for (i =0 ; i <= tbl->hash_mask; i++)hlist_for_each (p, &oldhash[i]) - tbl->copy_node (p, newtbl); +if (tbl->copy_node (p, newtbl) <0 ) + goto errcopy; endgrow:if (err)return NULL ;else return newtbl; + +errcopy: +for (i =0 ; i <= newtbl->hash_mask; i++) { +hlist_for_each_safe (p, q, &newtbl->hash_buckets[i]) + tbl->free_node (p,0 ); + } +kfree (newtbl->hash_buckets); +kfree (newtbl->hashwlock); +kfree (newtbl); +return NULL ; }/**
net/mac80211/mesh.h +1 -1
@@ -109,7 +109,7 @@ struct mesh_table {__u32 hash_rnd;/* Used for hash generation */ atomic_t entries;/* Up to MAX_MESH_NEIGHBOURS */ void (*free_node) (struct hlist_node *p,bool free_leafs); -void (*copy_node) (struct hlist_node *p,struct mesh_table *newtbl); +int (*copy_node) (struct hlist_node *p,struct mesh_table *newtbl);int size_order;int mean_chain_len; };
net/mac80211/mesh_pathtbl.c +2 -1
@@ -463,7 +463,7 @@ static void mesh_path_node_free(struct hlist_node *p, bool free_leafs)kfree (node); } -static void mesh_path_node_copy (struct hlist_node *p,struct mesh_table *newtbl) +static int mesh_path_node_copy (struct hlist_node *p,struct mesh_table *newtbl) {struct mesh_path *mpath;struct mpath_node *node, *new_node;
@@ -476,6 +476,7 @@ static void mesh_path_node_copy(struct hlist_node *p, struct mesh_table *newtbl) hash_idx =mesh_table_hash (mpath->dst, mpath->dev, newtbl);hlist_add_head (&new_node->list, &newtbl->hash_buckets[hash_idx]); +return 0 ; }int mesh_pathtbl_init (void )
Signature · 6 lines
1.5.3.4 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html