tcm_fc: Do not free tpg structure during wq allocation failure
authorMark Rustad <mark.d.rustad@intel.com>
Tue, 3 Apr 2012 17:24:52 +0000 (10:24 -0700)
committerNicholas Bellinger <nab@linux-iscsi.org>
Sat, 7 Apr 2012 01:57:05 +0000 (18:57 -0700)
Avoid freeing a registered tpg structure if an alloc_workqueue call
fails.  This fixes a bug where the failure was leaking memory associated
with se_portal_group setup during the original core_tpg_register() call.

Signed-off-by: Mark Rustad <mark.d.rustad@intel.com>
Acked-by: Kiran Patil <Kiran.patil@intel.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/target/tcm_fc/tfc_conf.c

index f357039349ba56b2b9ee2ed3b0b154bc7bd96fa9..2948dc9446196f2f2c9fa9c8b87dc85d16300f74 100644 (file)
@@ -300,6 +300,7 @@ static struct se_portal_group *ft_add_tpg(
 {
        struct ft_lport_acl *lacl;
        struct ft_tpg *tpg;
+       struct workqueue_struct *wq;
        unsigned long index;
        int ret;
 
@@ -321,18 +322,20 @@ static struct se_portal_group *ft_add_tpg(
        tpg->lport_acl = lacl;
        INIT_LIST_HEAD(&tpg->lun_list);
 
-       ret = core_tpg_register(&ft_configfs->tf_ops, wwn, &tpg->se_tpg,
-                               tpg, TRANSPORT_TPG_TYPE_NORMAL);
-       if (ret < 0) {
+       wq = alloc_workqueue("tcm_fc", 0, 1);
+       if (!wq) {
                kfree(tpg);
                return NULL;
        }
 
-       tpg->workqueue = alloc_workqueue("tcm_fc", 0, 1);
-       if (!tpg->workqueue) {
+       ret = core_tpg_register(&ft_configfs->tf_ops, wwn, &tpg->se_tpg,
+                               tpg, TRANSPORT_TPG_TYPE_NORMAL);
+       if (ret < 0) {
+               destroy_workqueue(wq);
                kfree(tpg);
                return NULL;
        }
+       tpg->workqueue = wq;
 
        mutex_lock(&ft_lport_lock);
        list_add_tail(&tpg->list, &lacl->tpg_list);