[dm-devel] [PATCH] multipath-tools: release lock on handler failure
Christophe Varoqui
christophe.varoqui at opensvc.com
Mon Oct 17 08:33:05 UTC 2016
Merged.
Thanks.
On Mon, Oct 17, 2016 at 10:02 AM, Michael Wang <yun.wang at profitbricks.com>
wrote:
> Dear maintainer, is this patch looks fine to you?
>
> Regards,
> Michael Wang
>
> On 10/12/2016 10:54 AM, Michael Wang wrote:
> >
> > Inside parse_cmd() the pthread_cleanup_pop() rely on '!r' as the
> > indicator of locked or not, while this will be overwritten if the
> > handler return failed, and the unlock will be missing.
> >
> > This will lead into the situation that all the following operation
> > will trying to hold a lock which will never be released.
> >
> > This patch using a separate flag to record the status of locking to
> > make sure the unlock and lock are in pairs.
> >
> > Signed-off-by: Michael Wang <yun.wang at profitbricks.com>
> > ---
> > multipathd/cli.c | 4 +++-
> > 1 file changed, 3 insertions(+), 1 deletion(-)
> >
> > diff --git a/multipathd/cli.c b/multipathd/cli.c
> > index e8a9384..50161be 100644
> > --- a/multipathd/cli.c
> > +++ b/multipathd/cli.c
> > @@ -481,6 +481,7 @@ parse_cmd (char * cmd, char ** reply, int * len,
> void * data, int timeout )
> > tmo.tv_sec = 0;
> > }
> > if (h->locked) {
> > + int locked = 0;
> > struct vectors * vecs = (struct vectors *)data;
> >
> > pthread_cleanup_push(cleanup_lock, &vecs->lock);
> > @@ -491,10 +492,11 @@ parse_cmd (char * cmd, char ** reply, int * len,
> void * data, int timeout )
> > r = 0;
> > }
> > if (r == 0) {
> > + locked = 1;
> > pthread_testcancel();
> > r = h->fn(cmdvec, reply, len, data);
> > }
> > - pthread_cleanup_pop(!r);
> > + pthread_cleanup_pop(locked);
> > } else
> > r = h->fn(cmdvec, reply, len, data);
> > free_keys(cmdvec);
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/dm-devel/attachments/20161017/adb37e13/attachment.htm>
More information about the dm-devel
mailing list