diff options
author | David Teigland <teigland@redhat.com> | 2015-05-13 14:35:05 -0500 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2015-06-02 11:31:30 -0500 |
commit | 45d94427fe61db3794c6b0fc5acc506afc5d315a (patch) | |
tree | ea00911ee87d9e9b32461cbe05dfa19481ac094d | |
parent | d17df8ab6b8cef15149266c321a81cf6808a1ac5 (diff) | |
download | lvm2-45d94427fe61db3794c6b0fc5acc506afc5d315a.tar.gz |
tools: locking support for tools
-rw-r--r-- | tools/args.h | 7 | ||||
-rw-r--r-- | tools/commands.h | 31 | ||||
-rw-r--r-- | tools/lvmcmdline.c | 34 | ||||
-rw-r--r-- | tools/tools.h | 5 |
4 files changed, 61 insertions, 16 deletions
diff --git a/tools/args.h b/tools/args.h index 7b715f50c..aa084e926 100644 --- a/tools/args.h +++ b/tools/args.h @@ -50,6 +50,13 @@ arg(ignoremonitoring_ARG, '\0', "ignoremonitoring", NULL, 0) arg(ignoreskippedcluster_ARG, '\0', "ignoreskippedcluster", NULL, 0) arg(ignoreunsupported_ARG, '\0', "ignoreunsupported", NULL, 0) arg(labelsector_ARG, '\0', "labelsector", int_arg, 0) +arg(lockgl_ARG, '\0', "lock-gl", string_arg, 0) +arg(lockvg_ARG, '\0', "lock-vg", string_arg, 0) +arg(locklv_ARG, '\0', "lock-lv", string_arg, 0) +arg(lockopt_ARG, '\0', "lock-opt", string_arg, 0) +arg(lockstart_ARG, '\0', "lock-start", NULL, 0) +arg(lockstop_ARG, '\0', "lock-stop", NULL, 0) +arg(locktype_ARG, '\0', "lock-type", string_arg, 0) arg(maxrecoveryrate_ARG, '\0', "maxrecoveryrate", size_kb_arg, 0) arg(merge_ARG, '\0', "merge", NULL, 0) arg(mergedconfig_ARG, '\0', "mergedconfig", NULL, 0) diff --git a/tools/commands.h b/tools/commands.h index 8e87681ea..5bb3a69a4 100644 --- a/tools/commands.h +++ b/tools/commands.h @@ -392,7 +392,7 @@ xx(lvcreate, xx(lvdisplay, "Display information about a logical volume", - PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_FOREIGN_VGS, + PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_FOREIGN_VGS | LOCKD_VG_SH, "lvdisplay\n" "\t[-a|--all]\n" "\t[-c|--colon]\n" @@ -643,7 +643,7 @@ xx(lvresize, xx(lvs, "Display information about logical volumes", - PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_FOREIGN_VGS, + PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_FOREIGN_VGS | LOCKD_VG_SH, "lvs\n" "\t[-a|--all]\n" "\t[--aligned]\n" @@ -681,7 +681,7 @@ xx(lvs, xx(lvscan, "List all logical volumes in all volume groups", - PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT, + PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | LOCKD_VG_SH, "lvscan\n" "\t[-a|--all]\n" "\t[-b|--blockdevice]\n" @@ -741,7 +741,7 @@ xx(pvresize, xx(pvck, "Check the consistency of physical volume(s)", - 0, + LOCKD_VG_SH, "pvck " "\t[--commandprofile ProfileName]\n" "\t[-d|--debug]\n" @@ -807,7 +807,7 @@ xx(pvdata, xx(pvdisplay, "Display various attributes of physical volume(s)", - CACHE_VGMETADATA | PERMITTED_READ_ONLY | ENABLE_ALL_DEVS | ENABLE_FOREIGN_VGS, + CACHE_VGMETADATA | PERMITTED_READ_ONLY | ENABLE_ALL_DEVS | ENABLE_FOREIGN_VGS | LOCKD_VG_SH, "pvdisplay\n" "\t[-c|--colon]\n" "\t[--commandprofile ProfileName]\n" @@ -916,7 +916,7 @@ xx(pvremove, xx(pvs, "Display information about physical volumes", - CACHE_VGMETADATA | PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_ALL_DEVS | ENABLE_FOREIGN_VGS, + CACHE_VGMETADATA | PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_ALL_DEVS | ENABLE_FOREIGN_VGS | LOCKD_VG_SH, "pvs\n" "\t[-a|--all]\n" "\t[--aligned]\n" @@ -954,7 +954,7 @@ xx(pvs, xx(pvscan, "List all physical volumes", - PERMITTED_READ_ONLY | ENABLE_FOREIGN_VGS, + PERMITTED_READ_ONLY | ENABLE_FOREIGN_VGS | LOCKD_VG_SH, "pvscan\n" "\t[-b|--background]\n" "\t[--cache [-a|--activate ay] [ DevicePath | -j|--major major --minor minor]...]\n" @@ -991,7 +991,7 @@ xx(tags, xx(vgcfgbackup, "Backup volume group configuration(s)", - PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_FOREIGN_VGS, + PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_FOREIGN_VGS | LOCKD_VG_SH, "vgcfgbackup\n" "\t[--commandprofile ProfileName]\n" "\t[-d|--debug]\n" @@ -1071,11 +1071,12 @@ xx(vgchange, metadataprofile_ARG, monitor_ARG, noudevsync_ARG, metadatacopies_ARG, vgmetadatacopies_ARG, partial_ARG, physicalextentsize_ARG, poll_ARG, refresh_ARG, resizeable_ARG, resizable_ARG, select_ARG, sysinit_ARG, - systemid_ARG, test_ARG, uuid_ARG) + systemid_ARG, test_ARG, uuid_ARG, lockstart_ARG, lockstop_ARG, locktype_ARG, lockopt_ARG, + force_ARG) xx(vgck, "Check the consistency of volume group(s)", - ALL_VGS_IS_DEFAULT, + ALL_VGS_IS_DEFAULT | LOCKD_VG_SH, "vgck " "\t[--commandprofile ProfileName]\n" "\t[-d|--debug]\n" @@ -1135,11 +1136,11 @@ xx(vgcreate, physicalextentsize_ARG, test_ARG, force_ARG, zero_ARG, labelsector_ARG, metadatasize_ARG, pvmetadatacopies_ARG, metadatacopies_ARG, vgmetadatacopies_ARG, dataalignment_ARG, dataalignmentoffset_ARG, - systemid_ARG) + systemid_ARG, locktype_ARG) xx(vgdisplay, "Display volume group information", - PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_FOREIGN_VGS, + PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_FOREIGN_VGS | LOCKD_VG_SH, "vgdisplay\n" "\t[-A|--activevolumegroups]\n" "\t[-c|--colon | -s|--short | -v|--verbose]\n" @@ -1187,7 +1188,7 @@ xx(vgdisplay, xx(vgexport, "Unregister volume group(s) from the system", - ALL_VGS_IS_DEFAULT, + ALL_VGS_IS_DEFAULT | LOCKD_VG_SH, "vgexport\n" "\t[-a|--all]\n" "\t[--commandprofile ProfileName]\n" @@ -1327,7 +1328,7 @@ xx(vgrename, xx(vgs, "Display information about volume groups", - PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_FOREIGN_VGS, + PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_FOREIGN_VGS | LOCKD_VG_SH, "vgs\n" "\t[--aligned]\n" "\t[--binary]\n" @@ -1364,7 +1365,7 @@ xx(vgs, xx(vgscan, "Search for all volume groups", - PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_FOREIGN_VGS, + PERMITTED_READ_ONLY | ALL_VGS_IS_DEFAULT | ENABLE_FOREIGN_VGS | LOCKD_VG_SH, "vgscan " "\t[--cache]\n" "\t[--commandprofile ProfileName]\n" diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c index 29fffb311..92cc933c3 100644 --- a/tools/lvmcmdline.c +++ b/tools/lvmcmdline.c @@ -286,6 +286,12 @@ int activation_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_v av->ui_value = CHANGE_AEY; } + else if (!strcmp(av->value, "s") || !strcmp(av->value, "sy") || + !strcmp(av->value, "ys")) { + av->i_value = CHANGE_ASY; + av->ui_value = CHANGE_ASY; + } + else if (!strcmp(av->value, "y")) { av->i_value = CHANGE_AY; av->ui_value = CHANGE_AY; @@ -573,6 +579,20 @@ int string_arg(struct cmd_context *cmd __attribute__((unused)), return 1; } +int arg_tag_count(int argc, char **argv) +{ + const char *name; + int count = 0; + int i; + + for (i = 0; i < argc; i++) { + name = argv[i]; + if (*name == '@') + count++; + } + return count; +} + int tag_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av) { char *pos = av->value; @@ -751,6 +771,7 @@ void lvm_register_commands(void) yes_ARG, \ quiet_ARG, config_ARG, \ commandprofile_ARG, \ + lockgl_ARG, lockvg_ARG, locklv_ARG, \ profile_ARG, -1); #include "commands.h" #undef xx @@ -1039,6 +1060,15 @@ static int _get_settings(struct cmd_context *cmd) cmd->current_settings.backup = 0; } + if (arg_is_set(cmd, lockgl_ARG)) + cmd->lock_gl_mode = arg_str_value(cmd, lockgl_ARG, NULL); + if (arg_is_set(cmd, lockvg_ARG)) + cmd->lock_vg_mode = arg_str_value(cmd, lockvg_ARG, NULL); + if (cmd->command->flags & LOCKD_VG_SH) + cmd->lockd_vg_default_sh = 1; + if (arg_is_set(cmd, locklv_ARG)) + cmd->lock_lv_mode = arg_str_value(cmd, locklv_ARG, NULL); + cmd->partial_activation = 0; cmd->degraded_activation = 0; activation_mode = find_config_tree_str(cmd, activation_mode_CFG, NULL); @@ -1079,8 +1109,10 @@ static int _get_settings(struct cmd_context *cmd) cmd->include_foreign_vgs = arg_is_set(cmd, foreign_ARG) ? 1 : 0; cmd->include_active_foreign_vgs = cmd->command->flags & ENABLE_FOREIGN_VGS ? 1 : 0; - if (!arg_count(cmd, sysinit_ARG)) + if (!arg_count(cmd, sysinit_ARG)) { lvmetad_connect_or_warn(); + lvmlockd_connect_or_warn(); + } if (arg_count(cmd, nosuffix_ARG)) cmd->current_settings.suffix = 0; diff --git a/tools/tools.h b/tools/tools.h index e959d8007..66bdbb07d 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -28,6 +28,7 @@ #include "archiver.h" #include "lvmcache.h" #include "lvmetad.h" +#include "lvmlockd.h" #include "lvm-version.h" #include "config.h" #include "defaults.h" @@ -110,6 +111,8 @@ struct arg_value_group_list { #define ONE_VGNAME_ARG 0x00000010 /* Command is allowed to read foreign VGs. */ #define ENABLE_FOREIGN_VGS 0x00000020 +/* Command needs a shared lock on a VG; it only reads the VG. */ +#define LOCKD_VG_SH 0x00000040 /* a register of the lvm commands */ struct command { @@ -174,6 +177,8 @@ unsigned grouped_arg_is_set(const struct arg_values *av, int a); const char *grouped_arg_str_value(const struct arg_values *av, int a, const char *def); int32_t grouped_arg_int_value(const struct arg_values *av, int a, const int32_t def); +int arg_tag_count(int argc, char **argv); + const char *command_name(struct cmd_context *cmd); int pvmove_poll(struct cmd_context *cmd, const char *pv_name, const char *uuid, |