diff options
author | Christof Schmitt <christof.schmitt@de.ibm.com> | 2010-09-08 16:39:54 +0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-09-17 06:54:16 +0400 |
commit | fdbd1c5e27dabfa950d4b0f52a20069aeaf67b9d (patch) | |
tree | 402ea45cf57a2fdcef7a6011a1c64bc7d43cc66e /drivers/s390/scsi/zfcp_ext.h | |
parent | e4b9857fe628b453983cac89473a11a76a1f5786 (diff) | |
download | linux-fdbd1c5e27dabfa950d4b0f52a20069aeaf67b9d.tar.xz |
[SCSI] zfcp: Allow running unit/LUN shutdown without acquiring reference
With the change for the LUN data to be part of the scsi_device, the
slave_destroy callback will be the final call to the
zfcp_erp_unit_shutdown function. The erp tries to acquire a reference
to run the action asynchronously and fail, if it cannot get the
reference. But calling scsi_device_get from slave_destroy will fail,
because the scsi_device is already in the state SDEV_DEL.
Introduce a new call into the zfcp erp to solve this: The function
zfcp_erp_unit_shutdown_wait will close the LUN and wait for the erp to
finish without acquiring an additional reference. The wait allows to
omit the reference; the caller waiting for the erp to finish already
has a reference that holds the struct in place.
Reviewed-by: Swen Schillig <swen@vnet.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/s390/scsi/zfcp_ext.h')
-rw-r--r-- | drivers/s390/scsi/zfcp_ext.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index 5c3966eaca51..3c90604076e0 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h @@ -80,6 +80,7 @@ extern void zfcp_erp_modify_unit_status(struct zfcp_unit *, char *, void *, u32, int); extern void zfcp_erp_unit_reopen(struct zfcp_unit *, int, char *, void *); extern void zfcp_erp_unit_shutdown(struct zfcp_unit *, int, char *, void *); +extern void zfcp_erp_unit_shutdown_wait(struct zfcp_unit *, char *); extern void zfcp_erp_unit_failed(struct zfcp_unit *, char *, void *); extern int zfcp_erp_thread_setup(struct zfcp_adapter *); extern void zfcp_erp_thread_kill(struct zfcp_adapter *); |