summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* lvchange: add clustered vg checkdev-dct-cmd-defs64David Teigland2016-12-211-0/+6
| | | | Put this back after it disappeared in the lvchange rework.
* lvconvert: remove unused codeDavid Teigland2016-12-201-1731/+325
|
* lvconvert: use command defs for raid/mirror typesDavid Teigland2016-12-204-797/+323
| | | | | | | | | | All lvconvert functionality has been moved out of the previous monolithic lvconvert code, except conversions related to raid/mirror/striped/linear. This switches that remaining code to be based on command defs, and standard process_each_lv arg processing. This final switch results in quite a bit of dead code that is also removed.
* tests: use swapmetadataDavid Teigland2016-12-205-33/+33
| | | | and some other pool/cache/thin related changes
* lvconvert: use command defs for mergemirrorsDavid Teigland2016-12-205-40/+111
| | | | | and route the generic --merge to one of the specific merge functions
* toollib: find VG name in option values when neededDavid Teigland2016-12-204-2/+162
|
* lvconvert: use command defs for thin/cache/pool creationDavid Teigland2016-12-2010-74/+1394
| | | | Everything related to thin and cache.
* lvconvert: add startpoll command using command defDavid Teigland2016-12-206-18/+86
| | | | | | This is a new explicit version of 'lvconvert LV' which has been an obscure way of triggering polling to be restarted on an LV that was previously converted.
* lvconvert: snapshot: use command definitionsDavid Teigland2016-12-2010-138/+273
| | | | | | | Lift all the snapshot utilities (merge, split, combine) out of the monolithic lvconvert implementation, using the command definitions. The old code associated with these commands is now unused and will be removed separately.
* lvconvert: remove unused calls for repair and replaceDavid Teigland2016-12-201-227/+10
| | | | | repair and replace are no longer called from the monolithic lvconvert code, so remove the unused code.
* lvconvert: repair and replace: use command definitionsDavid Teigland2016-12-204-18/+330
| | | | | | | This lifts the lvconvert --repair and --replace commands out of the monolithic lvconvert implementation. The previous calls into repair/replace can no longer be reached and will be removed in a separate commit.
* lvchange: make use of command definitionsDavid Teigland2016-12-204-454/+426
| | | | | | Reorganize the lvchange code to take advantage of the command definition, and remove the validation that is done by the command definintion rules.
* process_each_lv: add check_single_lv functionDavid Teigland2016-12-2011-15/+38
| | | | | | | | | | | | | | | | | The new check_single_lv() function is called prior to the existing process_single_lv(). If the check function returns 0, the LV will not be processed. The check_single_lv function is meant to be a standard method to validate the combination of specific command + specific LV, and decide if the combination is allowed. The check_single function can be used by anything that calls process_each_lv. As commands are migrated to take advantage of command definitions, each command definition gets its own entry point which calls process_each for itself, passing a pair of check_single/process_single functions which can be specific to the narrowly defined command def.
* commands: new method for defining commandsDavid Teigland2016-12-2028-1836/+7197
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | . Define a prototype for every lvm command. . Match every user command with one definition. . Generate help text and man pages from them. The new file command-lines.in defines a prototype for every unique lvm command. A unique lvm command is a unique combination of: command name + required option args + required positional args. Each of these prototypes also includes the optional option args and optional positional args that the command will accept, a description, and a unique string ID for the definition. Any valid command will match one of the prototypes. Here's an example of the lvresize command definitions from command-lines.in, there are three unique lvresize commands: lvresize --size SizeMB LV OO: --alloc Alloc, --autobackup Bool, --force, --nofsck, --nosync, --noudevsync, --reportformat String, --resizefs, --stripes Number, --stripesize SizeKB, --poolmetadatasize SizeMB OP: PV ... ID: lvresize_by_size DESC: Resize an LV by a specified size. lvresize LV PV ... OO: --alloc Alloc, --autobackup Bool, --force, --nofsck, --nosync, --noudevsync, --reportformat String, --resizefs, --stripes Number, --stripesize SizeKB ID: lvresize_by_pv DESC: Resize an LV by specified PV extents. FLAGS: SECONDARY_SYNTAX lvresize --poolmetadatasize SizeMB LV_thinpool OO: --alloc Alloc, --autobackup Bool, --force, --nofsck, --nosync, --noudevsync, --reportformat String, --stripes Number, --stripesize SizeKB OP: PV ... ID: lvresize_pool_metadata_by_size DESC: Resize a pool metadata SubLV by a specified size. The three commands have separate definitions because they have different required parameters. Required parameters are specified on the first line of the definition. Optional options are listed after OO, and optional positional args are listed after OP. This data is used to generate corresponding command definition structures for lvm in command-lines.h. usage/help output is also auto generated, so it is always in sync with the definitions. Example of the corresponding generated structure in command-lines.h for the first lvresize prototype (these structures are never edited directly): commands[83].name = "lvresize"; commands[83].command_line_id = "lvresize_by_size"; commands[83].command_line_enum = lvresize_by_size_CMD; commands[83].fn = lvresize; commands[83].ro_count = 1; commands[83].rp_count = 1; commands[83].oo_count = 22; commands[83].op_count = 1; commands[83].cmd_flags = 0; commands[83].desc = "DESC: Resize an LV by a specified size."; commands[83].usage = "lvresize --size Number[m|unit] LV" " [ --resizefs, --poolmetadatasize Number[m|unit], COMMON_OPTIONS ]" " [ PV ... ]"; commands[83].usage_common = " [ --alloc contiguous|cling|cling_by_tags|normal|anywhere|inherit, --nosync, --reportformat String, --autobackup y|n, --stripes Number, --stripesize Number[k|unit], --nofsck, --commandprofile String, --config String, --debug, --driverloaded y|n, --help, --profile String, --quiet, --verbose, --version, --yes, --test, --force, --noudevsync ]"; commands[83].required_opt_args[0].opt = size_ARG; commands[83].required_opt_args[0].def.val_bits = val_enum_to_bit(sizemb_VAL); commands[83].required_pos_args[0].pos = 1; commands[83].required_pos_args[0].def.val_bits = val_enum_to_bit(lv_VAL); commands[83].optional_opt_args[0].opt = commandprofile_ARG; commands[83].optional_opt_args[0].def.val_bits = val_enum_to_bit(string_VAL); commands[83].optional_opt_args[1].opt = config_ARG; commands[83].optional_opt_args[1].def.val_bits = val_enum_to_bit(string_VAL); commands[83].optional_opt_args[2].opt = debug_ARG; commands[83].optional_opt_args[3].opt = driverloaded_ARG; commands[83].optional_opt_args[3].def.val_bits = val_enum_to_bit(bool_VAL); commands[83].optional_opt_args[4].opt = help_ARG; commands[83].optional_opt_args[5].opt = profile_ARG; commands[83].optional_opt_args[5].def.val_bits = val_enum_to_bit(string_VAL); commands[83].optional_opt_args[6].opt = quiet_ARG; commands[83].optional_opt_args[7].opt = verbose_ARG; commands[83].optional_opt_args[8].opt = version_ARG; commands[83].optional_opt_args[9].opt = yes_ARG; commands[83].optional_opt_args[10].opt = test_ARG; commands[83].optional_opt_args[11].opt = alloc_ARG; commands[83].optional_opt_args[11].def.val_bits = val_enum_to_bit(alloc_VAL); commands[83].optional_opt_args[12].opt = autobackup_ARG; commands[83].optional_opt_args[12].def.val_bits = val_enum_to_bit(bool_VAL); commands[83].optional_opt_args[13].opt = force_ARG; commands[83].optional_opt_args[14].opt = nofsck_ARG; commands[83].optional_opt_args[15].opt = nosync_ARG; commands[83].optional_opt_args[16].opt = noudevsync_ARG; commands[83].optional_opt_args[17].opt = reportformat_ARG; commands[83].optional_opt_args[17].def.val_bits = val_enum_to_bit(string_VAL); commands[83].optional_opt_args[18].opt = resizefs_ARG; commands[83].optional_opt_args[19].opt = stripes_ARG; commands[83].optional_opt_args[19].def.val_bits = val_enum_to_bit(number_VAL); commands[83].optional_opt_args[20].opt = stripesize_ARG; commands[83].optional_opt_args[20].def.val_bits = val_enum_to_bit(sizekb_VAL); commands[83].optional_opt_args[21].opt = poolmetadatasize_ARG; commands[83].optional_opt_args[21].def.val_bits = val_enum_to_bit(sizemb_VAL); commands[83].optional_pos_args[0].pos = 2; commands[83].optional_pos_args[0].def.val_bits = val_enum_to_bit(pv_VAL); commands[83].optional_pos_args[0].def.flags = ARG_DEF_FLAG_MAY_REPEAT; Every user-entered command is compared against the set of command structures, and matched with one. An error is reported if an entered command does not have the required parameters for any definition. The closest match is printed as a suggestion, and running lvresize --help will display the usage for each possible lvresize command. The prototype syntax used for help/man output includes required --option and positional args on the first line, and optional --option and positional args enclosed in [ ] on subsequent lines. command_name <required_opt_args> <required_pos_args> [ <optional_opt_args> ] [ <optional_pos_args> ] $ lvresize --help lvresize - Resize a logical volume Resize an LV by a specified size. lvresize --size Number[m|unit] LV [ --resizefs, --poolmetadatasize Number[m|unit], COMMON_OPTIONS ] [ PV ... ] Resize a pool metadata SubLV by a specified size. lvresize --poolmetadatasize Number[m|unit] LV_thinpool [ COMMON_OPTIONS ] [ PV ... ] Common options: [ --alloc contiguous|cling|cling_by_tags|normal|anywhere|inherit, --nosync, --reportformat String, --autobackup y|n, --stripes Number, --stripesize Number[k|unit], --nofsck, --commandprofile String, --config String, --debug, --driverloaded y|n, --help, --profile String, --quiet, --verbose, --version, --yes, --test, --force, --noudevsync ] (Use --help --help for usage notes.) $ lvresize --poolmetadatasize 4 Failed to find a matching command definition. Closest command usage is: lvresize --poolmetadatasize Number[m|unit] LV_thinpool Command definitions that are not to be advertised/suggested have the flag SECONDARY_SYNTAX. These commands will not be printed in the normal help output. Man page prototypes are also generated from the same original command definitions, and are always in sync with the code and help text. Very early in command execution, a matching command definition is found. lvm then knows the operation being done, and that the provided args conform to the definition. This will allow lots of ad hoc checking/validation to be removed throughout the code. Each command definition can also be routed to a specific function to implement it. The function is associated with an enum value for the command definition (generated from the ID string.) These per-command-definition implementation functions have not yet been created, so all commands currently fall back to the existing per-command-name implementation functions. Using per-command-definition functions will allow lots of code to be removed which tries to figure out what the command is meant to do. This is currently based on ad hoc and complicated option analysis. When using the new functions, what the command is doing is already known from the associated command definition. So, this first phase validates every user-entered command against the set of command prototypes, then calls the existing implementation. The second phase can associate an implementation function with each definition, and take further advantage of the known operation to avoid the complicated option analysis.
* lvmlockd: test mode doesn't workDavid Teigland2016-12-191-0/+5
| | | | | | The --test option is not yet compatible with shared VGs because changes are made in lvmlockd that cannot be reversed or faked.
* tests: usage of cached volume for snapshotZdenek Kabelac2016-12-193-1/+126
|
* cache: support cached origin for snapshotZdenek Kabelac2016-12-194-3/+18
| | | | | | | | | Enable 'lvcreate/lvconvert -s' for cached LV. and supported operations: Create a snapshot of cached LV Split/Join snapshot LV to cached origin LV.
* lvconvert: fix shown lv name for snapshot splitZdenek Kabelac2016-12-192-5/+6
| | | | | | | | We can't keep 'display_lvname' for too long - it's using ringbuffer and keeps limited number of names. So it's safe only per few simple tests, but can't be used anymore after some function calls.. (Fixes 00e641ef37a977129acc503f3fa1b67f556ac5eb)
* libdm: add dm_stats_bind_from_fd()Bryn M. Reeves2016-12-185-19/+32
| | | | | dmsetup already has a version of this function, and dmfilemapd will need it too: move it to libdevmapper to avoid copying it around.
* libdm: clear region table in dm_stats_list()Bryn M. Reeves2016-12-181-0/+3
| | | | | | | Call _stats_regions_destroy() from dm_stats_list() if dms->regions is non-NULL. This avoids leaking any pool allocations and ensures the handle is in a known state: if an error occurs during the list, dms->regions will be NULL and the handle will appear empty.
* tests: using cached LV for external originZdenek Kabelac2016-12-181-0/+107
|
* debug: add debug message showing new lvZdenek Kabelac2016-12-181-0/+2
| | | | Make trace easier to follow knowing which LV was added to dtree.
* activate: further _info API refinementZdenek Kabelac2016-12-181-47/+41
| | | | | | Another cleanup of internal _info() API simplifying code. Also make sure 'error' on _info() call is properly passed upward (return 0 is error path).
* thin: add comment with future extensionZdenek Kabelac2016-12-181-0/+4
| | | | | | | | | It could be actually better to use even cache origin in read-only mode so there could no be some 'acidental' change being done on this volume. This however need further tools enhancment - where we would need to handle whole subtree on 'lvchange -pr/-prw'.
* backup: show warning once per commandZdenek Kabelac2016-12-182-1/+4
| | | | | | | | | When command calls backup() more then once (which is actually not wanted) this warning message is shown repeatedly: "WARNING: This metadata update is NOT backed up." Instead now print message just once and less confuse user.
* lvconvert: support cache to external origin conversionZdenek Kabelac2016-12-183-3/+38
| | | | | | | | | | | | | | | | | | | | | | Add this functionality to lvconvert: 'lvconvert --thin cachedLV --thinpool vg/poll' Converts cachedLV to external origin (which will be read-only). New thin volume is created in thinpool LV and it's using external origin as source for unprovisioned chunks. This conversion happens online (while volume is in use). Thin LV remains fully writable. Cached external origin no longer could be written so cache will be used ONLY for read operations. For this limitation we require cache mode to be writethrough (as writeback cannot write to read-only volumes). When thinLV is later removed cached external origin is again fully usable, just note, LV remain in 'read-only' mode. When read-write is needed, 'lvchange -prw' has to be used. Single external origin could be user by multiple thinLV in multiple differen thin pool.
* cache: improve activation with -realZdenek Kabelac2016-12-182-0/+5
| | | | | | | | | | | When cache volume may be converted from normal to -real layer LV we need to improve logic for call cache_check. With this patch, we register call for cache_check only when metadata LV is not yet present in active table slot (should match initial table load). This avoids unwanted checking when cache would become layer device online.
* libdm: drop callback on revert pathZdenek Kabelac2016-12-182-0/+5
| | | | | | The system is likely in some very inconsisten state. Do not try to make it even more problematic with trying to invoke tools like thin_check via callback.
* lv: fix lock holder for external originZdenek Kabelac2016-12-182-11/+14
| | | | | | | | | | | | | | | | | | | | | External origin could be reloaded via more locks. It's actually even more complex then thin-pool, as it may be active on more nodes for linear LVs (and maybe even more types). External origin is always read-only thus unmodifiable device so there should not be a problem accesing it through multiple nodes. Also for thin-pool check first presence of active thin-pool. FIXME: It's not easy to detect on which nodes this device is active Thus manipulation with such device may require checking every node and it active state and refresh. But since such setup is quite complex to prepare and use, hopefully there are not user trying to 'explore' this usage yet.
* cache: prepare status checking for layerZdenek Kabelac2016-12-183-3/+4
| | | | | | To be ready to show status of cache volume, call the status with layer. Layer is automatically detected in this case when cache volume is used in 'layered' form (needs -real suffix).
* cache: improve wait for cache clearZdenek Kabelac2016-12-182-7/+11
| | | | | | | | | Avoid printing misleading message about single dirty block. Instead properly detect condition where the 'cleaner' policy needs to be installed without 'overloading' dirty variable. Also print warning if we would be clearing read-only volume. (it really shouldn't happen).
* validation: check external property is matchingZdenek Kabelac2016-12-182-0/+13
| | | | | Detect if number of external_count is matching referencing devices for external_origin LV.
* thin: reload external origin with last thinZdenek Kabelac2016-12-182-0/+11
| | | | | | | | | External origin could be activated as stand-alone device. When the last thin LV is removed, external origin is no longer the external origin and it's layer property was dropped. Ensure dm table is correct by reloading external origin (when it's active).
* lvs: show status for layerZdenek Kabelac2016-12-182-0/+8
| | | | | | | | | When LV is external origin, show info for LV but status for -layer. So we expose more info to a user as otherwise active external origin is only linear mapping of -real layer. We do the same for i.e. old snaphost origin.
* raid: fix activation of tracked imageZdenek Kabelac2016-12-183-1/+6
| | | | | | | | Activation of raid has brough up also splitted image with tracing (without taking lock for this). So when raid is now activate - such image is not put into table (with _rmeta). When user needs such device, just active it.
* dmstats: don't declare _start_timestamp if HAVE_SYS_TIMERFD_HBryn M. Reeves2016-12-181-3/+5
| | | | The _start_timestamp is not used by the TIMERFD clock.
* dmstats: fix TIMERFD _timer_running() testBryn M. Reeves2016-12-181-4/+1
|
* dmstats: fix interval number reporting with --count=0Bryn M. Reeves2016-12-181-6/+7
| | | | | | | | | | | | | | | | | | When --count=0 interval numbers are miscalculated: Interval #18446744069414584325 time delta: 999920887ns Interval #18446744069414584325 current err: -79113ns End interval #18446744069414584325 duration: 999920887ns This is because the command line argument is cast through the uint32_t type, and fixed to UINT32_MAX: _count = ((uint32_t)_int_args[COUNT_ARG]) ? : UINT32_MAX; We also need to handle --count=0 specially when calculating the interval number: since intervals count from #1, this must account for the implicit "minus one" when converting from zero to the UINT64_MAX value used (which is too large to store in _int_args).
* dmstats: separate TIMERFD and useleep() exit conditionsBryn M. Reeves2016-12-181-2/+17
| | | | | | | | | | | | | | | | | | | | | | | The time management code mixes tests of the _timer_fd value with code that should be timer agnostic: this causes problems for users of the usleep() timer, since it cannot properly detect the start of a new interval: Beginning first interval Interval #18446744069414584348 time delta: 1000000000ns Interval #18446744069414584348 current err: 0ns End interval #18446744069414584348 duration: 1000000000ns Adjusted sample interval duration: 1000000000ns [...] Beginning first interval Interval #18446744069414584349 time delta: 1000000000ns Interval #18446744069414584349 current err: 0ns End interval #18446744069414584349 duration: 1000000000ns Adjusted sample interval duration: 1000000000ns Separate these out, by defining a _timer_running() call that each timer implements, and only define _timer_fd if we are compiling with TIMERFD enabled.
* dmstats: use better interval estimate for usleep() timerBryn M. Reeves2016-12-181-9/+11
| | | | | | | | | | | | | | | | | Although the usleep() interval timer is not used if the Linux TIMERFD interface is available it should still provide reasonably good timing. Instead of trying to estimate the error from the duration of the last sleep, peg it to the start time of the program, and use the value of ((start_time - now) % interval) to correct the current interval duration. This always pulls us back into sync at the end of each interval, rather than relying on trying to incrementally adjust the time duration at each interval start. This greatly reduces drift when the usleep() clock is used.
* dmstats: improve tool help output and option coverageBryn M. Reeves2016-12-181-26/+78
|
* man: fix 'dmstats create' formatting in dmstats.8.inBryn M. Reeves2016-12-181-2/+2
|
* man: fix 'dmstats list' option formatting in dmstats.8.inBryn M. Reeves2016-12-181-1/+1
|
* man: fix 'dmstats <command>' formatting in dmstats.8.inBryn M. Reeves2016-12-181-3/+5
|
* libdm: use destination size as limit in dm_bit_copy()Bryn M. Reeves2016-12-141-1/+1
| | | | | | | | | | | | | | | | | | | | | The dm_bit_copy() macro uses the source (bs1) bitset size as the limit for memcpy: memcpy((bs1) + 1, (bs2) + 1, ((*(bs1) / DM_BITS_PER_INT) + 1)..) This is safe if the destination bitset is smaller than the source, or if the two bitsets are of the same size. With a destination that is larger (e.g. when resizing a bitmap to add more capacity), the memcpy will overrun the source bitset and set garbage bits in the destination. There are nine uses of the macro currently (8 in libdm/regex, and 1 in daemons/cmirrord): in each case the two bitsets are always of equal size so the behaviour is unchanged. Fix the macro to use bs2's size to simplify resizing bitsets and avoid the need for another copy macro.
* cleanup: use exiting functionZdenek Kabelac2016-12-142-9/+4
| | | | Reuse existing code and some indent change.
* raid: split preserves local exlusive activationZdenek Kabelac2016-12-142-17/+3
|
* raid: activation with listZdenek Kabelac2016-12-141-8/+59
| | | | | | | | | | | | | | | | | | | | | | | Commit 069039204002e5c8514050fe541bbd378c383a02 revealed a problem in raid metadata manipulation. We do two operations in one table reload: - raid leg/image extraction - rename remaining raid legs This should be made in separate steps. Otherwise we do an uncorrectable table change on error path (leaving tables for admin and dmsetup). As a hotfix - restore the previous logic and use a single new function _lv_update_and_reload_list which activates exclusively extracted LVs on the list before resuming suspended raid LV. This restore 'rename' functionality upon resume. Also still preserve the 'origin_only' logic - although we know it's not working properly for cluster and LV stacking. Further fixes are needed.
* configure: just move new macro to right fileZdenek Kabelac2016-12-132-170/+171
| | | | | aclocal is regenerated while acinclude is permanent. Move new macro to permanent file.
* libdm: ensure first extent is always countedBryn M. Reeves2016-12-131-1/+3
| | | | | | | | | If FIEMAP returns a single extent after the first call, no extent boundary is detected and the first extent is not counted by the normal mechanism. In this case, increment nr_extents at the same time the extent is added to the region table, before returning.