From: Zhou Guanghui <[email protected]>

[ Upstream commit f014165faa7b953b81dcbf18835936e5f8d01f2a ]

If device_register() returns error, the name allocated by the
dev_set_name() need be freed. As described in the comment of
device_register(), we should use put_device() to give up the reference in
the error path.

Fix this by calling put_device(), the name will be freed in the
kobject_cleanup(), and this patch modified resources will be released by
calling the corresponding callback function in the device_release().

Signed-off-by: Zhou Guanghui <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Reviewed-by: Mike Christie <[email protected]>
Signed-off-by: Martin K. Petersen <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
---
 drivers/scsi/scsi_transport_iscsi.c | 31 +++++++++++++++--------------
 1 file changed, 16 insertions(+), 15 deletions(-)

diff --git a/drivers/scsi/scsi_transport_iscsi.c 
b/drivers/scsi/scsi_transport_iscsi.c
index cd3db9684e52..f473c002fa4d 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -231,7 +231,7 @@ iscsi_create_endpoint(int dd_size)
        dev_set_name(&ep->dev, "ep-%d", id);
        err = device_register(&ep->dev);
         if (err)
-               goto free_id;
+               goto put_dev;
 
        err = sysfs_create_group(&ep->dev.kobj, &iscsi_endpoint_group);
        if (err)
@@ -245,10 +245,12 @@ iscsi_create_endpoint(int dd_size)
        device_unregister(&ep->dev);
        return NULL;
 
-free_id:
+put_dev:
        mutex_lock(&iscsi_ep_idr_mutex);
        idr_remove(&iscsi_ep_idr, id);
        mutex_unlock(&iscsi_ep_idr_mutex);
+       put_device(&ep->dev);
+       return NULL;
 free_ep:
        kfree(ep);
        return NULL;
@@ -766,7 +768,7 @@ iscsi_create_iface(struct Scsi_Host *shost, struct 
iscsi_transport *transport,
 
        err = device_register(&iface->dev);
        if (err)
-               goto free_iface;
+               goto put_dev;
 
        err = sysfs_create_group(&iface->dev.kobj, &iscsi_iface_group);
        if (err)
@@ -780,9 +782,8 @@ iscsi_create_iface(struct Scsi_Host *shost, struct 
iscsi_transport *transport,
        device_unregister(&iface->dev);
        return NULL;
 
-free_iface:
-       put_device(iface->dev.parent);
-       kfree(iface);
+put_dev:
+       put_device(&iface->dev);
        return NULL;
 }
 EXPORT_SYMBOL_GPL(iscsi_create_iface);
@@ -1251,15 +1252,15 @@ iscsi_create_flashnode_sess(struct Scsi_Host *shost, 
int index,
 
        err = device_register(&fnode_sess->dev);
        if (err)
-               goto free_fnode_sess;
+               goto put_dev;
 
        if (dd_size)
                fnode_sess->dd_data = &fnode_sess[1];
 
        return fnode_sess;
 
-free_fnode_sess:
-       kfree(fnode_sess);
+put_dev:
+       put_device(&fnode_sess->dev);
        return NULL;
 }
 EXPORT_SYMBOL_GPL(iscsi_create_flashnode_sess);
@@ -1299,15 +1300,15 @@ iscsi_create_flashnode_conn(struct Scsi_Host *shost,
 
        err = device_register(&fnode_conn->dev);
        if (err)
-               goto free_fnode_conn;
+               goto put_dev;
 
        if (dd_size)
                fnode_conn->dd_data = &fnode_conn[1];
 
        return fnode_conn;
 
-free_fnode_conn:
-       kfree(fnode_conn);
+put_dev:
+       put_device(&fnode_conn->dev);
        return NULL;
 }
 EXPORT_SYMBOL_GPL(iscsi_create_flashnode_conn);
@@ -4815,7 +4816,7 @@ iscsi_register_transport(struct iscsi_transport *tt)
        dev_set_name(&priv->dev, "%s", tt->name);
        err = device_register(&priv->dev);
        if (err)
-               goto free_priv;
+               goto put_dev;
 
        err = sysfs_create_group(&priv->dev.kobj, &iscsi_transport_group);
        if (err)
@@ -4850,8 +4851,8 @@ iscsi_register_transport(struct iscsi_transport *tt)
 unregister_dev:
        device_unregister(&priv->dev);
        return NULL;
-free_priv:
-       kfree(priv);
+put_dev:
+       put_device(&priv->dev);
        return NULL;
 }
 EXPORT_SYMBOL_GPL(iscsi_register_transport);
-- 
2.35.1

-- 
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/open-iscsi/20221123124057.264822-41-sashal%40kernel.org.

Reply via email to