From: Benjamin Marzinski Date: Tue, 9 Oct 2018 23:03:02 +0000 (-0500) Subject: libmultipath: fix tur checker timeout issue X-Git-Tag: 0.7.8~15 X-Git-Url: https://git.opensvc.com/gitweb.cgi?p=multipath-tools%2F.git;a=commitdiff_plain;h=cf0ce741c839607b65fb2af86c1f3820baea45fc;hp=c3a839c7a10caea3edcdc0fddf434464ddb7ebd6 libmultipath: fix tur checker timeout issue If the tur checker is run, and the tur_thread has timed out, libcheck_check() doesn't actually check if the thread is still running. This means that the thread could have already completed successfully, but the tur checker would still return PATH_TIMEOUT, instead of the value returned by the thread. This patch makes libcheck_check() actually check if the thread completed, and if so, it returns the proper value. Signed-off-by: Benjamin Marzinski --- diff --git a/libmultipath/checkers/tur.c b/libmultipath/checkers/tur.c index 983ba4c1..86c0cdcd 100644 --- a/libmultipath/checkers/tur.c +++ b/libmultipath/checkers/tur.c @@ -276,13 +276,20 @@ int libcheck_check(struct checker * c) if (ct->thread) { if (tur_check_async_timeout(c)) { int running = uatomic_xchg(&ct->running, 0); - if (running) + if (running) { pthread_cancel(ct->thread); - condlog(3, "%d:%d : tur checker timeout", - major(ct->devt), minor(ct->devt)); + condlog(3, "%d:%d : tur checker timeout", + major(ct->devt), minor(ct->devt)); + MSG(c, MSG_TUR_TIMEOUT); + tur_status = PATH_TIMEOUT; + } else { + pthread_mutex_lock(&ct->lock); + tur_status = ct->state; + strlcpy(c->message, ct->message, + sizeof(c->message)); + pthread_mutex_unlock(&ct->lock); + } ct->thread = 0; - MSG(c, MSG_TUR_TIMEOUT); - tur_status = PATH_TIMEOUT; } else if (uatomic_read(&ct->running) != 0) { condlog(3, "%d:%d : tur checker not finished", major(ct->devt), minor(ct->devt));