Message ID | 201507141641.t6EGfUKf005602@d03av03.boulder.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
>>>>> "Brian" == Brian King <brking@linux.vnet.ibm.com> writes: Brian> Make sure we have the host lock held when calling Brian> scsi_report_bus_reset. Fixes a crash seen as the __devices list Brian> in the scsi host was changing as we were iterating through it. Nit: I take it that renaming lock_flags to hrrq_flags makes sense. But it muddles what is supposed to be a bugfix patch. Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
On 07/16/2015 08:57 PM, Martin K. Petersen wrote: >>>>>> "Brian" == Brian King <brking@linux.vnet.ibm.com> writes: > > Brian> Make sure we have the host lock held when calling > Brian> scsi_report_bus_reset. Fixes a crash seen as the __devices list > Brian> in the scsi host was changing as we were iterating through it. > > Nit: I take it that renaming lock_flags to hrrq_flags makes sense. But > it muddles what is supposed to be a bugfix patch. > > Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> > Correct. Thanks for the review. -Brian
diff -puN drivers/scsi/ipr.c~ipr_erp_start_locking drivers/scsi/ipr.c --- linux/drivers/scsi/ipr.c~ipr_erp_start_locking 2015-07-14 11:10:18.015330839 -0500 +++ linux-bjking1/drivers/scsi/ipr.c 2015-07-14 11:10:50.445165558 -0500 @@ -6263,21 +6263,23 @@ static void ipr_scsi_done(struct ipr_cmn struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); - unsigned long hrrq_flags; + unsigned long lock_flags; scsi_set_resid(scsi_cmd, be32_to_cpu(ipr_cmd->s.ioasa.hdr.residual_data_len)); if (likely(IPR_IOASC_SENSE_KEY(ioasc) == 0)) { scsi_dma_unmap(scsi_cmd); - spin_lock_irqsave(ipr_cmd->hrrq->lock, hrrq_flags); + spin_lock_irqsave(ipr_cmd->hrrq->lock, lock_flags); list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); scsi_cmd->scsi_done(scsi_cmd); - spin_unlock_irqrestore(ipr_cmd->hrrq->lock, hrrq_flags); + spin_unlock_irqrestore(ipr_cmd->hrrq->lock, lock_flags); } else { - spin_lock_irqsave(ipr_cmd->hrrq->lock, hrrq_flags); + spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); + spin_lock(&ipr_cmd->hrrq->_lock); ipr_erp_start(ioa_cfg, ipr_cmd); - spin_unlock_irqrestore(ipr_cmd->hrrq->lock, hrrq_flags); + spin_unlock(&ipr_cmd->hrrq->_lock); + spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); } }