diff options
author | Ondrej Kozina <okozina@redhat.com> | 2015-01-28 11:42:45 +0100 |
---|---|---|
committer | Ondrej Kozina <okozina@redhat.com> | 2015-04-01 11:01:21 +0200 |
commit | 04dad62a8e95c4cd5ad7173ca1f3eb00bd94c8a2 (patch) | |
tree | 4aab7b6f27be45a02c813fd57ed7f44701c6ca51 | |
parent | 64a21c002bab1d28b9c7c1c1e9597b46f7c4c97b (diff) | |
download | lvm2-04dad62a8e95c4cd5ad7173ca1f3eb00bd94c8a2.tar.gz |
lvmpolld: introduce handle_missing_pvs parm
also altered the code so that it fails a request as soon
as possible after invalid parameters are received
-rw-r--r-- | daemons/lvmpolld/lvmpolld-core.c | 60 | ||||
-rw-r--r-- | daemons/lvmpolld/lvmpolld-data-utils.c | 4 |
2 files changed, 35 insertions, 29 deletions
diff --git a/daemons/lvmpolld/lvmpolld-core.c b/daemons/lvmpolld/lvmpolld-core.c index 55ef893cb..f58b6bf27 100644 --- a/daemons/lvmpolld/lvmpolld-core.c +++ b/daemons/lvmpolld/lvmpolld-core.c @@ -52,6 +52,7 @@ #define REASON_POLLING_FAILED "polling of lvm command failed" #define REASON_ILLEGAL_ABORT_REQUEST "abort only supported with PVMOVE polling operation" #define REASON_DIFFERENT_OPERATION_IN_PROGRESS "Different operation on LV already in progress" +#define REASON_INVALID_INTERVAL "request requires interval set" #define REASON_INTERNAL_ERROR "lvmpolld internal error" typedef struct lvmpolld_state { @@ -101,7 +102,7 @@ static int init(struct daemon_state *s) ls->lvm_binary = ls->lvm_binary ?: LVM2_BIN_PATH; if (access(ls->lvm_binary, X_OK)) { - ERROR(ls, "%s: %s %s", PD_LOG_PREFIX, "Execute rights denied on", ls->lvm_binary); + ERROR(ls, "%s: %s %s", PD_LOG_PREFIX, "Execute access rights denied on", ls->lvm_binary); return 0; } @@ -353,7 +354,7 @@ static int add_to_cmdargv(const char ***cmdargv, const char *str, int *index, in return 1; } -static const char **cmdargv_ctr(lvmpolld_lv_t *pdlv, unsigned abort) +static const char **cmdargv_ctr(lvmpolld_lv_t *pdlv, unsigned abort, unsigned handle_missing_pvs) { int i = 0; const char **cmd_argv = dm_malloc(MIN_SIZE * sizeof(char *)); @@ -384,7 +385,12 @@ static const char **cmdargv_ctr(lvmpolld_lv_t *pdlv, unsigned abort) /* pass abort param */ if (abort && - !add_to_cmdargv(&cmd_argv, "--abort", &i, MIN_SIZE)) + !add_to_cmdargv(&cmd_argv, "--abort", &i, MIN_SIZE)) + goto err; + + /* pass handle-missing-pvs. used by mirror polling operation */ + if (handle_missing_pvs && + !add_to_cmdargv(&cmd_argv, "--handle-missing-pvs", &i, MIN_SIZE)) goto err; /* one of: "convert", "pvmove", "merge", "merge_thin" */ @@ -584,33 +590,29 @@ static response progress_info(client_handle h, lvmpolld_state_t *ls, request req } static lvmpolld_lv_t *construct_pdlv(request req, lvmpolld_state_t *ls, - const char *lvid, const char *vgname, - enum poll_type type, unsigned abort, - lvmpolld_store_t *pdst, unsigned background) + lvmpolld_store_t *pdst, + const char *interval, const char *lvid, + const char *vgname, enum poll_type type, + unsigned abort, unsigned background, + unsigned uinterval) { const char **cmdargv; lvmpolld_lv_t *pdlv; - unsigned interval; - const char *sinterval = daemon_request_str(req, "interval", NULL); - - if (!sinterval || strpbrk(sinterval, "-") || sscanf(sinterval, "%u", &interval) != 1) { - ERROR(ls, "%s: %s: %s", PD_LOG_PREFIX, "Illegal mandatory interval parameter", - sinterval ?: "<empty>"); - return NULL; - } + unsigned handle_missing_pvs = daemon_request_int(req, "handle_missing_pvs", 0); - pdlv = pdlv_create(ls, lvid, vgname, type, sinterval, 2 * interval, pdst, - (abort ? NULL : parse_line_for_percents), background); + pdlv = pdlv_create(ls, lvid, vgname, type, interval, 2 * uinterval, + pdst, (abort ? NULL : parse_line_for_percents), + background); if (!pdlv) { ERROR(ls, "%s: %s", PD_LOG_PREFIX, "Failed to create pdlv"); return NULL; } - cmdargv = cmdargv_ctr(pdlv, abort); + cmdargv = cmdargv_ctr(pdlv, abort, handle_missing_pvs); if (!cmdargv) { pdlv_destroy(pdlv); - ERROR(pdlv->ls, "%s: %s", PD_LOG_PREFIX, "failed to construct cmd arguments for lvpoll command"); + ERROR(ls, "%s: %s", PD_LOG_PREFIX, "failed to construct cmd arguments for lvpoll command"); return NULL; } @@ -638,25 +640,29 @@ static response poll_init(client_handle h, lvmpolld_state_t *ls, request req, en { lvmpolld_lv_t *pdlv; lvmpolld_store_t *pdst; + unsigned uinterval; const char *lvid = daemon_request_str(req, "lvid", NULL); + const char *interval = daemon_request_str(req, "interval", NULL); const char *vgname = daemon_request_str(req, "vgname", NULL); unsigned abort = daemon_request_int(req, "abort", 0); - /* make background default on purpose */ unsigned background = daemon_request_int(req, "background", 1); + assert(type < POLL_TYPE_MAX); + + if (abort && type != PVMOVE) + return reply_fail(REASON_ILLEGAL_ABORT_REQUEST); + + if (!interval || strpbrk(interval, "-") || sscanf(interval, "%u", &uinterval) != 1) + return reply_fail(REASON_INVALID_INTERVAL); + if (!lvid) return reply_fail(REASON_MISSING_LVID); if (!vgname) return reply_fail(REASON_MISSING_VGNAME); - background = background > 1 ? 1 : 0; - - assert(type < POLL_TYPE_MAX); - - if (abort && type != PVMOVE) - return reply_fail(REASON_ILLEGAL_ABORT_REQUEST); + background = background > 1 ? 1 : background; pdst = abort ? &ls->lvid_to_pdlv_abort : &ls->lvid_to_pdlv_poll; @@ -685,8 +691,8 @@ static response poll_init(client_handle h, lvmpolld_state_t *ls, request req, en if (!background) pdlv_set_background(pdlv, background); } else { - pdlv = construct_pdlv(req, ls, lvid, vgname, type, abort, pdst, - background); + pdlv = construct_pdlv(req, ls, pdst, interval, lvid, vgname, + type, abort, background, uinterval); if (!pdlv) { pdst_unlock(pdst); return reply_fail(REASON_INTERNAL_ERROR); diff --git a/daemons/lvmpolld/lvmpolld-data-utils.c b/daemons/lvmpolld/lvmpolld-data-utils.c index f537b21eb..a3fdb5972 100644 --- a/daemons/lvmpolld/lvmpolld-data-utils.c +++ b/daemons/lvmpolld/lvmpolld-data-utils.c @@ -27,7 +27,7 @@ lvmpolld_lv_t *pdlv_create(lvmpolld_state_t *ls, const char *lvid, .type = type, .lvid = dm_strdup(lvid), .vgname = dm_strdup(vgname), - .sinterval = sinterval ? dm_strdup(sinterval) : NULL, + .sinterval = dm_strdup(sinterval), .pdtimeout = pdtimeout ?: PDTIMEOUT_DEF, .percent = DM_PERCENT_0, .cmd_state = { .retcode = -1, .signal = 0 }, @@ -36,7 +36,7 @@ lvmpolld_lv_t *pdlv_create(lvmpolld_state_t *ls, const char *lvid, .background = background }, *pdlv = (lvmpolld_lv_t *) dm_malloc(sizeof(lvmpolld_lv_t)); - if (!pdlv || !tmp.lvid || !tmp.vgname || (sinterval && !tmp.sinterval)) { + if (!pdlv || !tmp.lvid || !tmp.vgname || !tmp.sinterval) { dm_free((void *)tmp.lvid); dm_free((void *)tmp.vgname); dm_free((void *)tmp.sinterval); |