Title: [9822] trunk/drivers/spi: spi: Fix race condition in stop_queue()
Revision
9822
Author
vapier
Date
2011-04-07 02:13:48 -0400 (Thu, 07 Apr 2011)

Log Message

spi: Fix race condition in stop_queue()

From: Vasily Khoruzhick <[email protected]>

There's a race condition in stop_queue() in some drivers -
if drv_data->queue is empty, but drv_data->busy is still set
(or opposite situation) stop_queue will return -EBUSY.
So fix loop condition to check that both drv_data->queue is empty
and drv_data->busy is not set.

This patch affects following drivers:
pxa2xx_spi
spi_bfin5xx
amba-pl022
dw_spi

Modified Paths

Diff

Modified: trunk/drivers/spi/spi_bfin5xx.c (9821 => 9822)


--- trunk/drivers/spi/spi_bfin5xx.c	2011-04-07 06:03:20 UTC (rev 9821)
+++ trunk/drivers/spi/spi_bfin5xx.c	2011-04-07 06:13:48 UTC (rev 9822)
@@ -1284,7 +1284,7 @@
 	 * friends on every SPI message. Do this instead
 	 */
 	drv_data->running = false;
-	while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) {
+	while ((!list_empty(&drv_data->queue) || drv_data->busy) && limit--) {
 		spin_unlock_irqrestore(&drv_data->lock, flags);
 		msleep(10);
 		spin_lock_irqsave(&drv_data->lock, flags);

Modified: trunk/drivers/spi/spi_bfin_sport.c (9821 => 9822)


--- trunk/drivers/spi/spi_bfin_sport.c	2011-04-07 06:03:20 UTC (rev 9821)
+++ trunk/drivers/spi/spi_bfin_sport.c	2011-04-07 06:13:48 UTC (rev 9822)
@@ -726,7 +726,7 @@
 	 * friends on every SPI message. Do this instead
 	 */
 	drv_data->run = false;
-	while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) {
+	while ((!list_empty(&drv_data->queue) || drv_data->busy) && limit--) {
 		spin_unlock_irqrestore(&drv_data->lock, flags);
 		msleep(10);
 		spin_lock_irqsave(&drv_data->lock, flags);
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to