mirror of
https://github.com/torvalds/linux.git
synced 2024-12-01 00:21:32 +00:00
RDMA/rtrs-srv: Replace device_register with device_initialize and device_add
There are error cases when we will call free_srv before device kobject is
initialized; in such cases calling put_device generates the following
warning:
kobject: '(null)' (000000009f5445ed): is not initialized, yet
kobject_put() is being called.
So call device_initialize() only once when the server is allocated. If we
end up calling put_srv() and subsequently free_srv(), our call to
put_device() would result in deletion of the obj. Call device_add() later
when we actually have a connection. Correspondingly, call device_del()
instead of device_unregister() when srv->dev_ref falls to 0.
Fixes: 9cb8374804
("RDMA/rtrs: server: main functionality")
Link: https://lore.kernel.org/r/20200811092722.2450-1-haris.iqbal@cloud.ionos.com
Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@cloud.ionos.com>
Reviewed-by: Jack Wang <jinpu.wang@cloud.ionos.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
d012a7190f
commit
baa5b28b7a
@ -182,16 +182,16 @@ static int rtrs_srv_create_once_sysfs_root_folders(struct rtrs_srv_sess *sess)
|
|||||||
* sysfs files are created
|
* sysfs files are created
|
||||||
*/
|
*/
|
||||||
dev_set_uevent_suppress(&srv->dev, true);
|
dev_set_uevent_suppress(&srv->dev, true);
|
||||||
err = device_register(&srv->dev);
|
err = device_add(&srv->dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
pr_err("device_register(): %d\n", err);
|
pr_err("device_add(): %d\n", err);
|
||||||
goto put;
|
goto put;
|
||||||
}
|
}
|
||||||
srv->kobj_paths = kobject_create_and_add("paths", &srv->dev.kobj);
|
srv->kobj_paths = kobject_create_and_add("paths", &srv->dev.kobj);
|
||||||
if (!srv->kobj_paths) {
|
if (!srv->kobj_paths) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
pr_err("kobject_create_and_add(): %d\n", err);
|
pr_err("kobject_create_and_add(): %d\n", err);
|
||||||
device_unregister(&srv->dev);
|
device_del(&srv->dev);
|
||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
dev_set_uevent_suppress(&srv->dev, false);
|
dev_set_uevent_suppress(&srv->dev, false);
|
||||||
@ -216,7 +216,7 @@ rtrs_srv_destroy_once_sysfs_root_folders(struct rtrs_srv_sess *sess)
|
|||||||
kobject_del(srv->kobj_paths);
|
kobject_del(srv->kobj_paths);
|
||||||
kobject_put(srv->kobj_paths);
|
kobject_put(srv->kobj_paths);
|
||||||
mutex_unlock(&srv->paths_mutex);
|
mutex_unlock(&srv->paths_mutex);
|
||||||
device_unregister(&srv->dev);
|
device_del(&srv->dev);
|
||||||
} else {
|
} else {
|
||||||
mutex_unlock(&srv->paths_mutex);
|
mutex_unlock(&srv->paths_mutex);
|
||||||
}
|
}
|
||||||
|
@ -1336,6 +1336,7 @@ static struct rtrs_srv *__alloc_srv(struct rtrs_srv_ctx *ctx,
|
|||||||
uuid_copy(&srv->paths_uuid, paths_uuid);
|
uuid_copy(&srv->paths_uuid, paths_uuid);
|
||||||
srv->queue_depth = sess_queue_depth;
|
srv->queue_depth = sess_queue_depth;
|
||||||
srv->ctx = ctx;
|
srv->ctx = ctx;
|
||||||
|
device_initialize(&srv->dev);
|
||||||
|
|
||||||
srv->chunks = kcalloc(srv->queue_depth, sizeof(*srv->chunks),
|
srv->chunks = kcalloc(srv->queue_depth, sizeof(*srv->chunks),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
Loading…
Reference in New Issue
Block a user