FreeBSD: Sync taskq_cancel_id() returns with Linux

Couple places in the code depend on 0 returned only if the task was
actually cancelled.  Doing otherwise could lead to extra references
being dropped.  The race could be small, but I believe CI hit it
from time to time.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by:	Alexander Motin <mav@FreeBSD.org>
Sponsored by:	iXsystems, Inc.
Closes #16565
This commit is contained in:
Alexander Motin 2024-09-24 19:29:18 -04:00 committed by GitHub
parent ccc420acd5
commit 832f66b218
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -357,7 +357,7 @@ taskq_cancel_id(taskq_t *tq, taskqid_t tid)
taskq_ent_t *ent; taskq_ent_t *ent;
if ((ent = taskq_lookup(tid)) == NULL) if ((ent = taskq_lookup(tid)) == NULL)
return (0); return (ENOENT);
if (ent->tqent_type == NORMAL_TASK) { if (ent->tqent_type == NORMAL_TASK) {
rc = taskqueue_cancel(tq->tq_queue, &ent->tqent_task, &pend); rc = taskqueue_cancel(tq->tq_queue, &ent->tqent_task, &pend);
@ -380,7 +380,7 @@ taskq_cancel_id(taskq_t *tq, taskqid_t tid)
} }
/* Free the extra reference we added with taskq_lookup. */ /* Free the extra reference we added with taskq_lookup. */
taskq_free(ent); taskq_free(ent);
return (rc); return (pend ? 0 : ENOENT);
} }
static void static void