summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Kozina <okozina@redhat.com>2015-01-26 14:20:58 +0100
committerOndrej Kozina <okozina@redhat.com>2015-04-01 11:01:21 +0200
commitd737a275cb86114bdaf8c52827735e22eaf8a7da (patch)
tree5bf8f9f5c7c1dc743de7b8aef3543adb7fb0fac2
parent266a0cccec7bcd6bfe9333e1fadefe23c882a75c (diff)
downloadlvm2-d737a275cb86114bdaf8c52827735e22eaf8a7da.tar.gz
lvmpolld: store VG name to pass it later in lvpoll cmd line
-rw-r--r--daemons/lvmpolld/lvmpolld-core.c36
-rw-r--r--daemons/lvmpolld/lvmpolld-data-utils.c23
-rw-r--r--daemons/lvmpolld/lvmpolld-data-utils.h6
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);