From a8886a5856a4443f00dcff860285c5eb9d318d17 Mon Sep 17 00:00:00 2001 From: Gilad Broner Date: Tue, 16 Dec 2014 23:24:54 +0200 Subject: [PATCH] scsi: ufs: fix spinlock recursion in ufshcd_queuecommand() Before calling ufshcd_send_command() the host spinlock is taken. In case error is returned ufshcd_release_all() is called, which in turn attempts to lock the host spinlock again. Unlocked the host spinlock in case error was returned to prevent the spinlock recursion. Change-Id: I630ac8b901f03285a37547bfbcd49ec575e7545a Signed-off-by: Gilad Broner --- drivers/scsi/ufs/ufshcd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index ebfbac0f567c..69c71035bf28 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -2436,6 +2436,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) err = ufshcd_send_command(hba, tag); if (err) { + spin_unlock_irqrestore(hba->host->host_lock, flags); scsi_dma_unmap(lrbp->cmd); lrbp->cmd = NULL; clear_bit_unlock(tag, &hba->lrb_in_use); @@ -2443,6 +2444,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) dev_err(hba->dev, "%s: failed sending command, %d\n", __func__, err); err = DID_ERROR; + goto out; } out_unlock: