Clean up error paths in tgt_device_create now that it might alloc
memory.

Signed-off-by: Pete Wyckoff <[EMAIL PROTECTED]>
---
 usr/target.c |   48 ++++++++++++++++++++++++++++--------------------
 1 files changed, 28 insertions(+), 20 deletions(-)

diff --git a/usr/target.c b/usr/target.c
index b8e25a4..2f8195b 100644
--- a/usr/target.c
+++ b/usr/target.c
@@ -265,40 +265,51 @@ int tgt_device_create(int tid, int dev_type, uint64_t 
lun, char *params,
        }
 
        target = target_lookup(tid);
-       if (!target)
-               return TGTADM_NO_TARGET;
+       if (!target) {
+               ret = TGTADM_NO_TARGET;
+               goto out;
+       }
 
        lu = device_lookup(target, lun);
        if (lu) {
                eprintf("device %" PRIu64 " already exists\n", lun);
-               return TGTADM_LUN_EXIST;
+               ret = TGTADM_LUN_EXIST;
+               goto out;
        }
 
        bst = target->bst;
-       if (backing && bstype) {
-               bst = get_backingstore_template(bstype);
-               if (!bst) {
-                       eprintf("failed to find bstype, %s\n", bstype);
+       if (backing) {
+               if (!path) {
+                       ret = TGTADM_INVALID_REQUEST;
                        goto out;
                }
-       }
 
-       lu = zalloc(sizeof(*lu) + bst->bs_datasize);
-       if (!lu)
-               return TGTADM_NOMEM;
+               if (bstype) {
+                       bst = get_backingstore_template(bstype);
+                       if (!bst) {
+                               eprintf("failed to find bstype, %s\n", bstype);
+                               ret = TGTADM_INVALID_REQUEST;
+                               goto out;
+                       }
+               }
+       }
 
        t = device_type_lookup(dev_type);
-       if (t) {
-               lu->dev_type_template = *t;
-               lu->bst = bst;
-       } else {
+       if (!t) {
                eprintf("Unknown device type %d\n", dev_type);
                ret = TGTADM_INVALID_REQUEST;
-               goto free_lu;
+               goto out;
        }
 
-       lu->tgt = target;
+       lu = zalloc(sizeof(*lu) + bst->bs_datasize);
+       if (!lu) {
+               ret = TGTADM_NOMEM;
+               goto out;
+       }
 
+       lu->dev_type_template = *t;
+       lu->bst = bst;
+       lu->tgt = target;
        lu->lun = lun;
        lu->lu_state = SCSI_LU_RUNNING;
        tgt_cmd_queue_init(&lu->cmd_queue);
@@ -310,9 +321,6 @@ int tgt_device_create(int tid, int dev_type, uint64_t lun, 
char *params,
        }
 
        if (backing) {
-               if (!path)
-                       return TGTADM_INVALID_REQUEST;
-
                ret = tgt_device_path_update(target, lu, path);
                if (ret)
                        goto free_lu;
-- 
1.5.3.7

_______________________________________________
Stgt-devel mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/stgt-devel

Reply via email to