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