Commit c6304933 authored by Sebastian Ott's avatar Sebastian Ott Committed by Martin Schwidefsky

[S390] proper use of device register

Don't use kfree directly after device registration started.
Signed-off-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent c48ff644
...@@ -1006,7 +1006,7 @@ static int __init hvc_iucv_alloc(int id, unsigned int is_console) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment