From: Heinz Mauelshagen <heinzm@xxxxxxxxxx> 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@xxxxxxxxxx> Signed-off-by: Mike Snitzer <snitzer@xxxxxxxxxx> Cc: stable@xxxxxxxxxxxxxxx # v3.9+ --- drivers/md/dm-cache-policy-mq.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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; } -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel