|
@@ -148,9 +148,7 @@ __list_set_del_rcu(struct rcu_head * rcu)
|
|
|
{
|
|
|
struct set_elem *e = container_of(rcu, struct set_elem, rcu);
|
|
|
struct ip_set *set = e->set;
|
|
|
- struct list_set *map = set->data;
|
|
|
|
|
|
- ip_set_put_byindex(map->net, e->id);
|
|
|
ip_set_ext_destroy(set, e);
|
|
|
kfree(e);
|
|
|
}
|
|
@@ -158,15 +156,21 @@ __list_set_del_rcu(struct rcu_head * rcu)
|
|
|
static inline void
|
|
|
list_set_del(struct ip_set *set, struct set_elem *e)
|
|
|
{
|
|
|
+ struct list_set *map = set->data;
|
|
|
+
|
|
|
set->elements--;
|
|
|
list_del_rcu(&e->list);
|
|
|
+ ip_set_put_byindex(map->net, e->id);
|
|
|
call_rcu(&e->rcu, __list_set_del_rcu);
|
|
|
}
|
|
|
|
|
|
static inline void
|
|
|
-list_set_replace(struct set_elem *e, struct set_elem *old)
|
|
|
+list_set_replace(struct ip_set *set, struct set_elem *e, struct set_elem *old)
|
|
|
{
|
|
|
+ struct list_set *map = set->data;
|
|
|
+
|
|
|
list_replace_rcu(&old->list, &e->list);
|
|
|
+ ip_set_put_byindex(map->net, old->id);
|
|
|
call_rcu(&old->rcu, __list_set_del_rcu);
|
|
|
}
|
|
|
|
|
@@ -298,7 +302,7 @@ list_set_uadd(struct ip_set *set, void *value, const struct ip_set_ext *ext,
|
|
|
INIT_LIST_HEAD(&e->list);
|
|
|
list_set_init_extensions(set, ext, e);
|
|
|
if (n)
|
|
|
- list_set_replace(e, n);
|
|
|
+ list_set_replace(set, e, n);
|
|
|
else if (next)
|
|
|
list_add_tail_rcu(&e->list, &next->list);
|
|
|
else if (prev)
|
|
@@ -486,6 +490,7 @@ list_set_list(const struct ip_set *set,
|
|
|
const struct list_set *map = set->data;
|
|
|
struct nlattr *atd, *nested;
|
|
|
u32 i = 0, first = cb->args[IPSET_CB_ARG0];
|
|
|
+ char name[IPSET_MAXNAMELEN];
|
|
|
struct set_elem *e;
|
|
|
int ret = 0;
|
|
|
|
|
@@ -504,8 +509,8 @@ list_set_list(const struct ip_set *set,
|
|
|
nested = ipset_nest_start(skb, IPSET_ATTR_DATA);
|
|
|
if (!nested)
|
|
|
goto nla_put_failure;
|
|
|
- if (nla_put_string(skb, IPSET_ATTR_NAME,
|
|
|
- ip_set_name_byindex(map->net, e->id)))
|
|
|
+ ip_set_name_byindex(map->net, e->id, name);
|
|
|
+ if (nla_put_string(skb, IPSET_ATTR_NAME, name))
|
|
|
goto nla_put_failure;
|
|
|
if (ip_set_put_extensions(skb, set, e, true))
|
|
|
goto nla_put_failure;
|