Handle various open failures better

This commit is contained in:
Tom Marshall 2019-11-14 19:59:40 +01:00
parent c6fe92715c
commit 8b9b922344
2 changed files with 35 additions and 21 deletions

View File

@ -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;
}

View File

@ -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;
}