callout_reset: fix a reversed check for cc_exec_cancel

The typo was introduced in r278469 / 344ecf88af.

As a result of the bug there was a timing window where callout_reset()
would fail to cancel a concurrent execution of a callout that is about
to start and would schedule the callout again.
The callout would fire more times than it is scheduled.
That would happen even if the callout is initialized with a lock.

For example, the bug triggered the "Stray timeout" assertion in
taskqueue_timeout_func().

MFC after:	5 days
This commit is contained in:
Andriy Gapon 2015-09-01 09:27:14 +00:00
parent 5dfef00190
commit 378d5c6c89
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=287354

View File

@ -1032,7 +1032,7 @@ callout_reset_sbt_on(struct callout *c, sbintime_t sbt, sbintime_t precision,
* currently in progress. If there is a lock then we
* can cancel the callout if it has not really started.
*/
if (c->c_lock != NULL && cc_exec_cancel(cc, direct))
if (c->c_lock != NULL && !cc_exec_cancel(cc, direct))
cancelled = cc_exec_cancel(cc, direct) = true;
if (cc_exec_waiting(cc, direct)) {
/*