mirror of https://gitee.com/openkylin/linux.git
fsi: Don't use device_unregister() in fsi_master_register()
In the error path of fsi_master_register(), we currently use device_unregister(). This will cause the last reference to the structure to be dropped, thus freeing the enclosing structure, which isn't what the callers want. Use device_del() instead so that we return to the caller with a refcount of 1. The caller can then assume that it must use put_device() after a call to fsi_master_register() regardless of whether the latter suceeded or failed. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
55382d301f
commit
265aac26bc
|
@ -977,9 +977,6 @@ int fsi_master_register(struct fsi_master *master)
|
|||
int rc;
|
||||
struct device_node *np;
|
||||
|
||||
if (!master)
|
||||
return -EINVAL;
|
||||
|
||||
master->idx = ida_simple_get(&master_ida, 0, INT_MAX, GFP_KERNEL);
|
||||
dev_set_name(&master->dev, "fsi%d", master->idx);
|
||||
|
||||
|
@ -991,14 +988,14 @@ int fsi_master_register(struct fsi_master *master)
|
|||
|
||||
rc = device_create_file(&master->dev, &dev_attr_rescan);
|
||||
if (rc) {
|
||||
device_unregister(&master->dev);
|
||||
device_del(&master->dev);
|
||||
ida_simple_remove(&master_ida, master->idx);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = device_create_file(&master->dev, &dev_attr_break);
|
||||
if (rc) {
|
||||
device_unregister(&master->dev);
|
||||
device_del(&master->dev);
|
||||
ida_simple_remove(&master_ida, master->idx);
|
||||
return rc;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue