[SCSI] zfcp: remove unit will fail if add unit is not finished
authorMartin Petermann <martin@linux.vnet.ibm.com>
Fri, 17 Apr 2009 13:08:08 +0000 (15:08 +0200)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Mon, 27 Apr 2009 15:07:31 +0000 (10:07 -0500)
On some hardware it can take some time to add a unit. If
some remove this unit during this process the remove will
fail.

Signed-off-by: Martin Petermann <martin@linux.vnet.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/s390/scsi/zfcp_sysfs.c

index 9a3b8e261c0a6e9afa5ade55efcd7e399be7557e..3e51e64d11081393fe62c849cc7af3ffe7fd6394 100644 (file)
@@ -254,12 +254,21 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev,
 
        write_lock_irq(&zfcp_data.config_lock);
        unit = zfcp_get_unit_by_lun(port, fcp_lun);
-       if (unit && (atomic_read(&unit->refcount) == 0)) {
-               zfcp_unit_get(unit);
-               atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
-               list_move(&unit->list, &unit_remove_lh);
-       } else
-               unit = NULL;
+       if (unit) {
+               write_unlock_irq(&zfcp_data.config_lock);
+               /* wait for possible timeout during SCSI probe */
+               flush_work(&unit->scsi_work);
+               write_lock_irq(&zfcp_data.config_lock);
+
+               if (atomic_read(&unit->refcount) == 0) {
+                       zfcp_unit_get(unit);
+                       atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE,
+                                       &unit->status);
+                       list_move(&unit->list, &unit_remove_lh);
+               } else {
+                       unit = NULL;
+               }
+       }
 
        write_unlock_irq(&zfcp_data.config_lock);