From: Dan Williams Date: Fri, 6 May 2011 00:47:44 +0000 (-0700) Subject: isci: fix ata locking X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=5b3f2bd877382eaf4b5a7d90fdec72ef14b9ec97;p=linux-beck.git isci: fix ata locking Upstream commit a29b5dad "libata: fix locking for sas paths" switched libsas ata locking to the ata_host lock. We need to do the same when returning ata tasks from the execute path. Signed-off-by: Dan Williams --- diff --git a/drivers/scsi/isci/task.h b/drivers/scsi/isci/task.h index 77cc54dbe81f..aa2458658d1e 100644 --- a/drivers/scsi/isci/task.h +++ b/drivers/scsi/isci/task.h @@ -344,26 +344,26 @@ isci_task_set_completion_status( * @status: This parameter is the status code for the completed task. * */ -static inline void isci_execpath_callback( - struct isci_host *ihost, - struct sas_task *task, - void (*func)(struct sas_task *)) +static inline void isci_execpath_callback(struct isci_host *ihost, + struct sas_task *task, + void (*func)(struct sas_task *)) { - unsigned long flags; + struct domain_device *dev = task->dev; + + if (dev_is_sata(dev) && task->uldd_task) { + unsigned long flags; - if (dev_is_sata(task->dev) && task->uldd_task) { /* Since we are still in the submit path, and since - * libsas takes the host lock on behalf of SATA - * devices before I/O starts (in the non-discovery case), - * we need to unlock before we can call the callback function. - */ + * libsas takes the host lock on behalf of SATA + * devices before I/O starts (in the non-discovery case), + * we need to unlock before we can call the callback function. + */ raw_local_irq_save(flags); - spin_unlock(ihost->shost->host_lock); + spin_unlock(dev->sata_dev.ap->lock); func(task); - spin_lock(ihost->shost->host_lock); + spin_lock(dev->sata_dev.ap->lock); raw_local_irq_restore(flags); } else func(task); } - #endif /* !defined(_SCI_TASK_H_) */