MINOR: lru: new function to delete <nb> least recently used keys

Introduction of a new function in the LRU cache source file.
Purpose of this function is to be used to delete a number of entries in
the cache. 'number' is defined by the caller and the key removed are
taken at the tail of the tree
diff --git a/include/import/lru.h b/include/import/lru.h
index 220cb17..7427fd6 100644
--- a/include/import/lru.h
+++ b/include/import/lru.h
@@ -72,3 +72,4 @@
 void lru64_commit(struct lru64 *elem, void *data, void *domain, unsigned long long revision, void (*free)(void *));
 struct lru64_head *lru64_new(int size);
 int lru64_destroy(struct lru64_head *lru);
+void lru64_kill_oldest(struct lru64_head *lru, unsigned long int nb);
diff --git a/src/lru.c b/src/lru.c
index 719fe07..84442a4 100644
--- a/src/lru.c
+++ b/src/lru.c
@@ -199,6 +199,31 @@
 	return 0;
 }
 
+/* kill the <nb> least used entries from the <lru> cache */
+void lru64_kill_oldest(struct lru64_head *lru, unsigned long int nb)
+{
+	struct lru64 *elem, *next;
+
+	for (elem = container_of(lru->list.p, typeof(*elem), lru);
+	     nb && (&elem->lru != &lru->list);
+	     elem = next) {
+		next = container_of(elem->lru.p, typeof(*next), lru);
+		if (!elem->domain)
+			continue; /* locked entry */
+
+		LIST_DEL(&elem->lru);
+		eb64_delete(&elem->node);
+		if (elem->data && elem->free)
+			elem->free(elem->data);
+		if (!lru->spare)
+			lru->spare = elem;
+		else
+			free(elem);
+		lru->cache_usage--;
+		nb--;
+	}
+}
+
 /* The code below is just for validation and performance testing. It's an
  * example of a function taking some time to return results that could be
  * cached.