1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-02 01:18:26 +03:00

polldaemon: separate daemon_parms initialisation

This commit is contained in:
Ondrej Kozina 2015-03-17 18:40:43 +01:00
parent 3929b00466
commit 7abb7894e4

View File

@ -276,50 +276,26 @@ static void _poll_for_all_vgs(struct cmd_context *cmd,
* if it was requested. * if it was requested.
*/ */
static int _poll_daemon(struct cmd_context *cmd, const char *name, static int _poll_daemon(struct cmd_context *cmd, const char *name,
const char *uuid, unsigned background, uint64_t lv_type, const char *uuid, struct daemon_parms *parms)
struct poll_functions *poll_fns,
const char *progress_title)
{ {
struct processing_handle *handle = NULL; struct processing_handle *handle = NULL;
struct daemon_parms parms;
int daemon_mode = 0; int daemon_mode = 0;
int ret = ECMD_PROCESSED; int ret = ECMD_PROCESSED;
sign_t interval_sign;
parms.aborting = arg_is_set(cmd, abort_ARG); if (!parms->interval) {
parms.background = background; parms->progress_display = 0;
interval_sign = arg_sign_value(cmd, interval_ARG, SIGN_NONE);
if (interval_sign == SIGN_MINUS) {
log_error("Argument to --interval cannot be negative");
return EINVALID_CMD_LINE;
}
parms.interval = arg_uint_value(cmd, interval_ARG,
find_config_tree_int(cmd, activation_polling_interval_CFG, NULL));
parms.wait_before_testing = (interval_sign == SIGN_PLUS);
parms.progress_display = 1;
parms.progress_title = progress_title;
parms.lv_type = lv_type;
parms.poll_fns = poll_fns;
if (parms.interval && !parms.aborting)
log_verbose("Checking progress %s waiting every %u seconds",
(parms.wait_before_testing ? "after" : "before"),
parms.interval);
if (!parms.interval) {
parms.progress_display = 0;
/* FIXME Disabled multiple-copy wait_event */ /* FIXME Disabled multiple-copy wait_event */
if (!name) if (!name)
parms.interval = find_config_tree_int(cmd, activation_polling_interval_CFG, NULL); parms->interval = find_config_tree_int(cmd, activation_polling_interval_CFG, NULL);
} }
if (parms.background) { if (parms->background) {
daemon_mode = become_daemon(cmd, 0); daemon_mode = become_daemon(cmd, 0);
if (daemon_mode == 0) if (daemon_mode == 0)
return ECMD_PROCESSED; /* Parent */ return ECMD_PROCESSED; /* Parent */
else if (daemon_mode == 1) else if (daemon_mode == 1)
parms.progress_display = 0; /* Child */ parms->progress_display = 0; /* Child */
/* FIXME Use wait_event (i.e. interval = 0) and */ /* FIXME Use wait_event (i.e. interval = 0) and */
/* fork one daemon per copy? */ /* fork one daemon per copy? */
} }
@ -328,7 +304,7 @@ static int _poll_daemon(struct cmd_context *cmd, const char *name,
* Process one specific task or all incomplete tasks? * Process one specific task or all incomplete tasks?
*/ */
if (name) { if (name) {
if (!_wait_for_single_lv(cmd, name, uuid, &parms)) { if (!_wait_for_single_lv(cmd, name, uuid, parms)) {
stack; stack;
ret = ECMD_FAILED; ret = ECMD_FAILED;
} }
@ -337,12 +313,12 @@ static int _poll_daemon(struct cmd_context *cmd, const char *name,
log_error("Failed to initialize processing handle."); log_error("Failed to initialize processing handle.");
ret = ECMD_FAILED; ret = ECMD_FAILED;
} else { } else {
handle->custom_handle = &parms; handle->custom_handle = parms;
_poll_for_all_vgs(cmd, handle); _poll_for_all_vgs(cmd, handle);
} }
} }
if (parms.background && daemon_mode == 1) { if (parms->background && daemon_mode == 1) {
destroy_processing_handle(cmd, handle); destroy_processing_handle(cmd, handle);
/* /*
* child was successfully forked: * child was successfully forked:
@ -358,10 +334,44 @@ static int _poll_daemon(struct cmd_context *cmd, const char *name,
return ret; return ret;
} }
static int _daemon_parms_init(struct cmd_context *cmd, struct daemon_parms *parms,
unsigned background, struct poll_functions *poll_fns,
const char *progress_title, uint64_t lv_type)
{
sign_t interval_sign;
parms->aborting = arg_is_set(cmd, abort_ARG);
parms->background = background;
interval_sign = arg_sign_value(cmd, interval_ARG, SIGN_NONE);
if (interval_sign == SIGN_MINUS) {
log_error("Argument to --interval cannot be negative.");
return 0;
}
parms->interval = arg_uint_value(cmd, interval_ARG,
find_config_tree_int(cmd, activation_polling_interval_CFG, NULL));
parms->wait_before_testing = (interval_sign == SIGN_PLUS);
parms->progress_display = 1;
parms->progress_title = progress_title;
parms->lv_type = lv_type;
parms->poll_fns = poll_fns;
if (parms->interval && !parms->aborting)
log_verbose("Checking progress %s waiting every %u seconds.",
(parms->wait_before_testing ? "after" : "before"),
parms->interval);
return 1;
}
int poll_daemon(struct cmd_context *cmd, const char *name, const char *uuid, int poll_daemon(struct cmd_context *cmd, const char *name, const char *uuid,
unsigned background, unsigned background,
uint64_t lv_type, struct poll_functions *poll_fns, uint64_t lv_type, struct poll_functions *poll_fns,
const char *progress_title) const char *progress_title)
{ {
return _poll_daemon(cmd, name, uuid, background, lv_type, poll_fns, progress_title); struct daemon_parms parms;
if (!_daemon_parms_init(cmd, &parms, background, poll_fns, progress_title, lv_type))
return_EINVALID_CMD_LINE;
return _poll_daemon(cmd, name, uuid, &parms);
} }