Call free_arenas() to release the arena instances in btt->arena_list
in the error paths.

Signed-off-by: Li Zhijian <lizhij...@fujitsu.com>
---
 drivers/nvdimm/btt.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index a11e4e7e9a52..a85448273a9a 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1597,7 +1597,7 @@ static struct btt *btt_init(struct nd_btt *nd_btt, 
unsigned long long rawsize,
        if (btt->init_state != INIT_READY && nd_region->ro) {
                dev_warn(dev, "%s is read-only, unable to init btt metadata\n",
                                dev_name(&nd_region->dev));
-               return NULL;
+               goto out;
        } else if (btt->init_state != INIT_READY) {
                btt->num_arenas = (rawsize / ARENA_MAX_SIZE) +
                        ((rawsize % ARENA_MAX_SIZE) ? 1 : 0);
@@ -1607,25 +1607,29 @@ static struct btt *btt_init(struct nd_btt *nd_btt, 
unsigned long long rawsize,
                ret = create_arenas(btt);
                if (ret) {
                        dev_info(dev, "init: create_arenas: %d\n", ret);
-                       return NULL;
+                       goto out;
                }
 
                ret = btt_meta_init(btt);
                if (ret) {
                        dev_err(dev, "init: error in meta_init: %d\n", ret);
-                       return NULL;
+                       goto out;
                }
        }
 
        ret = btt_blk_init(btt);
        if (ret) {
                dev_err(dev, "init: error in blk_init: %d\n", ret);
-               return NULL;
+               goto out;
        }
 
        btt_debugfs_init(btt);
 
        return btt;
+
+out:
+       free_arenas(btt);
+       return NULL;
 }
 
 /**
-- 
2.47.0


Reply via email to