Handle various open failures better
This commit is contained in:
parent
c6fe92715c
commit
8b9b922344
|
@ -527,13 +527,16 @@ lbatviewcache_dtr(struct lbatviewcache* lvc)
|
||||||
kfree(lvc->cache);
|
kfree(lvc->cache);
|
||||||
lvc->cache = NULL;
|
lvc->cache = NULL;
|
||||||
lvc->cache_len = 0;
|
lvc->cache_len = 0;
|
||||||
INIT_LIST_HEAD(&lvc->cache_head);
|
if (lvc->lpc) {
|
||||||
lbatpblkcache_dtr(lvc->lpc);
|
lbatpblkcache_dtr(lvc->lpc);
|
||||||
kfree(lvc->lpc);
|
kfree(lvc->lpc);
|
||||||
lvc->lpc = NULL;
|
lvc->lpc = NULL;
|
||||||
pbatcache_dtr(lvc->pc);
|
}
|
||||||
kfree(lvc->pc);
|
if (lvc->pc) {
|
||||||
lvc->pc = NULL;
|
pbatcache_dtr(lvc->pc);
|
||||||
|
kfree(lvc->pc);
|
||||||
|
lvc->pc = NULL;
|
||||||
|
}
|
||||||
lvc->params = NULL;
|
lvc->params = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -640,6 +640,10 @@ lbdcache_ctr(struct lbdcache* lc,
|
||||||
lc->params = &kparams->params;
|
lc->params = &kparams->params;
|
||||||
lc->sync = sync;
|
lc->sync = sync;
|
||||||
lc->percpu = alloc_percpu(void*);
|
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) {
|
for (cpu = 0; cpu < num_online_cpus(); ++cpu) {
|
||||||
if (!lbdcache_alloc_compress_state(lc->percpu, lc->params, cpu)) {
|
if (!lbdcache_alloc_compress_state(lc->percpu, lc->params, cpu)) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -689,12 +693,16 @@ lbdcache_dtr(struct lbdcache* lc)
|
||||||
struct lbd* lbd;
|
struct lbd* lbd;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
cancel_delayed_work_sync(&lc->flush_dwork);
|
if (lc->flush_dwork.work.func) {
|
||||||
flush_delayed_work(&lc->flush_dwork);
|
cancel_delayed_work_sync(&lc->flush_dwork);
|
||||||
list_for_each_entry(lbd, &lc->flush_head, flush_list) {
|
flush_delayed_work(&lc->flush_dwork);
|
||||||
ret = lbd_flush(lbd);
|
}
|
||||||
if (ret) {
|
if (lc->flush_head.next) {
|
||||||
printk(KERN_ERR "%s: lbd_flush failed\n", __func__);
|
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) {
|
for (n = 0; n < lc->cache_len; ++n) {
|
||||||
|
@ -710,15 +718,18 @@ lbdcache_dtr(struct lbdcache* lc)
|
||||||
kfree(lc->cache);
|
kfree(lc->cache);
|
||||||
lc->cache = NULL;
|
lc->cache = NULL;
|
||||||
lc->cache_len = 0;
|
lc->cache_len = 0;
|
||||||
INIT_LIST_HEAD(&lc->cache_head);
|
if (lc->lvc) {
|
||||||
lbatviewcache_dtr(lc->lvc);
|
lbatviewcache_dtr(lc->lvc);
|
||||||
kfree(lc->lvc);
|
kfree(lc->lvc);
|
||||||
lc->lvc = NULL;
|
lc->lvc = NULL;
|
||||||
for (cpu = 0; cpu < num_online_cpus(); ++cpu) {
|
}
|
||||||
lbdcache_free_compress_state(lc->percpu, lc->params, cpu);
|
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;
|
lc->params = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue