diff mbox

[06/24,v2] dm cache policy mq: return NULL from alloc_entry if cache is full

Message ID 20131029144943.GA15641@redhat.com (mailing list archive)
State Deferred, archived
Delegated to: Mike Snitzer
Headers show

Commit Message

Mike Snitzer Oct. 29, 2013, 2:49 p.m. UTC
From: Heinz Mauelshagen <heinzm@redhat.com>

alloc_entry() must return NULL if the cache is full (mq->free list is
empty).  To be clear, it is not a bug if the alloc_entry() logic tries
to alloc from the free list before it falls back to pop from pre cache.
The free list is simply a resource priority list that alloc_entry()
tries to claim a block from but sometimes cannot (e.g. cache is full).

This fix addresses callers' (insert_in*cache()) requirement that
alloc_entry() return NULL when an entry isn't able to be allocated.

Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Cc: stable@vger.kernel.org # v3.9+
---
 drivers/md/dm-cache-policy-mq.c |   12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)


--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
diff mbox

Patch

Index: linux/drivers/md/dm-cache-policy-mq.c
===================================================================
--- linux.orig/drivers/md/dm-cache-policy-mq.c
+++ linux/drivers/md/dm-cache-policy-mq.c
@@ -415,18 +415,20 @@  static void hash_remove(struct entry *e)
  */
 static struct entry *alloc_entry(struct mq_policy *mq)
 {
-	struct entry *e;
+	struct entry *e = NULL;
 
 	if (mq->nr_entries_allocated >= mq->nr_entries) {
 		BUG_ON(!list_empty(&mq->free));
 		return NULL;
 	}
 
-	e = list_entry(list_pop(&mq->free), struct entry, list);
-	INIT_LIST_HEAD(&e->list);
-	INIT_HLIST_NODE(&e->hlist);
+	if (!list_empty(&mq->free)) {
+		e = list_entry(list_pop(&mq->free), struct entry, list);
+		INIT_LIST_HEAD(&e->list);
+		INIT_HLIST_NODE(&e->hlist);
+		mq->nr_entries_allocated++;
+	}
 
-	mq->nr_entries_allocated++;
 	return e;
 }