|
@@ -1041,12 +1041,24 @@ out:
|
|
|
static int
|
|
|
mtype_head(struct ip_set *set, struct sk_buff *skb)
|
|
|
{
|
|
|
- const struct htype *h = set->data;
|
|
|
+ struct htype *h = set->data;
|
|
|
const struct htable *t;
|
|
|
struct nlattr *nested;
|
|
|
size_t memsize;
|
|
|
u8 htable_bits;
|
|
|
|
|
|
+ /* If any members have expired, set->elements will be wrong
|
|
|
+ * mytype_expire function will update it with the right count.
|
|
|
+ * we do not hold set->lock here, so grab it first.
|
|
|
+ * set->elements can still be incorrect in the case of a huge set,
|
|
|
+ * because elements might time out during the listing.
|
|
|
+ */
|
|
|
+ if (SET_WITH_TIMEOUT(set)) {
|
|
|
+ spin_lock_bh(&set->lock);
|
|
|
+ mtype_expire(set, h);
|
|
|
+ spin_unlock_bh(&set->lock);
|
|
|
+ }
|
|
|
+
|
|
|
rcu_read_lock_bh();
|
|
|
t = rcu_dereference_bh_nfnl(h->table);
|
|
|
memsize = mtype_ahash_memsize(h, t) + set->ext_size;
|