On Fri, Sep 10, 2021 at 01:41:13PM +0200, mwilck@xxxxxxxx wrote: > From: Martin Wilck <mwilck@xxxxxxxx> > > Move the actual execution of the handler out of parse_cmd(). For now, > we do it in uxsock_trigger(). > Reviewed-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx> > Signed-off-by: Martin Wilck <mwilck@xxxxxxxx> > --- > multipathd/uxlsnr.c | 47 ++++++++++++++++++++++++++++----------------- > 1 file changed, 29 insertions(+), 18 deletions(-) > > diff --git a/multipathd/uxlsnr.c b/multipathd/uxlsnr.c > index 65cb5ca..cfff0ae 100644 > --- a/multipathd/uxlsnr.c > +++ b/multipathd/uxlsnr.c > @@ -293,11 +293,9 @@ static void handle_inotify(int fd, struct watch_descriptors *wds) > > static const struct timespec ts_zero = { .tv_sec = 0, }; > > -static int parse_cmd (struct client *c, void *data, int timeout) > +static int parse_cmd(struct client *c) > { > int r; > - struct handler * h; > - struct timespec tmo; > > r = get_cmdvec(c->cmd, &c->cmdvec); > > @@ -308,26 +306,35 @@ static int parse_cmd (struct client *c, void *data, int timeout) > return 0; > } > > - h = find_handler_for_cmdvec(c->cmdvec); > + c->handler = find_handler_for_cmdvec(c->cmdvec); > > - if (!h || !h->fn) { > + if (!c->handler || !c->handler->fn) { > genhelp_handler(c->cmd, EINVAL, &c->reply); > if (get_strbuf_len(&c->reply) == 0) > r = EINVAL; > - goto free_cmdvec; > + else > + r = 0; > } > > - /* > - * execute handler > - */ > + return r; > +} > + > +static int execute_handler(struct client *c, struct vectors *vecs, int timeout) > +{ > + int r; > + struct timespec tmo; > + > + if (!c->handler) > + return EINVAL; > + > if (clock_gettime(CLOCK_REALTIME, &tmo) == 0) { > tmo.tv_sec += timeout; > } else { > tmo.tv_sec = 0; > } > - if (h->locked) { > + > + if (c->handler->locked) { > int locked = 0; > - struct vectors * vecs = (struct vectors *)data; > > pthread_cleanup_push(cleanup_lock, &vecs->lock); > if (tmo.tv_sec) { > @@ -339,15 +346,11 @@ static int parse_cmd (struct client *c, void *data, int timeout) > if (r == 0) { > locked = 1; > pthread_testcancel(); > - r = h->fn(c->cmdvec, &c->reply, data); > + r = c->handler->fn(c->cmdvec, &c->reply, vecs); > } > pthread_cleanup_pop(locked); > } else > - r = h->fn(c->cmdvec, &c->reply, data); > - > -free_cmdvec: > - free_keys(c->cmdvec); > - c->cmdvec = NULL; > + r = c->handler->fn(c->cmdvec, &c->reply, vecs); > > return r; > } > @@ -367,7 +370,15 @@ static int uxsock_trigger(struct client *c, void *trigger_data) > return r; > } > > - r = parse_cmd(c, vecs, uxsock_timeout / 1000); > + r = parse_cmd(c); > + > + if (r == 0 && c->handler) > + r = execute_handler(c, vecs, uxsock_timeout / 1000); > + > + if (c->cmdvec) { > + free_keys(c->cmdvec); > + c->cmdvec = NULL; > + } > > if (r > 0) { > if (r == ETIMEDOUT) > -- > 2.33.0 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/dm-devel