[openib-general] SRP: [PATCH] Releasing the scsi_host when unloading
Ishai Rabinovitz
ishai at mellanox.co.il
Sun May 14 04:02:01 PDT 2006
Hi,
After loading ib_srp module, adding a target and then unloading the ib_srp
target the scsi_host directory in /sys/class/scsi_host/ still exists.
It looks like the srp code does not release the scsi_host it had allocated.
After examining the code I found out that when executing srp_remove_work
(the removal of one target) scsi_host_put is called twice, but when unloading
the module in srp_remove_one scsi_host_put is called only once.
It looks like the correct thing is to execute scsi_host_put twice (once for
the call to scsi_add_host and once for the call to scsi_host_alloc).
So, I suggest the next patch:
--------------------------------------------------------------------------------
Index: last_stable/drivers/infiniband/ulp/srp/ib_srp.c
===================================================================
--- last_stable.orig/drivers/infiniband/ulp/srp/ib_srp.c 2006-05-14 13:09:23.000000000 +0300
+++ last_stable/drivers/infiniband/ulp/srp/ib_srp.c 2006-05-14 13:25:48.000000000 +0300
@@ -357,7 +357,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;
@@ -1790,6 +1789,11 @@ static void srp_remove_one(struct ib_dev
srp_disconnect_target(target);
ib_destroy_cm_id(target->cm_id);
srp_free_target_ib(target);
+ /*
+ * 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);
}
More information about the general
mailing list