The memory allocated by discover_arenas() or create_arenas() is not
freed in some of the error paths in btt_init(). Fix that by calling
free_arenas() on the error paths.

Fixes: 5212e11fde4d ("nd_btt: atomic sector updates")
Cc: [email protected]
Signed-off-by: Abdun Nihaal <[email protected]>
---
 drivers/nvdimm/btt.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c
index e0b6a85a8124..7e1112960d7f 100644
--- a/drivers/nvdimm/btt.c
+++ b/drivers/nvdimm/btt.c
@@ -1592,7 +1592,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 err;
        } else if (btt->init_state != INIT_READY) {
                btt->num_arenas = (rawsize / ARENA_MAX_SIZE) +
                        ((rawsize % ARENA_MAX_SIZE) ? 1 : 0);
@@ -1602,25 +1602,28 @@ 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 err;
                }
 
                ret = btt_meta_init(btt);
                if (ret) {
                        dev_err(dev, "init: error in meta_init: %d\n", ret);
-                       return NULL;
+                       goto err;
                }
        }
 
        ret = btt_blk_init(btt);
        if (ret) {
                dev_err(dev, "init: error in blk_init: %d\n", ret);
-               return NULL;
+               goto err;
        }
 
        btt_debugfs_init(btt);
 
        return btt;
+err:
+       free_arenas(btt);
+       return NULL;
 }
 
 /**

-- 
2.43.0


Reply via email to