提交 b83d7cbe 编写于 作者: G Guoqing Jiang 提交者: Zheng Zengkai

RDMA/rtrs-clt: Refactor the failure cases in alloc_clt

stable inclusion
from stable-5.10.20
commit cb6d98b306556e7adc06099977953d7e0b4e2660
bugzilla: 50608

--------------------------------

[ Upstream commit eab09824 ]

Make all failure cases go to the common path to avoid duplicate code.
And some issued existed before.

1. clt need to be freed to avoid memory leak.

2. return ERR_PTR(-ENOMEM) if kobject_create_and_add fails, because
   rtrs_clt_open checks the return value of by call "IS_ERR(clt)".

Fixes: 6a98d71d ("RDMA/rtrs: client: main functionality")
Link: https://lore.kernel.org/r/20201217141915.56989-15-jinpu.wang@cloud.ionos.comSigned-off-by: NGuoqing Jiang <guoqing.jiang@cloud.ionos.com>
Reviewed-by: NMd Haris Iqbal <haris.iqbal@cloud.ionos.com>
Signed-off-by: NJack Wang <jinpu.wang@cloud.ionos.com>
Signed-off-by: NJason Gunthorpe <jgg@nvidia.com>
Signed-off-by: NSasha Levin <sashal@kernel.org>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Acked-by: NXie XiuQi <xiexiuqi@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 d119b89c
......@@ -2576,11 +2576,8 @@ static struct rtrs_clt *alloc_clt(const char *sessname, size_t paths_num,
clt->dev.class = rtrs_clt_dev_class;
clt->dev.release = rtrs_clt_dev_release;
err = dev_set_name(&clt->dev, "%s", sessname);
if (err) {
free_percpu(clt->pcpu_path);
kfree(clt);
return ERR_PTR(err);
}
if (err)
goto err;
/*
* Suppress user space notification until
* sysfs files are created
......@@ -2588,29 +2585,31 @@ static struct rtrs_clt *alloc_clt(const char *sessname, size_t paths_num,
dev_set_uevent_suppress(&clt->dev, true);
err = device_register(&clt->dev);
if (err) {
free_percpu(clt->pcpu_path);
put_device(&clt->dev);
return ERR_PTR(err);
goto err;
}
clt->kobj_paths = kobject_create_and_add("paths", &clt->dev.kobj);
if (!clt->kobj_paths) {
free_percpu(clt->pcpu_path);
device_unregister(&clt->dev);
return NULL;
err = -ENOMEM;
goto err_dev;
}
err = rtrs_clt_create_sysfs_root_files(clt);
if (err) {
free_percpu(clt->pcpu_path);
kobject_del(clt->kobj_paths);
kobject_put(clt->kobj_paths);
device_unregister(&clt->dev);
return ERR_PTR(err);
goto err_dev;
}
dev_set_uevent_suppress(&clt->dev, false);
kobject_uevent(&clt->dev.kobj, KOBJ_ADD);
return clt;
err_dev:
device_unregister(&clt->dev);
err:
free_percpu(clt->pcpu_path);
kfree(clt);
return ERR_PTR(err);
}
static void wait_for_inflight_permits(struct rtrs_clt *clt)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册