Merge with IET r196:
authorvlnb <vlnb@d57e44dd-8a1f-0410-8b47-8ef2f437770f>
Fri, 30 Jan 2009 16:49:01 +0000 (16:49 +0000)
committervlnb <vlnb@d57e44dd-8a1f-0410-8b47-8ef2f437770f>
Fri, 30 Jan 2009 16:49:01 +0000 (16:49 +0000)
 - Allow removal of kernel target objects if the user space object does not exist

Based on a patch by Lars Ellenberg.

Signed-off-by: Arne Redlich <agr@powerkom-dd.de>
git-svn-id: https://scst.svn.sourceforge.net/svnroot/scst/trunk@653 d57e44dd-8a1f-0410-8b47-8ef2f437770f

iscsi-scst/usr/target.c

index 0f75408..7c540a2 100644 (file)
@@ -81,22 +81,23 @@ static void all_accounts_del(u32 tid, int dir)
 
 int target_del(u32 tid)
 {
-       int err;
-       struct target* target;
-
-       if (!(target = target_find_by_id(tid)))
-               return -ENOENT;
+       struct target *target = target_find_by_id(tid);
+       int err = ki->target_destroy(tid);
 
-       if (target->nr_sessions)
-               return -EBUSY;
+       if (err < 0 && errno != ENOENT)
+               return -errno;
+       else if (!err && !target)
+               /* A leftover kernel object was cleaned up - don't complain. */
+               return 0;
 
-       if ((err = target_destroy(tid)) < 0)
-               return err;
+       if (!target)
+               return -ENOENT;
 
        remque(&target->tlist);
 
        if (!list_empty(&target->sessions_list)) {
-               log_error("%s still have sessions %d\n", __func__, tid);
+               log_error("%s: target %u still has sessions\n", __FUNCTION__,
+                         tid);
                exit(-1);
        }