> +                    /*
 > +                     * We need 2 scsi_host_put becuase there are two get:
 > +                     *  in scsi_host_alloc and in scsi_add_host
 > +                     */
 > +                    scsi_host_put(target->scsi_host);
 >                      scsi_host_put(target->scsi_host);

Hmm, this doesn't seem right to me.  If I try this, then I get a crash
because the scsi_host is already gone after the first put.  I verified
that the reference count is 1 before these puts, and with the
unmodified module I don't see anything left in /sys/class/scsi_host
after unloading the module.

What kernel are you seeing problems with?  I'm testing with an
up-to-date git kernel, although I doubt it makes a difference (did
SCSI reference counting change recently??).

I do think there are some extra scsi_host_put() calls in
srp_remove_work() -- I think the double scsi_host_put() dates back to
a version (which I may never even have checked in) where there was a
scsi_host_get() to avoid the scsi_host going away between the
schedule_work() and srp_remove_work() actually running.

So the patch below seems correct to me.

What do you think?

--- linux-kernel/infiniband/ulp/srp/ib_srp.c    (revision 7245)
+++ linux-kernel/infiniband/ulp/srp/ib_srp.c    (working copy)
@@ -353,7 +356,6 @@ static void srp_remove_work(void *target
        spin_lock_irq(target->scsi_host->host_lock);
        if (target->state != SRP_TARGET_DEAD) {
                spin_unlock_irq(target->scsi_host->host_lock);
-               scsi_host_put(target->scsi_host);
                return;
        }
        target->state = SRP_TARGET_REMOVED;
@@ -367,8 +369,6 @@ static void srp_remove_work(void *target
        ib_destroy_cm_id(target->cm_id);
        srp_free_target_ib(target);
        scsi_host_put(target->scsi_host);
-       /* And another put to really free the target port... */
-       scsi_host_put(target->scsi_host);
 }
 
 static int srp_connect_target(struct srp_target_port *target)
_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to