remoteproc: core: Cleanup device in case of failure
authorSiddharth Gupta <sidgup@codeaurora.org>
Tue, 15 Jun 2021 02:21:11 +0000 (19:21 -0700)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Wed, 23 Jun 2021 18:42:31 +0000 (13:42 -0500)
When a failure occurs in rproc_add() it returns an error, but does
not cleanup after itself. This change adds the failure path in such
cases.

Signed-off-by: Siddharth Gupta <sidgup@codeaurora.org>
Link: https://lore.kernel.org/r/1623723671-5517-5-git-send-email-sidgup@codeaurora.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
drivers/remoteproc/remoteproc_core.c

index b874280..d823f70 100644 (file)
@@ -2343,8 +2343,10 @@ int rproc_add(struct rproc *rproc)
                return ret;
 
        ret = device_add(dev);
-       if (ret < 0)
-               return ret;
+       if (ret < 0) {
+               put_device(dev);
+               goto rproc_remove_cdev;
+       }
 
        dev_info(dev, "%s is available\n", rproc->name);
 
@@ -2355,7 +2357,7 @@ int rproc_add(struct rproc *rproc)
        if (rproc->auto_boot) {
                ret = rproc_trigger_auto_boot(rproc);
                if (ret < 0)
-                       return ret;
+                       goto rproc_remove_dev;
        }
 
        /* expose to rproc_get_by_phandle users */
@@ -2364,6 +2366,13 @@ int rproc_add(struct rproc *rproc)
        mutex_unlock(&rproc_list_mutex);
 
        return 0;
+
+rproc_remove_dev:
+       rproc_delete_debug_dir(rproc);
+       device_del(dev);
+rproc_remove_cdev:
+       rproc_char_device_remove(rproc);
+       return ret;
 }
 EXPORT_SYMBOL(rproc_add);