In the zero delay case in queue_delayed_work() use the return value

from taskqueue_enqueue() instead of reading "ta_pending" unlocked and
also ensure the callout is stopped before proceeding.

MFC after:	1 week
Sponsored by:	Mellanox Technologies
This commit is contained in:
Hans Petter Selasky 2015-12-21 12:13:03 +00:00
parent 55d445d317
commit 9782763db2

View File

@ -105,13 +105,15 @@ queue_delayed_work(struct workqueue_struct *wq, struct delayed_work *work,
{
int pending;
pending = work->work.work_task.ta_pending;
work->work.taskqueue = wq->taskqueue;
if (delay != 0)
if (delay != 0) {
pending = work->work.work_task.ta_pending;
callout_reset(&work->timer, delay, linux_delayed_work_fn, work);
else
linux_delayed_work_fn((void *)work);
} else {
callout_stop(&work->timer);
pending = taskqueue_enqueue(work->work.taskqueue,
&work->work.work_task);
}
return (!pending);
}