mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
SCSI fixes on 20240209
4 small fixes, 3 in drivers with the remaining core fix being a fixup to the one in the last pull request which didn't entirely move checking of scsi_host_busy() out from under the host lock. Signed-off-by: James E.J. Bottomley <jejb@linux.ibm.com> -----BEGIN PGP SIGNATURE----- iJwEABMIAEQWIQTnYEDbdso9F2cI+arnQslM7pishQUCZcakBiYcamFtZXMuYm90 dG9tbGV5QGhhbnNlbnBhcnRuZXJzaGlwLmNvbQAKCRDnQslM7pishU5GAP9J3BgQ evE/NZl5bOFobFRUWOaUwPCU+KzLR8odFBleHAD/SlAapQGDHLm7smUECbiHDVI+ j5T4CLY57a+UQzC8lUc= =poH3 -----END PGP SIGNATURE----- Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi Pull SCSI fixes from James Bottomley: "Three small driver fixes and one core fix. The core fix being a fixup to the one in the last pull request which didn't entirely move checking of scsi_host_busy() out from under the host lock" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: ufs: core: Remove the ufshcd_release() in ufshcd_err_handling_prepare() scsi: ufs: core: Fix shift issue in ufshcd_clear_cmd() scsi: lpfc: Use unsigned type for num_sge scsi: core: Move scsi_host_busy() out of host lock if it is for per-command
This commit is contained in:
commit
4a7bbe7519
@ -1918,7 +1918,7 @@ out:
|
|||||||
*
|
*
|
||||||
* Returns the number of SGEs added to the SGL.
|
* Returns the number of SGEs added to the SGL.
|
||||||
**/
|
**/
|
||||||
static int
|
static uint32_t
|
||||||
lpfc_bg_setup_sgl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
lpfc_bg_setup_sgl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
struct sli4_sge *sgl, int datasegcnt,
|
struct sli4_sge *sgl, int datasegcnt,
|
||||||
struct lpfc_io_buf *lpfc_cmd)
|
struct lpfc_io_buf *lpfc_cmd)
|
||||||
@ -1926,8 +1926,8 @@ lpfc_bg_setup_sgl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
|||||||
struct scatterlist *sgde = NULL; /* s/g data entry */
|
struct scatterlist *sgde = NULL; /* s/g data entry */
|
||||||
struct sli4_sge_diseed *diseed = NULL;
|
struct sli4_sge_diseed *diseed = NULL;
|
||||||
dma_addr_t physaddr;
|
dma_addr_t physaddr;
|
||||||
int i = 0, num_sge = 0, status;
|
int i = 0, status;
|
||||||
uint32_t reftag;
|
uint32_t reftag, num_sge = 0;
|
||||||
uint8_t txop, rxop;
|
uint8_t txop, rxop;
|
||||||
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
||||||
uint32_t rc;
|
uint32_t rc;
|
||||||
@ -2099,7 +2099,7 @@ out:
|
|||||||
*
|
*
|
||||||
* Returns the number of SGEs added to the SGL.
|
* Returns the number of SGEs added to the SGL.
|
||||||
**/
|
**/
|
||||||
static int
|
static uint32_t
|
||||||
lpfc_bg_setup_sgl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
lpfc_bg_setup_sgl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||||
struct sli4_sge *sgl, int datacnt, int protcnt,
|
struct sli4_sge *sgl, int datacnt, int protcnt,
|
||||||
struct lpfc_io_buf *lpfc_cmd)
|
struct lpfc_io_buf *lpfc_cmd)
|
||||||
@ -2123,8 +2123,8 @@ lpfc_bg_setup_sgl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
|||||||
uint32_t rc;
|
uint32_t rc;
|
||||||
#endif
|
#endif
|
||||||
uint32_t checking = 1;
|
uint32_t checking = 1;
|
||||||
uint32_t dma_offset = 0;
|
uint32_t dma_offset = 0, num_sge = 0;
|
||||||
int num_sge = 0, j = 2;
|
int j = 2;
|
||||||
struct sli4_hybrid_sgl *sgl_xtra = NULL;
|
struct sli4_hybrid_sgl *sgl_xtra = NULL;
|
||||||
|
|
||||||
sgpe = scsi_prot_sglist(sc);
|
sgpe = scsi_prot_sglist(sc);
|
||||||
|
@ -282,11 +282,12 @@ static void scsi_eh_inc_host_failed(struct rcu_head *head)
|
|||||||
{
|
{
|
||||||
struct scsi_cmnd *scmd = container_of(head, typeof(*scmd), rcu);
|
struct scsi_cmnd *scmd = container_of(head, typeof(*scmd), rcu);
|
||||||
struct Scsi_Host *shost = scmd->device->host;
|
struct Scsi_Host *shost = scmd->device->host;
|
||||||
|
unsigned int busy = scsi_host_busy(shost);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(shost->host_lock, flags);
|
spin_lock_irqsave(shost->host_lock, flags);
|
||||||
shost->host_failed++;
|
shost->host_failed++;
|
||||||
scsi_eh_wakeup(shost, scsi_host_busy(shost));
|
scsi_eh_wakeup(shost, busy);
|
||||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,9 +278,11 @@ static void scsi_dec_host_busy(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
|
|||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
__clear_bit(SCMD_STATE_INFLIGHT, &cmd->state);
|
__clear_bit(SCMD_STATE_INFLIGHT, &cmd->state);
|
||||||
if (unlikely(scsi_host_in_recovery(shost))) {
|
if (unlikely(scsi_host_in_recovery(shost))) {
|
||||||
|
unsigned int busy = scsi_host_busy(shost);
|
||||||
|
|
||||||
spin_lock_irqsave(shost->host_lock, flags);
|
spin_lock_irqsave(shost->host_lock, flags);
|
||||||
if (shost->host_failed || shost->host_eh_scheduled)
|
if (shost->host_failed || shost->host_eh_scheduled)
|
||||||
scsi_eh_wakeup(shost, scsi_host_busy(shost));
|
scsi_eh_wakeup(shost, busy);
|
||||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||||
}
|
}
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
@ -3057,7 +3057,7 @@ bool ufshcd_cmd_inflight(struct scsi_cmnd *cmd)
|
|||||||
*/
|
*/
|
||||||
static int ufshcd_clear_cmd(struct ufs_hba *hba, u32 task_tag)
|
static int ufshcd_clear_cmd(struct ufs_hba *hba, u32 task_tag)
|
||||||
{
|
{
|
||||||
u32 mask = 1U << task_tag;
|
u32 mask;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@ -3075,6 +3075,8 @@ static int ufshcd_clear_cmd(struct ufs_hba *hba, u32 task_tag)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mask = 1U << task_tag;
|
||||||
|
|
||||||
/* clear outstanding transaction before retry */
|
/* clear outstanding transaction before retry */
|
||||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||||
ufshcd_utrl_clear(hba, mask);
|
ufshcd_utrl_clear(hba, mask);
|
||||||
@ -6352,7 +6354,6 @@ static void ufshcd_err_handling_prepare(struct ufs_hba *hba)
|
|||||||
ufshcd_hold(hba);
|
ufshcd_hold(hba);
|
||||||
if (!ufshcd_is_clkgating_allowed(hba))
|
if (!ufshcd_is_clkgating_allowed(hba))
|
||||||
ufshcd_setup_clocks(hba, true);
|
ufshcd_setup_clocks(hba, true);
|
||||||
ufshcd_release(hba);
|
|
||||||
pm_op = hba->is_sys_suspended ? UFS_SYSTEM_PM : UFS_RUNTIME_PM;
|
pm_op = hba->is_sys_suspended ? UFS_SYSTEM_PM : UFS_RUNTIME_PM;
|
||||||
ufshcd_vops_resume(hba, pm_op);
|
ufshcd_vops_resume(hba, pm_op);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user