diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index c2c685df7da4..783f86cea597 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -2557,7 +2557,12 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) lrbp->lun = ufshcd_scsi_to_upiu_lun(cmd->device->lun); lrbp->intr_cmd = !ufshcd_is_intr_aggr_allowed(hba) ? true : false; - ufshcd_vops_prepare_command(hba, cmd->request, lrbp); + err = ufshcd_vops_prepare_command(hba, cmd->request, lrbp); + if (err) { + lrbp->cmd = NULL; + ufshcd_release(hba); + goto out; + } ufshcd_prepare_lrbp_crypto(cmd->request, lrbp); diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 45510d730309..0e28f5b7649d 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -330,7 +330,7 @@ struct ufs_hba_variant_ops { const union ufs_crypto_cfg_entry *cfg, int slot); int (*fill_prdt)(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, unsigned int segments); - void (*prepare_command)(struct ufs_hba *hba, + int (*prepare_command)(struct ufs_hba *hba, struct request *rq, struct ufshcd_lrb *lrbp); int (*update_sysfs)(struct ufs_hba *hba); void (*send_command)(struct ufs_hba *hba, struct ufshcd_lrb *lrbp); @@ -1247,11 +1247,12 @@ static inline int ufshcd_vops_fill_prdt(struct ufs_hba *hba, return 0; } -static inline void ufshcd_vops_prepare_command(struct ufs_hba *hba, +static inline int ufshcd_vops_prepare_command(struct ufs_hba *hba, struct request *rq, struct ufshcd_lrb *lrbp) { if (hba->vops && hba->vops->prepare_command) - hba->vops->prepare_command(hba, rq, lrbp); + return hba->vops->prepare_command(hba, rq, lrbp); + return 0; } static inline int ufshcd_vops_update_sysfs(struct ufs_hba *hba)