diff options
author | Ondrej Kozina <okozina@redhat.com> | 2015-01-26 14:20:58 +0100 |
---|---|---|
committer | Ondrej Kozina <okozina@redhat.com> | 2015-04-01 11:01:21 +0200 |
commit | d737a275cb86114bdaf8c52827735e22eaf8a7da (patch) | |
tree | 5bf8f9f5c7c1dc743de7b8aef3543adb7fb0fac2 | |
parent | 266a0cccec7bcd6bfe9333e1fadefe23c882a75c (diff) | |
download | lvm2-d737a275cb86114bdaf8c52827735e22eaf8a7da.tar.gz |
lvmpolld: store VG name to pass it later in lvpoll cmd line
-rw-r--r-- | daemons/lvmpolld/lvmpolld-core.c | 36 | ||||
-rw-r--r-- | daemons/lvmpolld/lvmpolld-data-utils.c | 23 | ||||
-rw-r--r-- | daemons/lvmpolld/lvmpolld-data-utils.h | 6 |
3 files changed, 42 insertions, 23 deletions
diff --git a/daemons/lvmpolld/lvmpolld-core.c b/daemons/lvmpolld/lvmpolld-core.c index 73940473b..f5a442dfc 100644 --- a/daemons/lvmpolld/lvmpolld-core.c +++ b/daemons/lvmpolld/lvmpolld-core.c @@ -386,12 +386,18 @@ static const char **cmdargv_ctr(lvmpolld_lv_t *pdlv, unsigned abort) !add_to_cmdargv(&cmd_argv, "--abort", &i, MIN_SIZE)) goto err; - /* FIXME: one of: "convert", "pvmove", "merge", "merge_thin" */ - if (!add_to_cmdargv(&cmd_argv, polling_ops[pdlv->type], &i, MIN_SIZE)) + /* one of: "convert", "pvmove", "merge", "merge_thin" */ + if (!add_to_cmdargv(&cmd_argv, "--poll-operation", &i, MIN_SIZE) || + !add_to_cmdargv(&cmd_argv, polling_ops[pdlv->type], &i, MIN_SIZE)) goto err; /* either vg_uuid+\0\0\0\0... or vg_uuid+lv_uuid */ - if (!add_to_cmdargv(&cmd_argv, pdlv->lvid, &i, MIN_SIZE)) + if (!add_to_cmdargv(&cmd_argv, "--uuid", &i, MIN_SIZE) || + !add_to_cmdargv(&cmd_argv, pdlv->lvid, &i, MIN_SIZE)) + goto err; + + /* vgname */ + if (!add_to_cmdargv(&cmd_argv, pdlv->vgname, &i, MIN_SIZE)) goto err; /* terminating NULL */ @@ -577,9 +583,9 @@ 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, enum poll_type type, - unsigned abort, lvmpolld_store_t *pdst, - unsigned background) + const char *lvid, const char *vgname, + enum poll_type type, unsigned abort, + lvmpolld_store_t *pdst, unsigned background) { const char **cmdargv; lvmpolld_lv_t *pdlv; @@ -592,7 +598,7 @@ static lvmpolld_lv_t *construct_pdlv(request req, lvmpolld_state_t *ls, return NULL; } - pdlv = pdlv_create(ls, lvid, type, sinterval, 2 * interval, pdst, + pdlv = pdlv_create(ls, lvid, vgname, type, sinterval, 2 * interval, pdst, (abort ? NULL : parse_line_for_percents), background); if (!pdlv) { @@ -633,10 +639,21 @@ static response poll_init(client_handle h, lvmpolld_state_t *ls, request req, en lvmpolld_store_t *pdst; const char *lvid = daemon_request_str(req, "lvid", 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); + if (!lvid) + /* TODO: "response" == "fail" is used with internall errors only */ + /* perhaps add new type of response */ + return reply_fail("lvid required"); + + if (!vgname) + /* TODO: "response" == "fail" is used with internall errors only */ + /* perhaps add new type of response */ + return reply_fail("vgname required"); + background = background > 1 ? 1 : 0; assert(type < POLL_TYPE_MAX); @@ -675,7 +692,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, type, abort, pdst, background); + pdlv = construct_pdlv(req, ls, lvid, vgname, type, abort, pdst, + background); if (!pdlv) { pdst_unlock(pdst); return reply_fail("lvmpolld internal error"); @@ -696,6 +714,8 @@ static response poll_init(client_handle h, lvmpolld_state_t *ls, request req, en pdst_unlock(pdst); + /* TODO: "response" == "fail" is used with internall errors only */ + /* perhaps add new type of response */ return daemon_reply_simple("OK", NULL); } diff --git a/daemons/lvmpolld/lvmpolld-data-utils.c b/daemons/lvmpolld/lvmpolld-data-utils.c index fb8b6c90c..f537b21eb 100644 --- a/daemons/lvmpolld/lvmpolld-data-utils.c +++ b/daemons/lvmpolld/lvmpolld-data-utils.c @@ -16,8 +16,9 @@ #include "lvmpolld-data-utils.h" lvmpolld_lv_t *pdlv_create(lvmpolld_state_t *ls, const char *lvid, - enum poll_type type, const char *sinterval, - unsigned pdtimeout, lvmpolld_store_t *pdst, + const char *vgname, enum poll_type type, + const char *sinterval, unsigned pdtimeout, + lvmpolld_store_t *pdst, lvmpolld_parse_output_fn_t parse_fn, unsigned background) { @@ -25,6 +26,7 @@ lvmpolld_lv_t *pdlv_create(lvmpolld_state_t *ls, const char *lvid, .ls = ls, .type = type, .lvid = dm_strdup(lvid), + .vgname = dm_strdup(vgname), .sinterval = sinterval ? dm_strdup(sinterval) : NULL, .pdtimeout = pdtimeout ?: PDTIMEOUT_DEF, .percent = DM_PERCENT_0, @@ -34,30 +36,24 @@ 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) { + if (!pdlv || !tmp.lvid || !tmp.vgname || (sinterval && !tmp.sinterval)) { dm_free((void *)tmp.lvid); + dm_free((void *)tmp.vgname); dm_free((void *)tmp.sinterval); return NULL; } memcpy(pdlv, &tmp, sizeof(*pdlv)); - if (!pdlv->lvid) - goto lvid_err; - - if (sinterval && !pdlv->sinterval) - goto sint_err; - if (pthread_mutex_init(&pdlv->lock, NULL)) - goto mutex_err; + goto err; return pdlv; -mutex_err: +err: dm_free((void *)pdlv->sinterval); -sint_err: dm_free((void *)pdlv->lvid); -lvid_err: + dm_free((void *)pdlv->vgname); dm_free((void *)pdlv); return NULL; @@ -66,6 +62,7 @@ lvid_err: void pdlv_destroy(lvmpolld_lv_t *pdlv) { dm_free((void *)pdlv->lvid); + dm_free((void *)pdlv->vgname); dm_free((void *)pdlv->sinterval); dm_free((void *)pdlv->cmdargv); diff --git a/daemons/lvmpolld/lvmpolld-data-utils.h b/daemons/lvmpolld/lvmpolld-data-utils.h index bf7b8f4e1..64b732bd8 100644 --- a/daemons/lvmpolld/lvmpolld-data-utils.h +++ b/daemons/lvmpolld/lvmpolld-data-utils.h @@ -60,6 +60,7 @@ typedef struct lvmpolld_lv { const enum poll_type type; /* full lvid vguuid+lvuuid. may also be vguuid+zeroes -> PVMOVE */ const char *const lvid; + const char *const vgname; /* either fullname vg/lv or vgname only */ /* const char *name; */ const unsigned pdtimeout; /* in seconds */ @@ -86,8 +87,9 @@ typedef struct lvmpolld_lv { /* only call with appropriate lvmpolld_store_t lock held */ lvmpolld_lv_t *pdlv_create(struct lvmpolld_state *ls, const char *lvid, - const enum poll_type type, const char *sinterval, - unsigned pdtimeout, lvmpolld_store_t *pdst, + const char *vgname, const enum poll_type type, + const char *sinterval, unsigned pdtimeout, + lvmpolld_store_t *pdst, lvmpolld_parse_output_fn_t parse_fn, unsigned background); |