If we dynamically reduce the data entry limit, it's not enough to
drop one entry when we add one. In that case, drop two everytime
we add one. Then we'll eventually get smoothly down to the specified
limit.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
if (i->parent->per_label_limit != -1 &&
i->value_count > i->parent->per_label_limit) {
- x = i->values;
- i->values = i->values->next;
- free(x->value);
- free(x);
- i->value_count--;
+ int to_drop = 1;
+
+ /*
+ * If the limit was dynamically reduced, making us more
+ * than 1 entry ahead after adding this one, drop two
+ * entries. This will make us (eventually) reach the
+ * specified limit.
+ */
+ if (i->value_count - i->parent->per_label_limit >= 2)
+ to_drop = 2;
+
+ while (to_drop--) {
+ x = i->values;
+ i->values = i->values->next;
+ free(x->value);
+ free(x);
+ i->value_count--;
+ }
}
}