On Fri, 2018-09-21 at 18:05 -0500, Benjamin Marzinski wrote: > 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 <bmarzins@xxxxxxxxxx> Reviewed-by: Martin Wilck <mwilck@xxxxxxxx> > --- > libmultipath/checkers/tur.c | 15 +++++++++++---- > 1 file changed, 11 insertions(+), 4 deletions(-) > > diff --git a/libmultipath/checkers/tur.c > b/libmultipath/checkers/tur.c > index 9f6ef51..4e2c7a8 100644 > --- a/libmultipath/checkers/tur.c > +++ b/libmultipath/checkers/tur.c > @@ -276,12 +276,19 @@ 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, "%s: tur checker timeout", ct- > >devt); > + condlog(3, "%s: tur checker timeout", > 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, "%s: tur checker not finished", ct- > >devt); > tur_status = PATH_PENDING; -- Dr. Martin Wilck <mwilck@xxxxxxxx>, Tel. +49 (0)911 74053 2107 SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton HRB 21284 (AG Nürnberg) -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel