From 8b9b9223449f21c2a604866ae1b25108f1a37ea2 Mon Sep 17 00:00:00 2001 From: Tom Marshall Date: Thu, 14 Nov 2019 19:59:40 +0100 Subject: [PATCH] Handle various open failures better --- dm-compress/lbatview.c | 17 ++++++++++------- dm-compress/lbd.c | 39 +++++++++++++++++++++++++-------------- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/dm-compress/lbatview.c b/dm-compress/lbatview.c index fc64cf7..b9552d1 100644 --- a/dm-compress/lbatview.c +++ b/dm-compress/lbatview.c @@ -527,13 +527,16 @@ lbatviewcache_dtr(struct lbatviewcache* lvc) kfree(lvc->cache); lvc->cache = NULL; lvc->cache_len = 0; - INIT_LIST_HEAD(&lvc->cache_head); - lbatpblkcache_dtr(lvc->lpc); - kfree(lvc->lpc); - lvc->lpc = NULL; - pbatcache_dtr(lvc->pc); - kfree(lvc->pc); - lvc->pc = NULL; + if (lvc->lpc) { + lbatpblkcache_dtr(lvc->lpc); + kfree(lvc->lpc); + lvc->lpc = NULL; + } + if (lvc->pc) { + pbatcache_dtr(lvc->pc); + kfree(lvc->pc); + lvc->pc = NULL; + } lvc->params = NULL; } diff --git a/dm-compress/lbd.c b/dm-compress/lbd.c index 98252a2..3891b33 100644 --- a/dm-compress/lbd.c +++ b/dm-compress/lbd.c @@ -640,6 +640,10 @@ lbdcache_ctr(struct lbdcache* lc, lc->params = &kparams->params; lc->sync = sync; lc->percpu = alloc_percpu(void*); + if (!lc->percpu) { + printk(KERN_ERR "%s: Out of memory\n", __func__); + return false; + } for (cpu = 0; cpu < num_online_cpus(); ++cpu) { if (!lbdcache_alloc_compress_state(lc->percpu, lc->params, cpu)) { return false; @@ -689,12 +693,16 @@ lbdcache_dtr(struct lbdcache* lc) struct lbd* lbd; int cpu; - cancel_delayed_work_sync(&lc->flush_dwork); - flush_delayed_work(&lc->flush_dwork); - list_for_each_entry(lbd, &lc->flush_head, flush_list) { - ret = lbd_flush(lbd); - if (ret) { - printk(KERN_ERR "%s: lbd_flush failed\n", __func__); + if (lc->flush_dwork.work.func) { + cancel_delayed_work_sync(&lc->flush_dwork); + flush_delayed_work(&lc->flush_dwork); + } + if (lc->flush_head.next) { + list_for_each_entry(lbd, &lc->flush_head, flush_list) { + ret = lbd_flush(lbd); + if (ret) { + printk(KERN_ERR "%s: lbd_flush failed\n", __func__); + } } } for (n = 0; n < lc->cache_len; ++n) { @@ -710,15 +718,18 @@ lbdcache_dtr(struct lbdcache* lc) kfree(lc->cache); lc->cache = NULL; lc->cache_len = 0; - INIT_LIST_HEAD(&lc->cache_head); - lbatviewcache_dtr(lc->lvc); - kfree(lc->lvc); - lc->lvc = NULL; - for (cpu = 0; cpu < num_online_cpus(); ++cpu) { - lbdcache_free_compress_state(lc->percpu, lc->params, cpu); + if (lc->lvc) { + lbatviewcache_dtr(lc->lvc); + kfree(lc->lvc); + lc->lvc = NULL; + } + if (lc->percpu) { + for (cpu = 0; cpu < num_online_cpus(); ++cpu) { + lbdcache_free_compress_state(lc->percpu, lc->params, cpu); + } + free_percpu(lc->percpu); + lc->percpu = NULL; } - free_percpu(lc->percpu); - lc->percpu = NULL; lc->params = NULL; }