@@ -496,7 +496,7 @@ parse_cmd (char * cmd, char ** reply, int * len, void * data, int timeout )
pthread_testcancel();
r = h->fn(cmdvec, reply, len, data);
}
- lock_cleanup_pop(vecs->lock);
+ pthread_cleanup_pop(!r);
} else
r = h->fn(cmdvec, reply, len, data);
free_keys(cmdvec);
@@ -1132,8 +1132,8 @@ uxlsnrloop (void * ap)
set_handler_callback(LIST+MAP+TOPOLOGY, cli_list_map_topology);
set_handler_callback(LIST+MAP+FMT, cli_list_map_fmt);
set_handler_callback(LIST+MAP+RAW+FMT, cli_list_map_fmt);
- set_unlocked_handler_callback(LIST+CONFIG, cli_list_config);
- set_unlocked_handler_callback(LIST+BLACKLIST, cli_list_blacklist);
+ set_handler_callback(LIST+CONFIG, cli_list_config);
+ set_handler_callback(LIST+BLACKLIST, cli_list_blacklist);
set_handler_callback(LIST+DEVICES, cli_list_devices);
set_handler_callback(LIST+WILDCARDS, cli_list_wildcards);
set_handler_callback(ADD+PATH, cli_add_path);
We now have unlocked handlers, but these can't be used to call functions that will access the pathvec, mpvec, or conf, since these are what the vecs lock protects. cli_list_config and cli_list_blacklist both need to access conf, so they can't be unlocked handlers. Also, if parse_cmd fails to lock the vecs->lock when it calls pthread_mutex_timedlock, we can't call unlock() on it, because unlocking a mutex you haven't locked causes undefined behviour. So we need to only execute the handler if didn't timeout trying to acquire the lock. Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> --- multipathd/cli.c | 2 +- multipathd/main.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)