wan: cosa: replace current->state by set_current_state()
Use helper functions to access current->state. Direct assignments are prone to races and therefore buggy. current->state = TASK_RUNNING is replaced by __set_current_state() Thanks to Peter Zijlstra for the exact definition of the problem. Suggested-By: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Fabian Frederick <fabf@skynet.be> Acked-By: Jan "Yenya" Kasprzak <kas@fi.muni.cz> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
50462ce005
commit
2c45015a66
|
@ -806,21 +806,21 @@ static ssize_t cosa_read(struct file *file,
|
|||
spin_lock_irqsave(&cosa->lock, flags);
|
||||
add_wait_queue(&chan->rxwaitq, &wait);
|
||||
while (!chan->rx_status) {
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
spin_unlock_irqrestore(&cosa->lock, flags);
|
||||
schedule();
|
||||
spin_lock_irqsave(&cosa->lock, flags);
|
||||
if (signal_pending(current) && chan->rx_status == 0) {
|
||||
chan->rx_status = 1;
|
||||
remove_wait_queue(&chan->rxwaitq, &wait);
|
||||
current->state = TASK_RUNNING;
|
||||
__set_current_state(TASK_RUNNING);
|
||||
spin_unlock_irqrestore(&cosa->lock, flags);
|
||||
mutex_unlock(&chan->rlock);
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
}
|
||||
remove_wait_queue(&chan->rxwaitq, &wait);
|
||||
current->state = TASK_RUNNING;
|
||||
__set_current_state(TASK_RUNNING);
|
||||
kbuf = chan->rxdata;
|
||||
count = chan->rxsize;
|
||||
spin_unlock_irqrestore(&cosa->lock, flags);
|
||||
|
@ -890,14 +890,14 @@ static ssize_t cosa_write(struct file *file,
|
|||
spin_lock_irqsave(&cosa->lock, flags);
|
||||
add_wait_queue(&chan->txwaitq, &wait);
|
||||
while (!chan->tx_status) {
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
spin_unlock_irqrestore(&cosa->lock, flags);
|
||||
schedule();
|
||||
spin_lock_irqsave(&cosa->lock, flags);
|
||||
if (signal_pending(current) && chan->tx_status == 0) {
|
||||
chan->tx_status = 1;
|
||||
remove_wait_queue(&chan->txwaitq, &wait);
|
||||
current->state = TASK_RUNNING;
|
||||
__set_current_state(TASK_RUNNING);
|
||||
chan->tx_status = 1;
|
||||
spin_unlock_irqrestore(&cosa->lock, flags);
|
||||
up(&chan->wsem);
|
||||
|
@ -905,7 +905,7 @@ static ssize_t cosa_write(struct file *file,
|
|||
}
|
||||
}
|
||||
remove_wait_queue(&chan->txwaitq, &wait);
|
||||
current->state = TASK_RUNNING;
|
||||
__set_current_state(TASK_RUNNING);
|
||||
up(&chan->wsem);
|
||||
spin_unlock_irqrestore(&cosa->lock, flags);
|
||||
kfree(kbuf);
|
||||
|
|
Loading…
Reference in New Issue