summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2010-01-05 20:56:51 +0000
committerMike Snitzer <snitzer@redhat.com>2010-01-05 20:56:51 +0000
commit7a8fa6aaab54a9da7289637e016eef553168bfe2 (patch)
treea93b1467523d000261cb4a23e493d7bf087d98f5 /tools
parent0e06c92fdf1973bf8a8e0096b7beaf6fc687f10e (diff)
downloadlvm2-7a8fa6aaab54a9da7289637e016eef553168bfe2.tar.gz
lvm2-7a8fa6aaab54a9da7289637e016eef553168bfe2.tar.xz
lvm2-7a8fa6aaab54a9da7289637e016eef553168bfe2.zip
Add a [--poll {y|n}] flag to vgchange and lvchange to control whether
the background polldaemon is allowed to start. It can be used standalone or in conjunction with --refresh or --available y. Control over when the background polldaemon starts will be particularly important for snapshot-merge of a root filesystem. Dracut will be updated to activate all LVs with: --poll n The lvm2-monitor initscript will start polling with: --poll y NOTE: Because we currently have no way of knowing if a background polldaemon is active for a given LV the following limitations exist and have been deemed acceptable: 1) it is not possible to stop an active polldaemon; so the lvm2-monitor initscript doesn't stop running polldaemon(s) 2) redundant polldaemon instances will be started for all specified LVs if vgchange or lvchange are repeatedly used with '--poll y' Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/args.h1
-rw-r--r--tools/commands.h8
-rw-r--r--tools/lvchange.c37
-rw-r--r--tools/vgchange.c64
4 files changed, 99 insertions, 11 deletions
diff --git a/tools/args.h b/tools/args.h
index 1f2427b6..85f6a3cf 100644
--- a/tools/args.h
+++ b/tools/args.h
@@ -64,6 +64,7 @@ arg(dataalignmentoffset_ARG, '\0', "dataalignmentoffset", size_kb_arg, 0)
arg(virtualoriginsize_ARG, '\0', "virtualoriginsize", size_mb_arg, 0)
arg(virtualsize_ARG, '\0', "virtualsize", size_mb_arg, 0)
arg(noudevsync_ARG, '\0', "noudevsync", NULL, 0)
+arg(poll_ARG, '\0', "poll", yes_no_arg, 0)
/* Allow some variations */
arg(resizable_ARG, '\0', "resizable", yes_no_arg, 0)
diff --git a/tools/commands.h b/tools/commands.h
index 85222e4e..032bde64 100644
--- a/tools/commands.h
+++ b/tools/commands.h
@@ -72,6 +72,7 @@ xx(lvchange,
"\t[--ignorelockingfailure]\n"
"\t[--ignoremonitoring]\n"
"\t[--monitor {y|n}]\n"
+ "\t[--poll {y|n}]\n"
"\t[--noudevsync]\n"
"\t[-M|--persistent y|n] [--major major] [--minor minor]\n"
"\t[-P|--partial] " "\n"
@@ -88,8 +89,8 @@ xx(lvchange,
alloc_ARG, autobackup_ARG, available_ARG, contiguous_ARG, force_ARG,
ignorelockingfailure_ARG, ignoremonitoring_ARG, major_ARG, minor_ARG,
monitor_ARG, noudevsync_ARG, partial_ARG, permission_ARG, persistent_ARG,
- readahead_ARG, resync_ARG, refresh_ARG, addtag_ARG, deltag_ARG, test_ARG,
- yes_ARG)
+ poll_ARG, readahead_ARG, resync_ARG, refresh_ARG, addtag_ARG, deltag_ARG,
+ test_ARG, yes_ARG)
xx(lvconvert,
"Change logical volume layout",
@@ -688,6 +689,7 @@ xx(vgchange,
"\t[--ignorelockingfailure]\n"
"\t[--ignoremonitoring]\n"
"\t[--monitor {y|n}]\n"
+ "\t[--poll {y|n}]\n"
"\t[--noudevsync]\n"
"\t[--refresh]\n"
"\t[-t|--test]" "\n"
@@ -707,7 +709,7 @@ xx(vgchange,
addtag_ARG, alloc_ARG, allocation_ARG, autobackup_ARG, available_ARG,
clustered_ARG, deltag_ARG, ignorelockingfailure_ARG, ignoremonitoring_ARG,
logicalvolume_ARG, maxphysicalvolumes_ARG, monitor_ARG, noudevsync_ARG,
- partial_ARG, physicalextentsize_ARG, refresh_ARG, resizeable_ARG,
+ partial_ARG, physicalextentsize_ARG, poll_ARG, refresh_ARG, resizeable_ARG,
resizable_ARG, test_ARG, uuid_ARG)
xx(vgck,
diff --git a/tools/lvchange.c b/tools/lvchange.c
index f43b07af..f01d560a 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -101,6 +101,22 @@ static int lvchange_monitoring(struct cmd_context *cmd,
return 1;
}
+static int lvchange_background_polling(struct cmd_context *cmd,
+ struct logical_volume *lv)
+{
+ struct lvinfo info;
+
+ if (!lv_info(cmd, lv, &info, 0, 0) || !info.exists) {
+ log_error("Logical volume, %s, is not active", lv->name);
+ return 0;
+ }
+
+ if (background_polling())
+ lv_spawn_background_polling(cmd, lv);
+
+ return 1;
+}
+
static int lvchange_availability(struct cmd_context *cmd,
struct logical_volume *lv)
{
@@ -135,7 +151,8 @@ static int lvchange_availability(struct cmd_context *cmd,
return_0;
}
- lv_spawn_background_polling(cmd, lv);
+ if (background_polling())
+ lv_spawn_background_polling(cmd, lv);
}
return 1;
@@ -577,6 +594,9 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
(is_static() || arg_count(cmd, ignoremonitoring_ARG)) ?
DMEVENTD_MONITOR_IGNORE : DEFAULT_DMEVENTD_MONITOR));
+ init_background_polling(arg_int_value(cmd, poll_ARG,
+ DEFAULT_BACKGROUND_POLLING));
+
/* access permission change */
if (arg_count(cmd, permission_ARG)) {
if (!archive(lv->vg)) {
@@ -679,6 +699,15 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
}
}
+ if (!arg_count(cmd, available_ARG) &&
+ !arg_count(cmd, refresh_ARG) &&
+ arg_count(cmd, poll_ARG)) {
+ if (!lvchange_background_polling(cmd, lv)) {
+ stack;
+ return ECMD_FAILED;
+ }
+ }
+
if (doit != docmds) {
stack;
return ECMD_FAILED;
@@ -695,10 +724,10 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv)
&& !arg_count(cmd, persistent_ARG) && !arg_count(cmd, addtag_ARG)
&& !arg_count(cmd, deltag_ARG) && !arg_count(cmd, refresh_ARG)
&& !arg_count(cmd, alloc_ARG) && !arg_count(cmd, monitor_ARG)
- && !arg_count(cmd, resync_ARG)) {
+ && !arg_count(cmd, poll_ARG) && !arg_count(cmd, resync_ARG)) {
log_error("Need 1 or more of -a, -C, -j, -m, -M, -p, -r, "
- "--resync, --refresh, --alloc, --addtag, --deltag "
- "or --monitor");
+ "--resync, --refresh, --alloc, --addtag, --deltag, "
+ "--monitor or --poll");
return EINVALID_CMD_LINE;
}
diff --git a/tools/vgchange.c b/tools/vgchange.c
index 1c52e75f..9b6b27ff 100644
--- a/tools/vgchange.c
+++ b/tools/vgchange.c
@@ -51,6 +51,39 @@ static int _monitor_lvs_in_vg(struct cmd_context *cmd,
return count;
}
+static int _poll_lvs_in_vg(struct cmd_context *cmd,
+ struct volume_group *vg)
+{
+ struct lv_list *lvl;
+ struct logical_volume *lv;
+ struct lvinfo info;
+ int lv_active;
+ int count = 0;
+
+ dm_list_iterate_items(lvl, &vg->lvs) {
+ lv = lvl->lv;
+
+ if (!lv_info(cmd, lv, &info, 0, 0))
+ lv_active = 0;
+ else
+ lv_active = info.exists;
+
+ if (!lv_active ||
+ !(lv->status & (PVMOVE|CONVERTING)))
+ continue;
+
+ lv_spawn_background_polling(cmd, lv);
+ count++;
+ }
+
+ /*
+ * returns the number of polled devices
+ * - there is no way to know if lv is already being polled
+ */
+
+ return count;
+}
+
static int _activate_lvs_in_vg(struct cmd_context *cmd,
struct volume_group *vg, int activate)
{
@@ -95,7 +128,8 @@ static int _activate_lvs_in_vg(struct cmd_context *cmd,
} else if (!activate_lv(cmd, lv))
continue;
- if (activate != CHANGE_AN && activate != CHANGE_ALN &&
+ if (background_polling() &&
+ activate != CHANGE_AN && activate != CHANGE_ALN &&
(lv->status & (PVMOVE|CONVERTING)))
lv_spawn_background_polling(cmd, lv);
@@ -125,6 +159,20 @@ static int _vgchange_monitoring(struct cmd_context *cmd, struct volume_group *vg
return ECMD_PROCESSED;
}
+static int _vgchange_background_polling(struct cmd_context *cmd, struct volume_group *vg)
+{
+ int polled;
+
+ if (lvs_in_vg_activated(vg) && background_polling()) {
+ polled = _poll_lvs_in_vg(cmd, vg);
+ log_print("Background polling started for %d logical volume(s) "
+ "in volume group \"%s\"",
+ polled, vg->name);
+ }
+
+ return ECMD_PROCESSED;
+}
+
static int _vgchange_available(struct cmd_context *cmd, struct volume_group *vg)
{
int lv_open, active, monitored;
@@ -490,12 +538,18 @@ static int vgchange_single(struct cmd_context *cmd, const char *vg_name,
(is_static() || arg_count(cmd, ignoremonitoring_ARG)) ?
DMEVENTD_MONITOR_IGNORE : DEFAULT_DMEVENTD_MONITOR));
+ init_background_polling(arg_int_value(cmd, poll_ARG,
+ DEFAULT_BACKGROUND_POLLING));
+
if (arg_count(cmd, available_ARG))
r = _vgchange_available(cmd, vg);
else if (arg_count(cmd, monitor_ARG))
r = _vgchange_monitoring(cmd, vg);
+ else if (arg_count(cmd, poll_ARG))
+ r = _vgchange_background_polling(cmd, vg);
+
else if (arg_count(cmd, resizeable_ARG))
r = _vgchange_resizeable(cmd, vg);
@@ -538,9 +592,11 @@ int vgchange(struct cmd_context *cmd, int argc, char **argv)
arg_count(cmd, addtag_ARG) + arg_count(cmd, uuid_ARG) +
arg_count(cmd, physicalextentsize_ARG) +
arg_count(cmd, clustered_ARG) + arg_count(cmd, alloc_ARG) +
- arg_count(cmd, monitor_ARG) + arg_count(cmd, refresh_ARG))) {
- log_error("One of -a, -c, -l, -p, -s, -x, --refresh, "
- "--uuid, --alloc, --addtag or --deltag required");
+ arg_count(cmd, monitor_ARG) + arg_count(cmd, poll_ARG) +
+ arg_count(cmd, refresh_ARG))) {
+ log_error("Need 1 or more of -a, -c, -l, -p, -s, -x, "
+ "--refresh, --uuid, --alloc, --addtag, --deltag, "
+ "--monitor or --poll");
return EINVALID_CMD_LINE;
}