scsi: fcoe: Fix possible name leak when device_register() fails
[platform/kernel/linux-starfive.git] / drivers / scsi / fcoe / fcoe_sysfs.c
index af658aa..6260aa5 100644 (file)
@@ -830,14 +830,15 @@ struct fcoe_ctlr_device *fcoe_ctlr_device_add(struct device *parent,
 
        dev_set_name(&ctlr->dev, "ctlr_%d", ctlr->id);
        error = device_register(&ctlr->dev);
-       if (error)
-               goto out_del_q2;
+       if (error) {
+               destroy_workqueue(ctlr->devloss_work_q);
+               destroy_workqueue(ctlr->work_q);
+               put_device(&ctlr->dev);
+               return NULL;
+       }
 
        return ctlr;
 
-out_del_q2:
-       destroy_workqueue(ctlr->devloss_work_q);
-       ctlr->devloss_work_q = NULL;
 out_del_q:
        destroy_workqueue(ctlr->work_q);
        ctlr->work_q = NULL;
@@ -1036,16 +1037,16 @@ struct fcoe_fcf_device *fcoe_fcf_device_add(struct fcoe_ctlr_device *ctlr,
        fcf->selected = new_fcf->selected;
 
        error = device_register(&fcf->dev);
-       if (error)
-               goto out_del;
+       if (error) {
+               put_device(&fcf->dev);
+               goto out;
+       }
 
        fcf->state = FCOE_FCF_STATE_CONNECTED;
        list_add_tail(&fcf->peers, &ctlr->fcfs);
 
        return fcf;
 
-out_del:
-       kfree(fcf);
 out:
        return NULL;
 }