[dm-devel] [PATCH 06/24 v2] dm cache policy mq: return NULL from alloc_entry if cache is full
Mike Snitzer
snitzer at redhat.com
Tue Oct 29 14:49:44 UTC 2013
From: Heinz Mauelshagen <heinzm at 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 at redhat.com>
Signed-off-by: Mike Snitzer <snitzer at redhat.com>
Cc: stable at vger.kernel.org # 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;
}
More information about the dm-devel
mailing list