[S390] proper use of device register
Don't use kfree directly after device registration started. Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
committed by
Martin Schwidefsky
parent
c48ff644f2
commit
c630493327
@@ -1006,7 +1006,7 @@ static int __init hvc_iucv_alloc(int id, unsigned int is_console)
|
|||||||
priv->dev->release = (void (*)(struct device *)) kfree;
|
priv->dev->release = (void (*)(struct device *)) kfree;
|
||||||
rc = device_register(priv->dev);
|
rc = device_register(priv->dev);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
kfree(priv->dev);
|
put_device(priv->dev);
|
||||||
goto out_error_dev;
|
goto out_error_dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -581,7 +581,7 @@ static int __init mon_init(void)
|
|||||||
monreader_device->release = (void (*)(struct device *))kfree;
|
monreader_device->release = (void (*)(struct device *))kfree;
|
||||||
rc = device_register(monreader_device);
|
rc = device_register(monreader_device);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
kfree(monreader_device);
|
put_device(monreader_device);
|
||||||
goto out_driver;
|
goto out_driver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -765,8 +765,10 @@ static int vmlogrdr_register_device(struct vmlogrdr_priv_t *priv)
|
|||||||
} else
|
} else
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
ret = device_register(dev);
|
ret = device_register(dev);
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
put_device(dev);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ret = sysfs_create_group(&dev->kobj, &vmlogrdr_attr_group);
|
ret = sysfs_create_group(&dev->kobj, &vmlogrdr_attr_group);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@@ -417,7 +417,8 @@ int chp_new(struct chp_id chpid)
|
|||||||
if (ret) {
|
if (ret) {
|
||||||
CIO_MSG_EVENT(0, "Could not register chp%x.%02x: %d\n",
|
CIO_MSG_EVENT(0, "Could not register chp%x.%02x: %d\n",
|
||||||
chpid.cssid, chpid.id, ret);
|
chpid.cssid, chpid.id, ret);
|
||||||
goto out_free;
|
put_device(&chp->dev);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
ret = sysfs_create_group(&chp->dev.kobj, &chp_attr_group);
|
ret = sysfs_create_group(&chp->dev.kobj, &chp_attr_group);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@@ -151,18 +151,6 @@ css_alloc_subchannel(struct subchannel_id schid)
|
|||||||
return sch;
|
return sch;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
css_free_subchannel(struct subchannel *sch)
|
|
||||||
{
|
|
||||||
if (sch) {
|
|
||||||
/* Reset intparm to zeroes. */
|
|
||||||
sch->config.intparm = 0;
|
|
||||||
cio_commit_config(sch);
|
|
||||||
kfree(sch->lock);
|
|
||||||
kfree(sch);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
css_subchannel_release(struct device *dev)
|
css_subchannel_release(struct device *dev)
|
||||||
{
|
{
|
||||||
@@ -332,7 +320,7 @@ int css_probe_device(struct subchannel_id schid)
|
|||||||
return PTR_ERR(sch);
|
return PTR_ERR(sch);
|
||||||
ret = css_register_subchannel(sch);
|
ret = css_register_subchannel(sch);
|
||||||
if (ret)
|
if (ret)
|
||||||
css_free_subchannel(sch);
|
put_device(&sch->dev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -649,7 +637,10 @@ __init_channel_subsystem(struct subchannel_id schid, void *data)
|
|||||||
* not working) so we do it now. This is true e.g. for the
|
* not working) so we do it now. This is true e.g. for the
|
||||||
* console subchannel.
|
* console subchannel.
|
||||||
*/
|
*/
|
||||||
css_register_subchannel(sch);
|
if (css_register_subchannel(sch)) {
|
||||||
|
if (!cio_is_console(schid))
|
||||||
|
put_device(&sch->dev);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -925,8 +916,10 @@ init_channel_subsystem (void)
|
|||||||
goto out_device;
|
goto out_device;
|
||||||
}
|
}
|
||||||
ret = device_register(&css->pseudo_subchannel->dev);
|
ret = device_register(&css->pseudo_subchannel->dev);
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
put_device(&css->pseudo_subchannel->dev);
|
||||||
goto out_file;
|
goto out_file;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ret = register_reboot_notifier(&css_reboot_notifier);
|
ret = register_reboot_notifier(&css_reboot_notifier);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@@ -1114,7 +1114,7 @@ static void ap_scan_bus(struct work_struct *unused)
|
|||||||
ap_dev->device.release = ap_device_release;
|
ap_dev->device.release = ap_device_release;
|
||||||
rc = device_register(&ap_dev->device);
|
rc = device_register(&ap_dev->device);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
kfree(ap_dev);
|
put_device(&ap_dev->device);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* Add device attributes. */
|
/* Add device attributes. */
|
||||||
|
@@ -1839,9 +1839,10 @@ static int netiucv_register_device(struct net_device *ndev)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
ret = device_register(dev);
|
ret = device_register(dev);
|
||||||
|
if (ret) {
|
||||||
if (ret)
|
put_device(dev);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
ret = netiucv_add_files(dev);
|
ret = netiucv_add_files(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_unreg;
|
goto out_unreg;
|
||||||
@@ -2226,8 +2227,10 @@ static int __init netiucv_init(void)
|
|||||||
netiucv_dev->release = (void (*)(struct device *))kfree;
|
netiucv_dev->release = (void (*)(struct device *))kfree;
|
||||||
netiucv_dev->driver = &netiucv_driver;
|
netiucv_dev->driver = &netiucv_driver;
|
||||||
rc = device_register(netiucv_dev);
|
rc = device_register(netiucv_dev);
|
||||||
if (rc)
|
if (rc) {
|
||||||
|
put_device(netiucv_dev);
|
||||||
goto out_driver;
|
goto out_driver;
|
||||||
|
}
|
||||||
netiucv_banner();
|
netiucv_banner();
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
@@ -219,13 +219,13 @@ static int __init smsg_init(void)
|
|||||||
smsg_dev->driver = &smsg_driver;
|
smsg_dev->driver = &smsg_driver;
|
||||||
rc = device_register(smsg_dev);
|
rc = device_register(smsg_dev);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out_free_dev;
|
goto out_put;
|
||||||
|
|
||||||
cpcmd("SET SMSG IUCV", NULL, 0, NULL);
|
cpcmd("SET SMSG IUCV", NULL, 0, NULL);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_free_dev:
|
out_put:
|
||||||
kfree(smsg_dev);
|
put_device(smsg_dev);
|
||||||
out_free_path:
|
out_free_path:
|
||||||
iucv_path_free(smsg_path);
|
iucv_path_free(smsg_path);
|
||||||
smsg_path = NULL;
|
smsg_path = NULL;
|
||||||
|
Reference in New Issue
Block a user