diff options
Diffstat (limited to 'drivers/scsi/ipr.c')
-rw-r--r-- | drivers/scsi/ipr.c | 55 |
1 files changed, 38 insertions, 17 deletions
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 5441531c0d8e..17b106b79f72 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
@@ -1053,7 +1053,7 @@ static void ipr_log_array_error(struct ipr_ioa_cfg *ioa_cfg, | |||
1053 | array_entry->dev_res_addr.lun); | 1053 | array_entry->dev_res_addr.lun); |
1054 | } | 1054 | } |
1055 | 1055 | ||
1056 | if (array_entry->dev_res_addr.bus >= IPR_MAX_NUM_BUSES) { | 1056 | if (array_entry->expected_dev_res_addr.bus >= IPR_MAX_NUM_BUSES) { |
1057 | ipr_err("Expected Location: unknown\n"); | 1057 | ipr_err("Expected Location: unknown\n"); |
1058 | } else { | 1058 | } else { |
1059 | ipr_err("Expected Location: %d:%d:%d:%d\n", | 1059 | ipr_err("Expected Location: %d:%d:%d:%d\n", |
@@ -2885,7 +2885,7 @@ static int ipr_slave_alloc(struct scsi_device *sdev) | |||
2885 | * Return value: | 2885 | * Return value: |
2886 | * SUCCESS / FAILED | 2886 | * SUCCESS / FAILED |
2887 | **/ | 2887 | **/ |
2888 | static int ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd) | 2888 | static int __ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd) |
2889 | { | 2889 | { |
2890 | struct ipr_ioa_cfg *ioa_cfg; | 2890 | struct ipr_ioa_cfg *ioa_cfg; |
2891 | int rc; | 2891 | int rc; |
@@ -2905,6 +2905,17 @@ static int ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd) | |||
2905 | return rc; | 2905 | return rc; |
2906 | } | 2906 | } |
2907 | 2907 | ||
2908 | static int ipr_eh_host_reset(struct scsi_cmnd * cmd) | ||
2909 | { | ||
2910 | int rc; | ||
2911 | |||
2912 | spin_lock_irq(cmd->device->host->host_lock); | ||
2913 | rc = __ipr_eh_host_reset(cmd); | ||
2914 | spin_unlock_irq(cmd->device->host->host_lock); | ||
2915 | |||
2916 | return rc; | ||
2917 | } | ||
2918 | |||
2908 | /** | 2919 | /** |
2909 | * ipr_eh_dev_reset - Reset the device | 2920 | * ipr_eh_dev_reset - Reset the device |
2910 | * @scsi_cmd: scsi command struct | 2921 | * @scsi_cmd: scsi command struct |
@@ -2916,7 +2927,7 @@ static int ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd) | |||
2916 | * Return value: | 2927 | * Return value: |
2917 | * SUCCESS / FAILED | 2928 | * SUCCESS / FAILED |
2918 | **/ | 2929 | **/ |
2919 | static int ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) | 2930 | static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) |
2920 | { | 2931 | { |
2921 | struct ipr_cmnd *ipr_cmd; | 2932 | struct ipr_cmnd *ipr_cmd; |
2922 | struct ipr_ioa_cfg *ioa_cfg; | 2933 | struct ipr_ioa_cfg *ioa_cfg; |
@@ -2970,6 +2981,17 @@ static int ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) | |||
2970 | return (IPR_IOASC_SENSE_KEY(ioasc) ? FAILED : SUCCESS); | 2981 | return (IPR_IOASC_SENSE_KEY(ioasc) ? FAILED : SUCCESS); |
2971 | } | 2982 | } |
2972 | 2983 | ||
2984 | static int ipr_eh_dev_reset(struct scsi_cmnd * cmd) | ||
2985 | { | ||
2986 | int rc; | ||
2987 | |||
2988 | spin_lock_irq(cmd->device->host->host_lock); | ||
2989 | rc = __ipr_eh_dev_reset(cmd); | ||
2990 | spin_unlock_irq(cmd->device->host->host_lock); | ||
2991 | |||
2992 | return rc; | ||
2993 | } | ||
2994 | |||
2973 | /** | 2995 | /** |
2974 | * ipr_bus_reset_done - Op done function for bus reset. | 2996 | * ipr_bus_reset_done - Op done function for bus reset. |
2975 | * @ipr_cmd: ipr command struct | 2997 | * @ipr_cmd: ipr command struct |
@@ -3068,6 +3090,12 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd) | |||
3068 | ioa_cfg = (struct ipr_ioa_cfg *)scsi_cmd->device->host->hostdata; | 3090 | ioa_cfg = (struct ipr_ioa_cfg *)scsi_cmd->device->host->hostdata; |
3069 | res = scsi_cmd->device->hostdata; | 3091 | res = scsi_cmd->device->hostdata; |
3070 | 3092 | ||
3093 | /* If we are currently going through reset/reload, return failed. | ||
3094 | * This will force the mid-layer to call ipr_eh_host_reset, | ||
3095 | * which will then go to sleep and wait for the reset to complete | ||
3096 | */ | ||
3097 | if (ioa_cfg->in_reset_reload || ioa_cfg->ioa_is_dead) | ||
3098 | return FAILED; | ||
3071 | if (!res || (!ipr_is_gscsi(res) && !ipr_is_vset_device(res))) | 3099 | if (!res || (!ipr_is_gscsi(res) && !ipr_is_vset_device(res))) |
3072 | return FAILED; | 3100 | return FAILED; |
3073 | 3101 | ||
@@ -3118,23 +3146,17 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd) | |||
3118 | **/ | 3146 | **/ |
3119 | static int ipr_eh_abort(struct scsi_cmnd * scsi_cmd) | 3147 | static int ipr_eh_abort(struct scsi_cmnd * scsi_cmd) |
3120 | { | 3148 | { |
3121 | struct ipr_ioa_cfg *ioa_cfg; | 3149 | unsigned long flags; |
3150 | int rc; | ||
3122 | 3151 | ||
3123 | ENTER; | 3152 | ENTER; |
3124 | ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata; | ||
3125 | 3153 | ||
3126 | /* If we are currently going through reset/reload, return failed. This will force the | 3154 | spin_lock_irqsave(scsi_cmd->device->host->host_lock, flags); |
3127 | mid-layer to call ipr_eh_host_reset, which will then go to sleep and wait for the | 3155 | rc = ipr_cancel_op(scsi_cmd); |
3128 | reset to complete */ | 3156 | spin_unlock_irqrestore(scsi_cmd->device->host->host_lock, flags); |
3129 | if (ioa_cfg->in_reset_reload) | ||
3130 | return FAILED; | ||
3131 | if (ioa_cfg->ioa_is_dead) | ||
3132 | return FAILED; | ||
3133 | if (!scsi_cmd->device->hostdata) | ||
3134 | return FAILED; | ||
3135 | 3157 | ||
3136 | LEAVE; | 3158 | LEAVE; |
3137 | return ipr_cancel_op(scsi_cmd); | 3159 | return rc; |
3138 | } | 3160 | } |
3139 | 3161 | ||
3140 | /** | 3162 | /** |
@@ -5886,6 +5908,7 @@ static void __ipr_remove(struct pci_dev *pdev) | |||
5886 | 5908 | ||
5887 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); | 5909 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); |
5888 | wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); | 5910 | wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); |
5911 | flush_scheduled_work(); | ||
5889 | spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); | 5912 | spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); |
5890 | 5913 | ||
5891 | spin_lock(&ipr_driver_lock); | 5914 | spin_lock(&ipr_driver_lock); |
@@ -5916,8 +5939,6 @@ static void ipr_remove(struct pci_dev *pdev) | |||
5916 | 5939 | ||
5917 | ENTER; | 5940 | ENTER; |
5918 | 5941 | ||
5919 | ioa_cfg->allow_cmds = 0; | ||
5920 | flush_scheduled_work(); | ||
5921 | ipr_remove_trace_file(&ioa_cfg->host->shost_classdev.kobj, | 5942 | ipr_remove_trace_file(&ioa_cfg->host->shost_classdev.kobj, |
5922 | &ipr_trace_attr); | 5943 | &ipr_trace_attr); |
5923 | ipr_remove_dump_file(&ioa_cfg->host->shost_classdev.kobj, | 5944 | ipr_remove_dump_file(&ioa_cfg->host->shost_classdev.kobj, |