summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndrej Kozina <okozina@redhat.com>2015-03-05 16:01:34 +0100
committerOndrej Kozina <okozina@redhat.com>2015-04-01 11:01:22 +0200
commitbb0f2776d2a819c36230a6367211adfcda45bff1 (patch)
treea25dfab5fe329bb516c703df57713523adf42906
parentd2ec2340fcb864461ea6127e64a630352b970274 (diff)
downloadlvm2-bb0f2776d2a819c36230a6367211adfcda45bff1.tar.gz
polldaemon: don't complie lvmpolld code when not needed
-rw-r--r--tools/polldaemon.c223
1 files changed, 109 insertions, 114 deletions
diff --git a/tools/polldaemon.c b/tools/polldaemon.c
index a182df0c8..90d1c3a0d 100644
--- a/tools/polldaemon.c
+++ b/tools/polldaemon.c
@@ -22,17 +22,6 @@
#define WAIT_AT_LEAST_NANOSECS 100000
-struct poll_lv_list {
- struct dm_list list;
- char *uuid;
- char *name;
-};
-
-typedef struct {
- struct daemon_parms *parms;
- struct dm_list plvs;
-} lvmpolld_parms_t;
-
progress_t poll_mirror_progress(struct cmd_context *cmd,
struct logical_volume *lv, const char *name,
struct daemon_parms *parms)
@@ -168,15 +157,6 @@ static void _sleep_and_rescan_devices(struct daemon_parms *parms)
}
}
-static void _sleep_a_while(unsigned seconds)
-{
- const struct timespec req = {
- .tv_sec = seconds
- };
-
- nanosleep(seconds ? &req : &_mintime, NULL);
-}
-
int wait_for_single_lv(struct cmd_context *cmd, struct poll_operation_id *id,
struct daemon_parms *parms)
{
@@ -300,50 +280,6 @@ static struct poll_id_list* poll_id_list_create(struct dm_pool *mem,
return idl;
}
-int report_progress(struct cmd_context *cmd, struct poll_operation_id *id,
- struct daemon_parms *parms)
-{
- struct volume_group *vg;
- struct logical_volume *lv;
-
- vg = parms->poll_fns->get_copy_vg(cmd, id->vg_name, NULL, 1);
- if (vg_read_error(vg)) {
- release_vg(vg);
- log_error("Can't reread VG for %s", id->display_name);
- return 0;
- }
-
- lv = parms->poll_fns->get_copy_lv(cmd, vg, id->lv_name, id->uuid, parms->lv_type);
- if (!lv && parms->lv_type == PVMOVE) {
- log_print_unless_silent("%s: no pvmove in progress - already finished or aborted.",
- id->display_name);
- unlock_and_release_vg(cmd, vg, vg->name);
- return 1;
- }
-
- if (!lv) {
- log_warn("Can't find LV in %s for %s. Already finished or removed.",
- vg->name, id->display_name);
- unlock_and_release_vg(cmd, vg, vg->name);
- return 1;
- }
-
- if (!lv_is_active_locally(lv)) {
- log_print_unless_silent("%s: Interrupted: No longer active.", id->display_name);
- unlock_and_release_vg(cmd, vg, vg->name);
- return 1;
- }
-
- if (parms->poll_fns->poll_progress(cmd, lv, id->display_name, parms) == PROGRESS_CHECK_FAILED) {
- unlock_and_release_vg(cmd, vg, vg->name);
- return_0;
- }
-
- unlock_and_release_vg(cmd, vg, vg->name);
-
- return 1;
-}
-
static int _poll_vg(struct cmd_context *cmd, const char *vgname,
struct volume_group *vg, struct processing_handle *handle)
{
@@ -418,6 +354,76 @@ err:
return ECMD_PROCESSED;
}
+static void _poll_for_all_vgs(struct cmd_context *cmd,
+ struct processing_handle *handle)
+{
+ struct daemon_parms *parms = (struct daemon_parms *) handle->custom_handle;
+
+ while (1) {
+ parms->outstanding_count = 0;
+ process_each_vg(cmd, 0, NULL, READ_FOR_UPDATE, handle, _poll_vg);
+ if (!parms->outstanding_count)
+ break;
+ _nanosleep(parms->interval, 1);
+ }
+}
+
+#ifdef LVMPOLLD_SUPPORT
+struct poll_lv_list {
+ struct dm_list list;
+ char *uuid;
+ char *name;
+};
+
+typedef struct {
+ struct daemon_parms *parms;
+ struct dm_list plvs;
+} lvmpolld_parms_t;
+
+static int report_progress(struct cmd_context *cmd, struct poll_operation_id *id,
+ struct daemon_parms *parms)
+{
+ struct volume_group *vg;
+ struct logical_volume *lv;
+
+ vg = parms->poll_fns->get_copy_vg(cmd, id->vg_name, NULL, 1);
+ if (vg_read_error(vg)) {
+ release_vg(vg);
+ log_error("Can't reread VG for %s", id->display_name);
+ return 0;
+ }
+
+ lv = parms->poll_fns->get_copy_lv(cmd, vg, id->lv_name, id->uuid, parms->lv_type);
+ if (!lv && parms->lv_type == PVMOVE) {
+ log_print_unless_silent("%s: no pvmove in progress - already finished or aborted.",
+ id->display_name);
+ unlock_and_release_vg(cmd, vg, vg->name);
+ return 1;
+ }
+
+ if (!lv) {
+ log_warn("Can't find LV in %s for %s. Already finished or removed.",
+ vg->name, id->display_name);
+ unlock_and_release_vg(cmd, vg, vg->name);
+ return 1;
+ }
+
+ if (!lv_is_active_locally(lv)) {
+ log_print_unless_silent("%s: Interrupted: No longer active.", id->display_name);
+ unlock_and_release_vg(cmd, vg, vg->name);
+ return 1;
+ }
+
+ if (parms->poll_fns->poll_progress(cmd, lv, id->display_name, parms) == PROGRESS_CHECK_FAILED) {
+ unlock_and_release_vg(cmd, vg, vg->name);
+ return_0;
+ }
+
+ unlock_and_release_vg(cmd, vg, vg->name);
+
+ return 1;
+}
+
/* FIXME: this requires audit after code modifications due to bug in pvmove handling */
/* FIXME: this requires audit after code modifications due to bug in pvmove handling */
/* FIXME: this requires audit after code modifications due to bug in pvmove handling */
@@ -468,20 +474,6 @@ static int _lvmpolld_init_poll_vg(struct cmd_context *cmd, const char *vgname,
return ECMD_PROCESSED;
}
-static void _poll_for_all_vgs(struct cmd_context *cmd,
- struct processing_handle *handle)
-{
- struct daemon_parms *parms = (struct daemon_parms *) handle->custom_handle;
-
- while (1) {
- parms->outstanding_count = 0;
- process_each_vg(cmd, 0, NULL, READ_FOR_UPDATE, handle, _poll_vg);
- if (!parms->outstanding_count)
- break;
- _nanosleep(parms->interval, 1);
- }
-}
-
static void _lvmpolld_poll_for_all_vgs(struct cmd_context *cmd,
struct daemon_parms *parms,
struct processing_handle *handle)
@@ -516,9 +508,47 @@ static void _lvmpolld_poll_for_all_vgs(struct cmd_context *cmd,
report_progress(cmd, &id, lpdp.parms);
}
- _sleep_a_while(lpdp.parms->interval);
+ _nanosleep(lpdp.parms->interval, 0);
+ }
+}
+
+static int _lvmpoll_daemon(struct cmd_context *cmd, struct poll_operation_id *id,
+ struct daemon_parms *parms)
+{
+ int r;
+ struct processing_handle *handle = NULL;
+ unsigned finished = 0;
+
+ if (id) {
+ r = lvmpolld_poll_init(cmd, id->vg_name, id->lv_name, id->uuid,
+ parms->lv_type, parms->interval,
+ parms->aborting);
+
+ while (r && !parms->background && !finished) {
+ if (!(r = lvmpolld_request_info(id->uuid, parms->aborting, &finished)))
+ break;
+ if (!finished && !(r = report_progress(cmd, id, parms)))
+ break;
+
+ _nanosleep(parms->interval, 0);
+ }
+
+ return r ? ECMD_PROCESSED : ECMD_FAILED;
+ } else {
+ /* process all in-flight operations */
+ if (!(handle = init_processing_handle(cmd))) {
+ log_error("Failed to initialize processing handle.");
+ return ECMD_FAILED;
+ } else {
+ _lvmpolld_poll_for_all_vgs(cmd, parms, handle);
+ destroy_processing_handle(cmd, handle);
+ return ECMD_PROCESSED;
+ }
}
}
+#else
+# define _lvmpoll_daemon(cmd, id, parms) (ECMD_FAILED)
+#endif /* LVMPOLLD_SUPPORT */
/*
* Only allow *one* return from poll_daemon() (the parent).
@@ -579,41 +609,6 @@ static int _poll_daemon(struct cmd_context *cmd, struct poll_operation_id *id,
return ret;
}
-static int _lvmpoll_daemon(struct cmd_context *cmd, struct poll_operation_id *id,
- struct daemon_parms *parms)
-{
- int r;
- struct processing_handle *handle = NULL;
- unsigned finished = 0;
-
- if (id) {
- r = lvmpolld_poll_init(cmd, id->vg_name, id->lv_name, id->uuid,
- parms->lv_type, parms->interval,
- parms->aborting);
-
- while (r && !parms->background && !finished) {
- if (!(r = lvmpolld_request_info(id->uuid, parms->aborting, &finished)))
- break;
- if (!finished && !(r = report_progress(cmd, id, parms)))
- break;
-
- _sleep_a_while(parms->interval);
- }
-
- return r ? ECMD_PROCESSED : ECMD_FAILED;
- } else {
- /* process all in-flight operations */
- if (!(handle = init_processing_handle(cmd))) {
- log_error("Failed to initialize processing handle.");
- return ECMD_FAILED;
- } else {
- _lvmpolld_poll_for_all_vgs(cmd, parms, handle);
- destroy_processing_handle(cmd, handle);
- return ECMD_PROCESSED;
- }
- }
-}
-
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)