diff options
author | Mike Snitzer <snitzer@redhat.com> | 2010-01-05 20:56:51 +0000 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2010-01-05 20:56:51 +0000 |
commit | 7a8fa6aaab54a9da7289637e016eef553168bfe2 (patch) | |
tree | a93b1467523d000261cb4a23e493d7bf087d98f5 /tools | |
parent | 0e06c92fdf1973bf8a8e0096b7beaf6fc687f10e (diff) | |
download | lvm2-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.h | 1 | ||||
-rw-r--r-- | tools/commands.h | 8 | ||||
-rw-r--r-- | tools/lvchange.c | 37 | ||||
-rw-r--r-- | tools/vgchange.c | 64 |
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; } |