mirror of
				git://sourceware.org/git/lvm2.git
				synced 2025-11-03 08:23:48 +03:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			v2_03_11
			...
			dev-dct-cm
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					4e80c29bf3 | 
@@ -88,9 +88,10 @@ struct cmd_context {
 | 
			
		||||
	 * Command line and arguments.
 | 
			
		||||
	 */
 | 
			
		||||
	const char *cmd_line;
 | 
			
		||||
	const char *name; /* needed before cmd->command is set */
 | 
			
		||||
	struct command *command;
 | 
			
		||||
	char **argv;
 | 
			
		||||
	struct arg_values *arg_values;
 | 
			
		||||
	struct arg_values *opt_arg_values;
 | 
			
		||||
	struct dm_list arg_value_groups;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1497
									
								
								scripts/command-lines.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1497
									
								
								scripts/command-lines.in
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2163
									
								
								scripts/create-commands.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2163
									
								
								scripts/create-commands.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -56,7 +56,7 @@ fail lvcreate -l 1 --cachepool pool8 $vg
 | 
			
		||||
 | 
			
		||||
# no size specified
 | 
			
		||||
invalid lvcreate --cachepool pool $vg 2>&1 | tee err
 | 
			
		||||
grep "specify either size or extents" err
 | 
			
		||||
# grep "specify either size or extents" err
 | 
			
		||||
 | 
			
		||||
# Check nothing has been created yet
 | 
			
		||||
check vg_field $vg lv_count 0
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										405
									
								
								tools/args.h
									
									
									
									
									
								
							
							
						
						
									
										405
									
								
								tools/args.h
									
									
									
									
									
								
							@@ -17,215 +17,214 @@
 | 
			
		||||
 * Put all long args that don't have a corresponding short option first.
 | 
			
		||||
 */
 | 
			
		||||
/* *INDENT-OFF* */
 | 
			
		||||
arg(abort_ARG, '\0', "abort", NULL, 0, 0)
 | 
			
		||||
arg(activationmode_ARG, '\0', "activationmode", string_arg, 0, 0)
 | 
			
		||||
arg(addtag_ARG, '\0', "addtag", tag_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(aligned_ARG, '\0', "aligned", NULL, 0, 0)
 | 
			
		||||
arg(alloc_ARG, '\0', "alloc", alloc_arg, 0, 0)
 | 
			
		||||
arg(atomic_ARG, '\0', "atomic", NULL, 0, 0)
 | 
			
		||||
arg(atversion_ARG, '\0', "atversion", string_arg, 0, 0)
 | 
			
		||||
arg(binary_ARG, '\0', "binary", NULL, 0, 0)
 | 
			
		||||
arg(bootloaderareasize_ARG, '\0', "bootloaderareasize", size_mb_arg, 0, 0)
 | 
			
		||||
arg(cache_long_ARG, '\0', "cache", NULL, 0, 0)
 | 
			
		||||
arg(cachemode_ARG, '\0', "cachemode", cachemode_arg, 0, 0)
 | 
			
		||||
arg(cachepool_ARG, '\0', "cachepool", string_arg, 0, 0)
 | 
			
		||||
arg(commandprofile_ARG, '\0', "commandprofile", string_arg, 0, 0)
 | 
			
		||||
arg(config_ARG, '\0', "config", string_arg, 0, 0)
 | 
			
		||||
arg(configreport_ARG, '\0', "configreport", string_arg, ARG_GROUPABLE, 1)
 | 
			
		||||
arg(configtype_ARG, '\0', "type", string_arg, 0, 0)
 | 
			
		||||
arg(corelog_ARG, '\0', "corelog", NULL, 0, 0)
 | 
			
		||||
arg(dataalignment_ARG, '\0', "dataalignment", size_kb_arg, 0, 0)
 | 
			
		||||
arg(dataalignmentoffset_ARG, '\0', "dataalignmentoffset", size_kb_arg, 0, 0)
 | 
			
		||||
arg(deltag_ARG, '\0', "deltag", tag_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(detachprofile_ARG, '\0', "detachprofile", NULL, 0, 0)
 | 
			
		||||
arg(discards_ARG, '\0', "discards", discards_arg, 0, 0)
 | 
			
		||||
arg(driverloaded_ARG, '\0', "driverloaded", yes_no_arg, 0, 0)
 | 
			
		||||
arg(errorwhenfull_ARG, '\0', "errorwhenfull", yes_no_arg, 0, 0)
 | 
			
		||||
arg(force_long_ARG, '\0', "force", NULL, ARG_COUNTABLE, 0)
 | 
			
		||||
arg(foreign_ARG, '\0', "foreign", NULL, 0, 0)
 | 
			
		||||
arg(handlemissingpvs_ARG, '\0', "handlemissingpvs", NULL, 0, 0)
 | 
			
		||||
arg(ignoreadvanced_ARG, '\0', "ignoreadvanced", NULL, 0, 0)
 | 
			
		||||
arg(ignorelocal_ARG, '\0', "ignorelocal", NULL, 0, 0)
 | 
			
		||||
arg(ignorelockingfailure_ARG, '\0', "ignorelockingfailure", NULL, 0, 0)
 | 
			
		||||
arg(ignoremonitoring_ARG, '\0', "ignoremonitoring", NULL, 0, 0)
 | 
			
		||||
arg(ignoreskippedcluster_ARG, '\0', "ignoreskippedcluster", NULL, 0, 0)
 | 
			
		||||
arg(ignoreunsupported_ARG, '\0', "ignoreunsupported", NULL, 0, 0)
 | 
			
		||||
arg(labelsector_ARG, '\0', "labelsector", int_arg, 0, 0)
 | 
			
		||||
arg(lockopt_ARG, '\0', "lockopt", string_arg, 0, 0)
 | 
			
		||||
arg(lockstart_ARG, '\0', "lockstart", NULL, 0, 0)
 | 
			
		||||
arg(lockstop_ARG, '\0', "lockstop", NULL, 0, 0)
 | 
			
		||||
arg(locktype_ARG, '\0', "locktype", locktype_arg, 0, 0)
 | 
			
		||||
arg(logonly_ARG, '\0', "logonly", NULL, 0, 0)
 | 
			
		||||
arg(maxrecoveryrate_ARG, '\0', "maxrecoveryrate", size_kb_arg, 0, 0)
 | 
			
		||||
arg(merge_ARG, '\0', "merge", NULL, 0, 0)
 | 
			
		||||
arg(mergedconfig_ARG, '\0', "mergedconfig", NULL, 0, 0)
 | 
			
		||||
arg(metadatacopies_ARG, '\0', "metadatacopies", metadatacopies_arg, 0, 0)
 | 
			
		||||
arg(metadataignore_ARG, '\0', "metadataignore", yes_no_arg, 0, 0)
 | 
			
		||||
arg(metadataprofile_ARG, '\0', "metadataprofile", string_arg, 0, 0)
 | 
			
		||||
arg(metadatasize_ARG, '\0', "metadatasize", size_mb_arg, 0, 0)
 | 
			
		||||
arg(minor_ARG, '\0', "minor", int_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(minrecoveryrate_ARG, '\0', "minrecoveryrate", size_kb_arg, 0, 0)
 | 
			
		||||
arg(mirrorlog_ARG, '\0', "mirrorlog", mirrorlog_arg, 0, 0)
 | 
			
		||||
arg(mirrorsonly_ARG, '\0', "mirrorsonly", NULL, 0, 0)
 | 
			
		||||
arg(mknodes_ARG, '\0', "mknodes", NULL, 0, 0)
 | 
			
		||||
arg(monitor_ARG, '\0', "monitor", yes_no_arg, 0, 0)
 | 
			
		||||
arg(nameprefixes_ARG, '\0', "nameprefixes", NULL, 0, 0)
 | 
			
		||||
arg(noheadings_ARG, '\0', "noheadings", NULL, 0, 0)
 | 
			
		||||
arg(nohistory_ARG, '\0', "nohistory", NULL, 0, 0)
 | 
			
		||||
arg(nolocking_ARG, '\0', "nolocking", NULL, 0, 0)
 | 
			
		||||
arg(norestorefile_ARG, '\0', "norestorefile", NULL, 0, 0)
 | 
			
		||||
arg(nosuffix_ARG, '\0', "nosuffix", NULL, 0, 0)
 | 
			
		||||
arg(nosync_ARG, '\0', "nosync", NULL, 0, 0)
 | 
			
		||||
arg(notifydbus_ARG, '\0', "notifydbus", NULL, 0, 0)
 | 
			
		||||
arg(noudevsync_ARG, '\0', "noudevsync", NULL, 0, 0)
 | 
			
		||||
arg(originname_ARG, '\0', "originname", string_arg, 0, 0)
 | 
			
		||||
arg(physicalvolumesize_ARG, '\0', "setphysicalvolumesize", size_mb_arg, 0, 0)
 | 
			
		||||
arg(poll_ARG, '\0', "poll", yes_no_arg, 0, 0)
 | 
			
		||||
arg(polloperation_ARG, '\0', "polloperation", string_arg, 0, 0)
 | 
			
		||||
arg(pooldatasize_ARG, '\0', "pooldatasize", size_mb_arg, 0, 0)
 | 
			
		||||
arg(poolmetadata_ARG, '\0', "poolmetadata", string_arg, 0, 0)
 | 
			
		||||
arg(poolmetadatasize_ARG, '\0', "poolmetadatasize", size_mb_arg, 0, 0)
 | 
			
		||||
arg(poolmetadataspare_ARG, '\0', "poolmetadataspare", yes_no_arg, 0, 0)
 | 
			
		||||
arg(profile_ARG, '\0', "profile", string_arg, 0, 0)
 | 
			
		||||
arg(pvmetadatacopies_ARG, '\0', "pvmetadatacopies", int_arg, 0, 0)
 | 
			
		||||
arg(raidrebuild_ARG, '\0', "raidrebuild", string_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(raidmaxrecoveryrate_ARG, '\0', "raidmaxrecoveryrate", size_kb_arg, 0, 0)
 | 
			
		||||
arg(raidminrecoveryrate_ARG, '\0', "raidminrecoveryrate", size_kb_arg, 0, 0)
 | 
			
		||||
arg(raidsyncaction_ARG, '\0', "raidsyncaction", string_arg, 0, 0)
 | 
			
		||||
arg(raidwritebehind_ARG, '\0', "raidwritebehind", int_arg, 0, 0)
 | 
			
		||||
arg(raidwritemostly_ARG, '\0', "raidwritemostly", string_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(readonly_ARG, '\0', "readonly", NULL, 0, 0)
 | 
			
		||||
arg(refresh_ARG, '\0', "refresh", NULL, 0, 0)
 | 
			
		||||
arg(removemissing_ARG, '\0', "removemissing", NULL, 0, 0)
 | 
			
		||||
arg(rebuild_ARG, '\0', "rebuild", string_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(repair_ARG, '\0', "repair", NULL, 0, 0)
 | 
			
		||||
arg(replace_ARG, '\0', "replace", string_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(reportformat_ARG, '\0', "reportformat", string_arg, 0, 0)
 | 
			
		||||
arg(restorefile_ARG, '\0', "restorefile", string_arg, 0, 0)
 | 
			
		||||
arg(restoremissing_ARG, '\0', "restoremissing", NULL, 0, 0)
 | 
			
		||||
arg(resync_ARG, '\0', "resync", NULL, 0, 0)
 | 
			
		||||
arg(rows_ARG, '\0', "rows", NULL, 0, 0)
 | 
			
		||||
arg(segments_ARG, '\0', "segments", NULL, 0, 0)
 | 
			
		||||
arg(separator_ARG, '\0', "separator", string_arg, 0, 0)
 | 
			
		||||
arg(shared_ARG, '\0', "shared", NULL, 0, 0)
 | 
			
		||||
arg(sinceversion_ARG, '\0', "sinceversion", string_arg, 0, 0)
 | 
			
		||||
arg(split_ARG, '\0', "split", NULL, 0, 0)
 | 
			
		||||
arg(splitcache_ARG, '\0', "splitcache", NULL, 0, 0)
 | 
			
		||||
arg(splitmirrors_ARG, '\0', "splitmirrors", int_arg, 0, 0)
 | 
			
		||||
arg(splitsnapshot_ARG, '\0', "splitsnapshot", NULL, 0, 0)
 | 
			
		||||
arg(showdeprecated_ARG, '\0', "showdeprecated", NULL, 0, 0)
 | 
			
		||||
arg(showunsupported_ARG, '\0', "showunsupported", NULL, 0, 0)
 | 
			
		||||
arg(stripes_long_ARG, '\0', "stripes", int_arg, 0, 0)
 | 
			
		||||
arg(syncaction_ARG, '\0', "syncaction", string_arg, 0, 0)	/* FIXME Use custom validation fn */
 | 
			
		||||
arg(sysinit_ARG, '\0', "sysinit", NULL, 0, 0)
 | 
			
		||||
arg(systemid_ARG, '\0', "systemid", string_arg, 0, 0)
 | 
			
		||||
arg(thinpool_ARG, '\0', "thinpool", string_arg, 0, 0)
 | 
			
		||||
arg(trackchanges_ARG, '\0', "trackchanges", NULL, 0, 0)
 | 
			
		||||
arg(trustcache_ARG, '\0', "trustcache", NULL, 0, 0)
 | 
			
		||||
arg(type_ARG, '\0', "type", segtype_arg, 0, 0)
 | 
			
		||||
arg(unbuffered_ARG, '\0', "unbuffered", NULL, 0, 0)
 | 
			
		||||
arg(uncache_ARG, '\0', "uncache", NULL, 0, 0)
 | 
			
		||||
arg(cachepolicy_ARG, '\0', "cachepolicy", string_arg, 0, 0)
 | 
			
		||||
arg(cachesettings_ARG, '\0', "cachesettings", string_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(unconfigured_ARG, '\0', "unconfigured", NULL, 0, 0)
 | 
			
		||||
arg(units_ARG, '\0', "units", string_arg, 0, 0)
 | 
			
		||||
arg(unquoted_ARG, '\0', "unquoted", NULL, 0, 0)
 | 
			
		||||
arg(usepolicies_ARG, '\0', "usepolicies", NULL, 0, 0)
 | 
			
		||||
arg(validate_ARG, '\0', "validate", NULL, 0, 0)
 | 
			
		||||
arg(version_ARG, '\0', "version", NULL, 0, 0)
 | 
			
		||||
arg(vgmetadatacopies_ARG, '\0', "vgmetadatacopies", metadatacopies_arg, 0, 0)
 | 
			
		||||
arg(virtualoriginsize_ARG, '\0', "virtualoriginsize", size_mb_arg, 0, 0)
 | 
			
		||||
arg(withsummary_ARG, '\0', "withsummary", NULL, 0, 0)
 | 
			
		||||
arg(withcomments_ARG, '\0', "withcomments", NULL, 0, 0)
 | 
			
		||||
arg(withspaces_ARG, '\0', "withspaces", NULL, 0, 0)
 | 
			
		||||
arg(withversions_ARG, '\0', "withversions", NULL, 0, 0)
 | 
			
		||||
arg(writebehind_ARG, '\0', "writebehind", int_arg, 0, 0)
 | 
			
		||||
arg(writemostly_ARG, '\0', "writemostly", string_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(abort_ARG, '\0', "abort", 0, 0, 0)
 | 
			
		||||
arg(activationmode_ARG, '\0', "activationmode", activationmode_VAL, 0, 0)
 | 
			
		||||
arg(addtag_ARG, '\0', "addtag", tag_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(aligned_ARG, '\0', "aligned", 0, 0, 0)
 | 
			
		||||
arg(alloc_ARG, '\0', "alloc", alloc_VAL, 0, 0)
 | 
			
		||||
arg(atomic_ARG, '\0', "atomic", 0, 0, 0)
 | 
			
		||||
arg(atversion_ARG, '\0', "atversion", string_VAL, 0, 0)
 | 
			
		||||
arg(binary_ARG, '\0', "binary", 0, 0, 0)
 | 
			
		||||
arg(bootloaderareasize_ARG, '\0', "bootloaderareasize", sizemb_VAL, 0, 0)
 | 
			
		||||
arg(cache_long_ARG, '\0', "cache", 0, 0, 0)
 | 
			
		||||
arg(cachemode_ARG, '\0', "cachemode", cachemode_VAL, 0, 0)
 | 
			
		||||
arg(cachepool_ARG, '\0', "cachepool", lv_VAL, 0, 0)
 | 
			
		||||
arg(commandprofile_ARG, '\0', "commandprofile", string_VAL, 0, 0)
 | 
			
		||||
arg(config_ARG, '\0', "config", string_VAL, 0, 0)
 | 
			
		||||
arg(configreport_ARG, '\0', "configreport", string_VAL, ARG_GROUPABLE, 1)
 | 
			
		||||
arg(configtype_ARG, '\0', "typeconfig", string_VAL, 0, 0)
 | 
			
		||||
arg(corelog_ARG, '\0', "corelog", 0, 0, 0)
 | 
			
		||||
arg(dataalignment_ARG, '\0', "dataalignment", sizekb_VAL, 0, 0)
 | 
			
		||||
arg(dataalignmentoffset_ARG, '\0', "dataalignmentoffset", sizekb_VAL, 0, 0)
 | 
			
		||||
arg(deltag_ARG, '\0', "deltag", tag_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(detachprofile_ARG, '\0', "detachprofile", 0, 0, 0)
 | 
			
		||||
arg(discards_ARG, '\0', "discards", discards_VAL, 0, 0)
 | 
			
		||||
arg(driverloaded_ARG, '\0', "driverloaded", bool_VAL, 0, 0)
 | 
			
		||||
arg(errorwhenfull_ARG, '\0', "errorwhenfull", bool_VAL, 0, 0)
 | 
			
		||||
arg(force_long_ARG, '\0', "force", 0, ARG_COUNTABLE, 0)
 | 
			
		||||
arg(foreign_ARG, '\0', "foreign", 0, 0, 0)
 | 
			
		||||
arg(handlemissingpvs_ARG, '\0', "handlemissingpvs", 0, 0, 0)
 | 
			
		||||
arg(ignoreadvanced_ARG, '\0', "ignoreadvanced", 0, 0, 0)
 | 
			
		||||
arg(ignorelocal_ARG, '\0', "ignorelocal", 0, 0, 0)
 | 
			
		||||
arg(ignorelockingfailure_ARG, '\0', "ignorelockingfailure", 0, 0, 0)
 | 
			
		||||
arg(ignoremonitoring_ARG, '\0', "ignoremonitoring", 0, 0, 0)
 | 
			
		||||
arg(ignoreskippedcluster_ARG, '\0', "ignoreskippedcluster", 0, 0, 0)
 | 
			
		||||
arg(ignoreunsupported_ARG, '\0', "ignoreunsupported", 0, 0, 0)
 | 
			
		||||
arg(labelsector_ARG, '\0', "labelsector", number_VAL, 0, 0)
 | 
			
		||||
arg(lockopt_ARG, '\0', "lockopt", string_VAL, 0, 0)
 | 
			
		||||
arg(lockstart_ARG, '\0', "lockstart", 0, 0, 0)
 | 
			
		||||
arg(lockstop_ARG, '\0', "lockstop", 0, 0, 0)
 | 
			
		||||
arg(locktype_ARG, '\0', "locktype", locktype_VAL, 0, 0)
 | 
			
		||||
arg(logonly_ARG, '\0', "logonly", 0, 0, 0)
 | 
			
		||||
arg(maxrecoveryrate_ARG, '\0', "maxrecoveryrate", sizekb_VAL, 0, 0)
 | 
			
		||||
arg(merge_ARG, '\0', "merge", 0, 0, 0)
 | 
			
		||||
arg(mergedconfig_ARG, '\0', "mergedconfig", 0, 0, 0)
 | 
			
		||||
arg(metadatacopies_ARG, '\0', "metadatacopies", metadatacopies_VAL, 0, 0)
 | 
			
		||||
arg(metadataignore_ARG, '\0', "metadataignore", bool_VAL, 0, 0)
 | 
			
		||||
arg(metadataprofile_ARG, '\0', "metadataprofile", string_VAL, 0, 0)
 | 
			
		||||
arg(metadatasize_ARG, '\0', "metadatasize", sizemb_VAL, 0, 0)
 | 
			
		||||
arg(minor_ARG, '\0', "minor", number_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(minrecoveryrate_ARG, '\0', "minrecoveryrate", sizekb_VAL, 0, 0)
 | 
			
		||||
arg(mirrorlog_ARG, '\0', "mirrorlog", mirrorlog_VAL, 0, 0)
 | 
			
		||||
arg(mirrorsonly_ARG, '\0', "mirrorsonly", 0, 0, 0)
 | 
			
		||||
arg(mknodes_ARG, '\0', "mknodes", 0, 0, 0)
 | 
			
		||||
arg(monitor_ARG, '\0', "monitor", bool_VAL, 0, 0)
 | 
			
		||||
arg(nameprefixes_ARG, '\0', "nameprefixes", 0, 0, 0)
 | 
			
		||||
arg(noheadings_ARG, '\0', "noheadings", 0, 0, 0)
 | 
			
		||||
arg(nohistory_ARG, '\0', "nohistory", 0, 0, 0)
 | 
			
		||||
arg(nolocking_ARG, '\0', "nolocking", 0, 0, 0)
 | 
			
		||||
arg(norestorefile_ARG, '\0', "norestorefile", 0, 0, 0)
 | 
			
		||||
arg(nosuffix_ARG, '\0', "nosuffix", 0, 0, 0)
 | 
			
		||||
arg(nosync_ARG, '\0', "nosync", 0, 0, 0)
 | 
			
		||||
arg(notifydbus_ARG, '\0', "notifydbus", 0, 0, 0)
 | 
			
		||||
arg(noudevsync_ARG, '\0', "noudevsync", 0, 0, 0)
 | 
			
		||||
arg(originname_ARG, '\0', "originname", lv_VAL, 0, 0)
 | 
			
		||||
arg(physicalvolumesize_ARG, '\0', "setphysicalvolumesize", sizemb_VAL, 0, 0)
 | 
			
		||||
arg(poll_ARG, '\0', "poll", bool_VAL, 0, 0)
 | 
			
		||||
arg(polloperation_ARG, '\0', "polloperation", string_VAL, 0, 0)
 | 
			
		||||
arg(pooldatasize_ARG, '\0', "pooldatasize", sizemb_VAL, 0, 0)
 | 
			
		||||
arg(poolmetadata_ARG, '\0', "poolmetadata", lv_VAL, 0, 0)
 | 
			
		||||
arg(poolmetadatasize_ARG, '\0', "poolmetadatasize", sizemb_VAL, 0, 0)
 | 
			
		||||
arg(poolmetadataspare_ARG, '\0', "poolmetadataspare", bool_VAL, 0, 0)
 | 
			
		||||
arg(profile_ARG, '\0', "profile", string_VAL, 0, 0)
 | 
			
		||||
arg(pvmetadatacopies_ARG, '\0', "pvmetadatacopies", number_VAL, 0, 0)
 | 
			
		||||
arg(raidrebuild_ARG, '\0', "raidrebuild", string_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(raidmaxrecoveryrate_ARG, '\0', "raidmaxrecoveryrate", sizekb_VAL, 0, 0)
 | 
			
		||||
arg(raidminrecoveryrate_ARG, '\0', "raidminrecoveryrate", sizekb_VAL, 0, 0)
 | 
			
		||||
arg(raidsyncaction_ARG, '\0', "raidsyncaction", string_VAL, 0, 0)
 | 
			
		||||
arg(raidwritebehind_ARG, '\0', "raidwritebehind", number_VAL, 0, 0)
 | 
			
		||||
arg(raidwritemostly_ARG, '\0', "raidwritemostly", string_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(readonly_ARG, '\0', "readonly", 0, 0, 0)
 | 
			
		||||
arg(refresh_ARG, '\0', "refresh", 0, 0, 0)
 | 
			
		||||
arg(removemissing_ARG, '\0', "removemissing", 0, 0, 0)
 | 
			
		||||
arg(rebuild_ARG, '\0', "rebuild", pv_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(repair_ARG, '\0', "repair", 0, 0, 0)
 | 
			
		||||
arg(replace_ARG, '\0', "replace", pv_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(reportformat_ARG, '\0', "reportformat", string_VAL, 0, 0)
 | 
			
		||||
arg(restorefile_ARG, '\0', "restorefile", string_VAL, 0, 0)
 | 
			
		||||
arg(restoremissing_ARG, '\0', "restoremissing", 0, 0, 0)
 | 
			
		||||
arg(resync_ARG, '\0', "resync", 0, 0, 0)
 | 
			
		||||
arg(rows_ARG, '\0', "rows", 0, 0, 0)
 | 
			
		||||
arg(segments_ARG, '\0', "segments", 0, 0, 0)
 | 
			
		||||
arg(separator_ARG, '\0', "separator", string_VAL, 0, 0)
 | 
			
		||||
arg(shared_ARG, '\0', "shared", 0, 0, 0)
 | 
			
		||||
arg(sinceversion_ARG, '\0', "sinceversion", string_VAL, 0, 0)
 | 
			
		||||
arg(split_ARG, '\0', "split", 0, 0, 0)
 | 
			
		||||
arg(splitcache_ARG, '\0', "splitcache", 0, 0, 0)
 | 
			
		||||
arg(splitmirrors_ARG, '\0', "splitmirrors", number_VAL, 0, 0)
 | 
			
		||||
arg(splitsnapshot_ARG, '\0', "splitsnapshot", 0, 0, 0)
 | 
			
		||||
arg(showdeprecated_ARG, '\0', "showdeprecated", 0, 0, 0)
 | 
			
		||||
arg(showunsupported_ARG, '\0', "showunsupported", 0, 0, 0)
 | 
			
		||||
arg(stripes_long_ARG, '\0', "stripes", number_VAL, 0, 0)
 | 
			
		||||
arg(syncaction_ARG, '\0', "syncaction", string_VAL, 0, 0) /* FIXME Use custom VAL */
 | 
			
		||||
arg(sysinit_ARG, '\0', "sysinit", 0, 0, 0)
 | 
			
		||||
arg(systemid_ARG, '\0', "systemid", string_VAL, 0, 0)
 | 
			
		||||
arg(thinpool_ARG, '\0', "thinpool", lv_VAL, 0, 0)
 | 
			
		||||
arg(trackchanges_ARG, '\0', "trackchanges", 0, 0, 0)
 | 
			
		||||
arg(trustcache_ARG, '\0', "trustcache", 0, 0, 0)
 | 
			
		||||
arg(type_ARG, '\0', "type", segtype_VAL, 0, 0)
 | 
			
		||||
arg(unbuffered_ARG, '\0', "unbuffered", 0, 0, 0)
 | 
			
		||||
arg(uncache_ARG, '\0', "uncache", 0, 0, 0)
 | 
			
		||||
arg(cachepolicy_ARG, '\0', "cachepolicy", string_VAL, 0, 0)
 | 
			
		||||
arg(cachesettings_ARG, '\0', "cachesettings", string_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(unconfigured_ARG, '\0', "unconfigured", 0, 0, 0)
 | 
			
		||||
arg(units_ARG, '\0', "units", units_VAL, 0, 0)
 | 
			
		||||
arg(unquoted_ARG, '\0', "unquoted", 0, 0, 0)
 | 
			
		||||
arg(usepolicies_ARG, '\0', "usepolicies", 0, 0, 0)
 | 
			
		||||
arg(validate_ARG, '\0', "validate", 0, 0, 0)
 | 
			
		||||
arg(version_ARG, '\0', "version", 0, 0, 0)
 | 
			
		||||
arg(vgmetadatacopies_ARG, '\0', "vgmetadatacopies", metadatacopies_VAL, 0, 0)
 | 
			
		||||
arg(virtualoriginsize_ARG, '\0', "virtualoriginsize", sizemb_VAL, 0, 0)
 | 
			
		||||
arg(withsummary_ARG, '\0', "withsummary", 0, 0, 0)
 | 
			
		||||
arg(withcomments_ARG, '\0', "withcomments", 0, 0, 0)
 | 
			
		||||
arg(withspaces_ARG, '\0', "withspaces", 0, 0, 0)
 | 
			
		||||
arg(withversions_ARG, '\0', "withversions", 0, 0, 0)
 | 
			
		||||
arg(writebehind_ARG, '\0', "writebehind", number_VAL, 0, 0)
 | 
			
		||||
arg(writemostly_ARG, '\0', "writemostly", string_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
 | 
			
		||||
/* Allow some variations */
 | 
			
		||||
arg(allocation_ARG, '\0', "allocation", yes_no_arg, 0, 0)
 | 
			
		||||
arg(available_ARG, '\0', "available", activation_arg, 0, 0)
 | 
			
		||||
arg(resizable_ARG, '\0', "resizable", yes_no_arg, 0, 0)
 | 
			
		||||
arg(allocation_ARG, '\0', "allocation", bool_VAL, 0, 0)
 | 
			
		||||
arg(available_ARG, '\0', "available", activation_VAL, 0, 0)
 | 
			
		||||
arg(resizable_ARG, '\0', "resizable", bool_VAL, 0, 0)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ... and now the short args.
 | 
			
		||||
 */
 | 
			
		||||
arg(activate_ARG, 'a', "activate", activation_arg, 0, 0)
 | 
			
		||||
arg(all_ARG, 'a', "all", NULL, 0, 0)
 | 
			
		||||
arg(autobackup_ARG, 'A', "autobackup", yes_no_arg, 0, 0)
 | 
			
		||||
arg(activevolumegroups_ARG, 'A', "activevolumegroups", NULL, 0, 0)
 | 
			
		||||
arg(background_ARG, 'b', "background", NULL, 0, 0)
 | 
			
		||||
arg(backgroundfork_ARG, 'b', "background", NULL, 0, 0)
 | 
			
		||||
arg(basevgname_ARG, 'n', "basevgname", string_arg, 0, 0)
 | 
			
		||||
arg(blockdevice_ARG, 'b', "blockdevice", NULL, 0, 0)
 | 
			
		||||
arg(chunksize_ARG, 'c', "chunksize", size_kb_arg, 0, 0)
 | 
			
		||||
arg(clustered_ARG, 'c', "clustered", yes_no_arg, 0, 0)
 | 
			
		||||
arg(colon_ARG, 'c', "colon", NULL, 0, 0)
 | 
			
		||||
arg(columns_ARG, 'C', "columns", NULL, 0, 0)
 | 
			
		||||
arg(contiguous_ARG, 'C', "contiguous", yes_no_arg, 0, 0)
 | 
			
		||||
arg(debug_ARG, 'd', "debug", NULL, ARG_COUNTABLE, 0)
 | 
			
		||||
arg(exported_ARG, 'e', "exported", NULL, 0, 0)
 | 
			
		||||
arg(physicalextent_ARG, 'E', "physicalextent", NULL, 0, 0)
 | 
			
		||||
arg(file_ARG, 'f', "file", string_arg, 0, 0)
 | 
			
		||||
arg(force_ARG, 'f', "force", NULL, ARG_COUNTABLE, 0)
 | 
			
		||||
arg(full_ARG, 'f', "full", NULL, 0, 0)
 | 
			
		||||
arg(help_ARG, 'h', "help", NULL, 0, 0)
 | 
			
		||||
arg(cache_ARG, 'H', "cache", NULL, 0, 0)
 | 
			
		||||
arg(history_ARG, 'H', "history", NULL, 0, 0)
 | 
			
		||||
arg(help2_ARG, '?', "", NULL, 0, 0)
 | 
			
		||||
arg(import_ARG, 'i', "import", NULL, 0, 0)
 | 
			
		||||
arg(interval_ARG, 'i', "interval", int_arg, 0, 0)
 | 
			
		||||
arg(iop_version_ARG, 'i', "iop_version", NULL, 0, 0)
 | 
			
		||||
arg(stripes_ARG, 'i', "stripes", int_arg, 0, 0)
 | 
			
		||||
arg(stripesize_ARG, 'I', "stripesize", size_kb_arg, 0, 0)
 | 
			
		||||
arg(logicalvolume_ARG, 'l', "logicalvolume", int_arg, 0, 0)
 | 
			
		||||
arg(maxlogicalvolumes_ARG, 'l', "maxlogicalvolumes", int_arg, 0, 0)
 | 
			
		||||
arg(extents_ARG, 'l', "extents", int_arg_with_sign_and_percent, 0, 0)
 | 
			
		||||
arg(list_ARG, 'l', "list", NULL, 0, 0)
 | 
			
		||||
arg(lvmpartition_ARG, 'l', "lvmpartition", NULL, 0, 0)
 | 
			
		||||
arg(logicalextent_ARG, 'L', "logicalextent", int_arg_with_sign, 0, 0)
 | 
			
		||||
arg(size_ARG, 'L', "size", size_mb_arg, 0, 0)
 | 
			
		||||
arg(persistent_ARG, 'M', "persistent", yes_no_arg, 0, 0)
 | 
			
		||||
arg(major_ARG, 'j', "major", int_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(setactivationskip_ARG, 'k', "setactivationskip", yes_no_arg, 0, 0)
 | 
			
		||||
arg(ignoreactivationskip_ARG, 'K', "ignoreactivationskip", NULL, 0, 0)
 | 
			
		||||
arg(maps_ARG, 'm', "maps", NULL, 0, 0)
 | 
			
		||||
arg(mirrors_ARG, 'm', "mirrors", int_arg_with_sign, 0, 0)
 | 
			
		||||
arg(metadatatype_ARG, 'M', "metadatatype", metadatatype_arg, 0, 0)
 | 
			
		||||
arg(name_ARG, 'n', "name", string_arg, 0, 0)
 | 
			
		||||
arg(nofsck_ARG, 'n', "nofsck", NULL, 0, 0)
 | 
			
		||||
arg(novolumegroup_ARG, 'n', "novolumegroup", NULL, 0, 0)
 | 
			
		||||
arg(oldpath_ARG, 'n', "oldpath", NULL, 0, 0)
 | 
			
		||||
arg(options_ARG, 'o', "options", string_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(sort_ARG, 'O', "sort", string_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(maxphysicalvolumes_ARG, 'p', "maxphysicalvolumes", int_arg, 0, 0)
 | 
			
		||||
arg(permission_ARG, 'p', "permission", permission_arg, 0, 0)
 | 
			
		||||
arg(partial_ARG, 'P', "partial", NULL, 0, 0)
 | 
			
		||||
arg(physicalvolume_ARG, 'P', "physicalvolume", NULL, 0, 0)
 | 
			
		||||
arg(quiet_ARG, 'q', "quiet", NULL, ARG_COUNTABLE, 0)
 | 
			
		||||
arg(readahead_ARG, 'r', "readahead", readahead_arg, 0, 0)
 | 
			
		||||
arg(resizefs_ARG, 'r', "resizefs", NULL, 0, 0)
 | 
			
		||||
arg(reset_ARG, 'R', "reset", NULL, 0, 0)
 | 
			
		||||
arg(regionsize_ARG, 'R', "regionsize", size_mb_arg, 0, 0)
 | 
			
		||||
arg(physicalextentsize_ARG, 's', "physicalextentsize", size_mb_arg, 0, 0)
 | 
			
		||||
arg(snapshot_ARG, 's', "snapshot", NULL, 0, 0)
 | 
			
		||||
arg(short_ARG, 's', "short", NULL, 0, 0)
 | 
			
		||||
arg(stdin_ARG, 's', "stdin", NULL, 0, 0)
 | 
			
		||||
arg(select_ARG, 'S', "select", string_arg, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(test_ARG, 't', "test", NULL, 0, 0)
 | 
			
		||||
arg(thin_ARG, 'T', "thin", NULL, 0, 0)
 | 
			
		||||
arg(uuid_ARG, 'u', "uuid", NULL, 0, 0)
 | 
			
		||||
arg(uuidstr_ARG, 'u', "uuid", string_arg, 0, 0)
 | 
			
		||||
arg(uuidlist_ARG, 'U', "uuidlist", NULL, 0, 0)
 | 
			
		||||
arg(verbose_ARG, 'v', "verbose", NULL, ARG_COUNTABLE, 0)
 | 
			
		||||
arg(volumegroup_ARG, 'V', "volumegroup", NULL, 0, 0)
 | 
			
		||||
arg(virtualsize_ARG, 'V', "virtualsize", size_mb_arg, 0, 0)
 | 
			
		||||
arg(wipesignatures_ARG, 'W', "wipesignatures", yes_no_arg, 0, 0)
 | 
			
		||||
arg(allocatable_ARG, 'x', "allocatable", yes_no_arg, 0, 0)
 | 
			
		||||
arg(resizeable_ARG, 'x', "resizeable", yes_no_arg, 0, 0)
 | 
			
		||||
arg(yes_ARG, 'y', "yes", NULL, 0, 0)
 | 
			
		||||
arg(zero_ARG, 'Z', "zero", yes_no_arg, 0, 0)
 | 
			
		||||
arg(activate_ARG, 'a', "activate", activation_VAL, 0, 0)
 | 
			
		||||
arg(all_ARG, 'a', "all", 0, 0, 0)
 | 
			
		||||
arg(autobackup_ARG, 'A', "autobackup", bool_VAL, 0, 0)
 | 
			
		||||
arg(activevolumegroups_ARG, 'A', "activevolumegroups", 0, 0, 0)
 | 
			
		||||
arg(background_ARG, 'b', "background", 0, 0, 0)
 | 
			
		||||
arg(backgroundfork_ARG, 'b', "background", 0, 0, 0)
 | 
			
		||||
arg(basevgname_ARG, 'n', "basevgname", string_VAL, 0, 0)
 | 
			
		||||
arg(blockdevice_ARG, 'b', "blockdevice", 0, 0, 0)
 | 
			
		||||
arg(chunksize_ARG, 'c', "chunksize", sizekb_VAL, 0, 0)
 | 
			
		||||
arg(clustered_ARG, 'c', "clustered", bool_VAL, 0, 0)
 | 
			
		||||
arg(colon_ARG, 'c', "colon", 0, 0, 0)
 | 
			
		||||
arg(columns_ARG, 'C', "columns", 0, 0, 0)
 | 
			
		||||
arg(contiguous_ARG, 'C', "contiguous", bool_VAL, 0, 0)
 | 
			
		||||
arg(debug_ARG, 'd', "debug", 0, ARG_COUNTABLE, 0)
 | 
			
		||||
arg(exported_ARG, 'e', "exported", 0, 0, 0)
 | 
			
		||||
arg(physicalextent_ARG, 'E', "physicalextent", 0, 0, 0)
 | 
			
		||||
arg(file_ARG, 'f', "file", string_VAL, 0, 0)
 | 
			
		||||
arg(force_ARG, 'f', "force", 0, ARG_COUNTABLE, 0)
 | 
			
		||||
arg(full_ARG, 'f', "full", 0, 0, 0)
 | 
			
		||||
arg(help_ARG, 'h', "help", 0, ARG_COUNTABLE, 0)
 | 
			
		||||
arg(cache_ARG, 'H', "cache", 0, 0, 0)
 | 
			
		||||
arg(history_ARG, 'H', "history", 0, 0, 0)
 | 
			
		||||
arg(help2_ARG, '?', "", 0, 0, 0)
 | 
			
		||||
arg(import_ARG, 'i', "import", 0, 0, 0)
 | 
			
		||||
arg(interval_ARG, 'i', "interval", number_VAL, 0, 0)
 | 
			
		||||
arg(iop_version_ARG, 'i', "iop_version", 0, 0, 0)
 | 
			
		||||
arg(stripes_ARG, 'i', "stripes", number_VAL, 0, 0)
 | 
			
		||||
arg(stripesize_ARG, 'I', "stripesize", sizekb_VAL, 0, 0)
 | 
			
		||||
arg(logicalvolume_ARG, 'l', "logicalvolume", number_VAL, 0, 0)
 | 
			
		||||
arg(maxlogicalvolumes_ARG, 'l', "maxlogicalvolumes", number_VAL, 0, 0)
 | 
			
		||||
arg(extents_ARG, 'l', "extents", numsignedper_VAL, 0, 0)
 | 
			
		||||
arg(list_ARG, 'l', "list", 0, 0, 0)
 | 
			
		||||
arg(lvmpartition_ARG, 'l', "lvmpartition", 0, 0, 0)
 | 
			
		||||
arg(size_ARG, 'L', "size", sizemb_VAL, 0, 0)
 | 
			
		||||
arg(persistent_ARG, 'M', "persistent", bool_VAL, 0, 0)
 | 
			
		||||
arg(major_ARG, 'j', "major", number_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(setactivationskip_ARG, 'k', "setactivationskip", bool_VAL, 0, 0)
 | 
			
		||||
arg(ignoreactivationskip_ARG, 'K', "ignoreactivationskip", 0, 0, 0)
 | 
			
		||||
arg(maps_ARG, 'm', "maps", 0, 0, 0)
 | 
			
		||||
arg(mirrors_ARG, 'm', "mirrors", numsigned_VAL, 0, 0)
 | 
			
		||||
arg(metadatatype_ARG, 'M', "metadatatype", metadatatype_VAL, 0, 0)
 | 
			
		||||
arg(name_ARG, 'n', "name", string_VAL, 0, 0)
 | 
			
		||||
arg(nofsck_ARG, 'n', "nofsck", 0, 0, 0)
 | 
			
		||||
arg(novolumegroup_ARG, 'n', "novolumegroup", 0, 0, 0)
 | 
			
		||||
arg(oldpath_ARG, 'n', "oldpath", 0, 0, 0)
 | 
			
		||||
arg(options_ARG, 'o', "options", string_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(sort_ARG, 'O', "sort", string_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(maxphysicalvolumes_ARG, 'p', "maxphysicalvolumes", number_VAL, 0, 0)
 | 
			
		||||
arg(permission_ARG, 'p', "permission", permission_VAL, 0, 0)
 | 
			
		||||
arg(partial_ARG, 'P', "partial", 0, 0, 0)
 | 
			
		||||
arg(physicalvolume_ARG, 'P', "physicalvolume", 0, 0, 0)
 | 
			
		||||
arg(quiet_ARG, 'q', "quiet", 0, ARG_COUNTABLE, 0)
 | 
			
		||||
arg(readahead_ARG, 'r', "readahead", readahead_VAL, 0, 0)
 | 
			
		||||
arg(resizefs_ARG, 'r', "resizefs", 0, 0, 0)
 | 
			
		||||
arg(reset_ARG, 'R', "reset", 0, 0, 0)
 | 
			
		||||
arg(regionsize_ARG, 'R', "regionsize", sizemb_VAL, 0, 0)
 | 
			
		||||
arg(physicalextentsize_ARG, 's', "physicalextentsize", sizemb_VAL, 0, 0)
 | 
			
		||||
arg(snapshot_ARG, 's', "snapshot", 0, 0, 0)
 | 
			
		||||
arg(short_ARG, 's', "short", 0, 0, 0)
 | 
			
		||||
arg(stdin_ARG, 's', "stdin", 0, 0, 0)
 | 
			
		||||
arg(select_ARG, 'S', "select", string_VAL, ARG_GROUPABLE, 0)
 | 
			
		||||
arg(test_ARG, 't', "test", 0, 0, 0)
 | 
			
		||||
arg(thin_ARG, 'T', "thin", 0, 0, 0)
 | 
			
		||||
arg(uuid_ARG, 'u', "uuid", 0, 0, 0)
 | 
			
		||||
arg(uuidstr_ARG, 'u', "uuid", string_VAL, 0, 0)
 | 
			
		||||
arg(uuidlist_ARG, 'U', "uuidlist", 0, 0, 0)
 | 
			
		||||
arg(verbose_ARG, 'v', "verbose", 0, ARG_COUNTABLE, 0)
 | 
			
		||||
arg(volumegroup_ARG, 'V', "volumegroup", 0, 0, 0)
 | 
			
		||||
arg(virtualsize_ARG, 'V', "virtualsize", sizemb_VAL, 0, 0)
 | 
			
		||||
arg(wipesignatures_ARG, 'W', "wipesignatures", bool_VAL, 0, 0)
 | 
			
		||||
arg(allocatable_ARG, 'x', "allocatable", bool_VAL, 0, 0)
 | 
			
		||||
arg(resizeable_ARG, 'x', "resizeable", bool_VAL, 0, 0)
 | 
			
		||||
arg(yes_ARG, 'y', "yes", 0, 0, 0)
 | 
			
		||||
arg(zero_ARG, 'Z', "zero", bool_VAL, 0, 0)
 | 
			
		||||
 | 
			
		||||
/* this should always be last */
 | 
			
		||||
arg(ARG_COUNT, '-', "", NULL, 0, 0)
 | 
			
		||||
arg(ARG_COUNT, '-', "", 0, 0, 0)
 | 
			
		||||
/* *INDENT-ON* */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										129
									
								
								tools/command-lines-count.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								tools/command-lines-count.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,129 @@
 | 
			
		||||
/* Do not edit. This file is generated by scripts/create-commands */
 | 
			
		||||
/* using command definitions from scripts/command-lines.in */
 | 
			
		||||
#define COMMAND_COUNT 152
 | 
			
		||||
enum {
 | 
			
		||||
	no_CMD,
 | 
			
		||||
	lvchange_properties_CMD,
 | 
			
		||||
	lvchange_resync_CMD,
 | 
			
		||||
	lvchange_syncaction_CMD,
 | 
			
		||||
	lvchange_rebuild_CMD,
 | 
			
		||||
	lvchange_activate_CMD,
 | 
			
		||||
	lvchange_refresh_CMD,
 | 
			
		||||
	lvchange_monitor_CMD,
 | 
			
		||||
	lvchange_poll_CMD,
 | 
			
		||||
	lvchange_persistent_CMD,
 | 
			
		||||
	lvconvert_merge_CMD,
 | 
			
		||||
	lvconvert_combine_split_snapshot_CMD,
 | 
			
		||||
	lvconvert_to_thin_with_external_CMD,
 | 
			
		||||
	lvconvert_to_cache_vol_CMD,
 | 
			
		||||
	lvconvert_to_thinpool_CMD,
 | 
			
		||||
	lvconvert_to_cachepool_CMD,
 | 
			
		||||
	lvconvert_to_mirror_CMD,
 | 
			
		||||
	lvconvert_general_to_raid_CMD,
 | 
			
		||||
	lvconvert_to_mirrored_or_change_image_count_CMD,
 | 
			
		||||
	lvconvert_raid_to_striped_CMD,
 | 
			
		||||
	lvconvert_raid_or_mirror_to_linear_CMD,
 | 
			
		||||
	lvconvert_split_mirror_images_to_new_CMD,
 | 
			
		||||
	lvconvert_split_mirror_images_and_track_CMD,
 | 
			
		||||
	lvconvert_repair_pvs_or_thinpool_CMD,
 | 
			
		||||
	lvconvert_replace_pv_CMD,
 | 
			
		||||
	lvconvert_change_mirrorlog_CMD,
 | 
			
		||||
	lvconvert_split_and_keep_cachepool_CMD,
 | 
			
		||||
	lvconvert_split_and_delete_cachepool_CMD,
 | 
			
		||||
	lvconvert_split_cow_snapshot_CMD,
 | 
			
		||||
	lvconvert_poll_mirror_CMD,
 | 
			
		||||
	lvconvert_swap_pool_metadata_CMD,
 | 
			
		||||
	lvcreate_error_vol_CMD,
 | 
			
		||||
	lvcreate_zero_vol_CMD,
 | 
			
		||||
	lvcreate_linear_CMD,
 | 
			
		||||
	lvcreate_striped_CMD,
 | 
			
		||||
	lvcreate_mirror_CMD,
 | 
			
		||||
	lvcreate_raid_any_CMD,
 | 
			
		||||
	lvcreate_cow_snapshot_CMD,
 | 
			
		||||
	lvcreate_striped_cow_snapshot_CMD,
 | 
			
		||||
	lvcreate_cow_snapshot_with_virtual_origin_CMD,
 | 
			
		||||
	lvcreate_thinpool_CMD,
 | 
			
		||||
	lvcreate_cachepool_CMD,
 | 
			
		||||
	lvcreate_thin_vol_CMD,
 | 
			
		||||
	lvcreate_thin_snapshot_CMD,
 | 
			
		||||
	lvcreate_thin_snapshot_of_external_CMD,
 | 
			
		||||
	lvcreate_thin_vol_with_thinpool_CMD,
 | 
			
		||||
	lvcreate_thin_vol_with_thinpool_or_sparse_snapshot_CMD,
 | 
			
		||||
	lvcreate_cache_vol_with_new_origin_CMD,
 | 
			
		||||
	lvcreate_cache_vol_with_new_origin_or_convert_to_cache_vol_with_cachepool_CMD,
 | 
			
		||||
	lvdisplay_general_CMD,
 | 
			
		||||
	lvextend_by_size_CMD,
 | 
			
		||||
	lvextend_by_pv_CMD,
 | 
			
		||||
	lvextend_pool_metadata_by_size_CMD,
 | 
			
		||||
	lvextend_by_policy_CMD,
 | 
			
		||||
	lvmconfig_general_CMD,
 | 
			
		||||
	lvreduce_general_CMD,
 | 
			
		||||
	lvremove_general_CMD,
 | 
			
		||||
	lvrename_vg_lv_lv_CMD,
 | 
			
		||||
	lvrename_lv_lv_CMD,
 | 
			
		||||
	lvresize_by_size_CMD,
 | 
			
		||||
	lvresize_by_pv_CMD,
 | 
			
		||||
	lvresize_pool_metadata_by_size_CMD,
 | 
			
		||||
	lvs_general_CMD,
 | 
			
		||||
	lvscan_general_CMD,
 | 
			
		||||
	pvchange_properties_all_CMD,
 | 
			
		||||
	pvchange_properties_some_CMD,
 | 
			
		||||
	pvresize_general_CMD,
 | 
			
		||||
	pvck_general_CMD,
 | 
			
		||||
	pvcreate_general_CMD,
 | 
			
		||||
	pvdisplay_general_CMD,
 | 
			
		||||
	pvmove_one_CMD,
 | 
			
		||||
	pvmove_any_CMD,
 | 
			
		||||
	pvremove_general_CMD,
 | 
			
		||||
	pvs_general_CMD,
 | 
			
		||||
	pvscan_show_CMD,
 | 
			
		||||
	pvscan_cache_CMD,
 | 
			
		||||
	vgcfgbackup_general_CMD,
 | 
			
		||||
	vgcfgrestore_by_vg_CMD,
 | 
			
		||||
	vgcfgrestore_by_file_CMD,
 | 
			
		||||
	vgchange_properties_CMD,
 | 
			
		||||
	vgchange_monitor_CMD,
 | 
			
		||||
	vgchange_poll_CMD,
 | 
			
		||||
	vgchange_activate_CMD,
 | 
			
		||||
	vgchange_refresh_CMD,
 | 
			
		||||
	vgchange_lockstart_CMD,
 | 
			
		||||
	vgchange_lockstop_CMD,
 | 
			
		||||
	vgck_general_CMD,
 | 
			
		||||
	vgconvert_general_CMD,
 | 
			
		||||
	vgcreate_general_CMD,
 | 
			
		||||
	vgdisplay_general_CMD,
 | 
			
		||||
	vgexport_some_CMD,
 | 
			
		||||
	vgexport_all_CMD,
 | 
			
		||||
	vgextend_general_CMD,
 | 
			
		||||
	vgimport_some_CMD,
 | 
			
		||||
	vgimport_all_CMD,
 | 
			
		||||
	vgimportclone_general_CMD,
 | 
			
		||||
	vgmerge_general_CMD,
 | 
			
		||||
	vgmknodes_general_CMD,
 | 
			
		||||
	vgreduce_by_pv_CMD,
 | 
			
		||||
	vgreduce_all_CMD,
 | 
			
		||||
	vgreduce_missing_CMD,
 | 
			
		||||
	vgremove_general_CMD,
 | 
			
		||||
	vgrename_by_name_CMD,
 | 
			
		||||
	vgrename_by_uuid_CMD,
 | 
			
		||||
	vgs_general_CMD,
 | 
			
		||||
	vgscan_general_CMD,
 | 
			
		||||
	vgsplit_by_pv_CMD,
 | 
			
		||||
	vgsplit_by_lv_CMD,
 | 
			
		||||
	devtypes_general_CMD,
 | 
			
		||||
	fullreport_general_CMD,
 | 
			
		||||
	lastlog_general_CMD,
 | 
			
		||||
	lvpoll_general_CMD,
 | 
			
		||||
	formats_general_CMD,
 | 
			
		||||
	help_general_CMD,
 | 
			
		||||
	version_general_CMD,
 | 
			
		||||
	pvdata_general_CMD,
 | 
			
		||||
	segtypes_general_CMD,
 | 
			
		||||
	systemid_general_CMD,
 | 
			
		||||
	tags_general_CMD,
 | 
			
		||||
	lvmchange_general_CMD,
 | 
			
		||||
	lvmdiskscan_general_CMD,
 | 
			
		||||
	lvmsadc_general_CMD,
 | 
			
		||||
	lvmsar_general_CMD,
 | 
			
		||||
	COMMAND_ID_COUNT,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										8857
									
								
								tools/command-lines.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8857
									
								
								tools/command-lines.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										169
									
								
								tools/command.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								tools/command.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,169 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.  
 | 
			
		||||
 * Copyright (C) 2004-2015 Red Hat, Inc. All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of LVM2.
 | 
			
		||||
 *
 | 
			
		||||
 * This copyrighted material is made available to anyone wishing to use,
 | 
			
		||||
 * modify, copy, or redistribute it subject to the terms and conditions
 | 
			
		||||
 * of the GNU Lesser General Public License v.2.1.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software Foundation,
 | 
			
		||||
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _LVM_COMMAND_H
 | 
			
		||||
#define _LVM_COMMAND_H
 | 
			
		||||
 | 
			
		||||
struct cmd_context;
 | 
			
		||||
 | 
			
		||||
/* old per-command-name function */
 | 
			
		||||
typedef int (*command_fn) (struct cmd_context *cmd, int argc, char **argv);
 | 
			
		||||
 | 
			
		||||
/* new per-command-line-id functions */
 | 
			
		||||
typedef int (*command_line_fn) (struct cmd_context *cmd, int argc, char **argv);
 | 
			
		||||
 | 
			
		||||
struct command_function {
 | 
			
		||||
	int command_line_enum;
 | 
			
		||||
	command_line_fn fn;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct command_name {
 | 
			
		||||
	const char *name;
 | 
			
		||||
	const char *desc; /* general command description from commands.h */
 | 
			
		||||
	unsigned int flags;
 | 
			
		||||
 | 
			
		||||
	/* union of {required,optional}_opt_args for all commands with this name */
 | 
			
		||||
	int valid_args[ARG_COUNT];
 | 
			
		||||
	int num_args;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Command defintion
 | 
			
		||||
 *
 | 
			
		||||
 * A command is defined in terms of a command name,
 | 
			
		||||
 * required options (+args), optional options (+args),
 | 
			
		||||
 * required positional args, optional positional args.
 | 
			
		||||
 *
 | 
			
		||||
 * A positional arg always has non-zero pos_arg.def.types.
 | 
			
		||||
 * The first positional arg has pos_arg.pos of 1.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* arg_def flags */
 | 
			
		||||
#define ARG_DEF_FLAG_NEW        1 << 0
 | 
			
		||||
#define ARG_DEF_FLAG_MAY_REPEAT 1 << 1
 | 
			
		||||
 | 
			
		||||
/* arg_def lv_types */
 | 
			
		||||
enum {
 | 
			
		||||
	ARG_DEF_LV_ANY		= 0,
 | 
			
		||||
	ARG_DEF_LV_LINEAR	= 1 << 0,
 | 
			
		||||
	ARG_DEF_LV_STRIPED	= 1 << 1,
 | 
			
		||||
	ARG_DEF_LV_SNAPSHOT	= 1 << 2,
 | 
			
		||||
	ARG_DEF_LV_MIRROR	= 1 << 3,
 | 
			
		||||
	ARG_DEF_LV_RAID		= 1 << 4,
 | 
			
		||||
	ARG_DEF_LV_RAID0	= 1 << 5,
 | 
			
		||||
	ARG_DEF_LV_RAID1	= 1 << 6,
 | 
			
		||||
	ARG_DEF_LV_RAID4	= 1 << 7,
 | 
			
		||||
	ARG_DEF_LV_RAID5	= 1 << 8,
 | 
			
		||||
	ARG_DEF_LV_RAID6	= 1 << 9,
 | 
			
		||||
	ARG_DEF_LV_RAID10	= 1 << 10,
 | 
			
		||||
	ARG_DEF_LV_THIN		= 1 << 11,
 | 
			
		||||
	ARG_DEF_LV_THINPOOL	= 1 << 12,
 | 
			
		||||
	ARG_DEF_LV_CACHE	= 1 << 13,
 | 
			
		||||
	ARG_DEF_LV_CACHEPOOL	= 1 << 14,
 | 
			
		||||
	ARG_DEF_LV_LAST		= 1 << 15,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static inline int val_bit_is_set(uint64_t val_bits, int val_enum)
 | 
			
		||||
{
 | 
			
		||||
	return (val_bits & (1 << val_enum)) ? 1 : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline uint64_t val_enum_to_bit(int val_enum)
 | 
			
		||||
{
 | 
			
		||||
	return 1 << val_enum;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Description a value that follows an option or exists in a position. */
 | 
			
		||||
 | 
			
		||||
struct arg_def {
 | 
			
		||||
	uint64_t val_bits;   /* bits of x_VAL, can be multiple for pos_arg */
 | 
			
		||||
	uint64_t num;        /* a literal number for conststr_VAL */
 | 
			
		||||
	const char *str;     /* a literal string for constnum_VAL */
 | 
			
		||||
	uint32_t lv_types;   /* ARG_DEF_LV_, for lv_VAL, can be multiple */
 | 
			
		||||
	uint32_t flags;      /* ARG_DEF_FLAG_ */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Description of an option and the value that follows it. */
 | 
			
		||||
 | 
			
		||||
struct opt_arg {
 | 
			
		||||
	int opt;             /* option, e.g. foo_ARG */
 | 
			
		||||
	struct arg_def def;  /* defines accepted values */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Description of a position and the value that exists there. */
 | 
			
		||||
 | 
			
		||||
struct pos_arg {
 | 
			
		||||
	int pos;             /* position, e.g. first is 1 */
 | 
			
		||||
	struct arg_def def;  /* defines accepted values */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * CMD_RO_ARGS needs to accomodate a list of options,
 | 
			
		||||
 * of which one is required after which the rest are
 | 
			
		||||
 * optional.
 | 
			
		||||
 */
 | 
			
		||||
#define CMD_RO_ARGS 64          /* required opt args */
 | 
			
		||||
#define CMD_OO_ARGS 150         /* optional opt args */
 | 
			
		||||
#define CMD_RP_ARGS 8           /* required positional args */
 | 
			
		||||
#define CMD_OP_ARGS 8           /* optional positional args */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * one or more from required_opt_args is required,
 | 
			
		||||
 * then the rest are optional.
 | 
			
		||||
 */
 | 
			
		||||
#define CMD_FLAG_ONE_REQUIRED_OPT 1
 | 
			
		||||
 | 
			
		||||
/* a register of the lvm commands */
 | 
			
		||||
struct command {
 | 
			
		||||
	const char *name;
 | 
			
		||||
	const char *desc; /* specific command description from command-lines.h */
 | 
			
		||||
	const char *usage; /* excludes common options like --help, --debug */
 | 
			
		||||
	const char *usage_common; /* includes commmon options like --help, --debug */
 | 
			
		||||
	const char *command_line_id;
 | 
			
		||||
	int command_line_enum; /* <command_line_id>_CMD */
 | 
			
		||||
 | 
			
		||||
	struct command_name *cname;
 | 
			
		||||
 | 
			
		||||
	command_fn fn;                      /* old style */
 | 
			
		||||
	struct command_function *functions; /* new style */
 | 
			
		||||
 | 
			
		||||
	unsigned int flags; /* copied from command_name.flags from commands.h */
 | 
			
		||||
 | 
			
		||||
	unsigned int cmd_flags; /* CMD_FLAG_ */
 | 
			
		||||
 | 
			
		||||
	/* definitions of opt/pos args */
 | 
			
		||||
 | 
			
		||||
	/* required args following an --opt */
 | 
			
		||||
	struct opt_arg required_opt_args[CMD_RO_ARGS];
 | 
			
		||||
 | 
			
		||||
	/* optional args following an --opt */
 | 
			
		||||
	struct opt_arg optional_opt_args[CMD_OO_ARGS];
 | 
			
		||||
 | 
			
		||||
	/* required positional args */
 | 
			
		||||
	struct pos_arg required_pos_args[CMD_RP_ARGS];
 | 
			
		||||
 | 
			
		||||
	/* optional positional args */
 | 
			
		||||
	struct pos_arg optional_pos_args[CMD_OP_ARGS];
 | 
			
		||||
 | 
			
		||||
	int ro_count;
 | 
			
		||||
	int oo_count;
 | 
			
		||||
	int rp_count;
 | 
			
		||||
	int op_count;
 | 
			
		||||
 | 
			
		||||
	/* used for processing current position */
 | 
			
		||||
	int pos_count;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										1428
									
								
								tools/commands.h
									
									
									
									
									
								
							
							
						
						
									
										1428
									
								
								tools/commands.h
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										283
									
								
								tools/lvchange.c
									
									
									
									
									
								
							
							
						
						
									
										283
									
								
								tools/lvchange.c
									
									
									
									
									
								
							@@ -1436,3 +1436,286 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv)
 | 
			
		||||
			       update ? READ_FOR_UPDATE : 0, NULL,
 | 
			
		||||
			       &_lvchange_single);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
/*
 | 
			
		||||
 * Check if the status of the LV allows running lvchange.
 | 
			
		||||
 *
 | 
			
		||||
 * FIXME: check for invalid VG/LV properties in a way that is not prone
 | 
			
		||||
 * to missing some.  Currently, there are some checks here, some in the
 | 
			
		||||
 * functions above, some in process_each, and some may be missing.
 | 
			
		||||
 */
 | 
			
		||||
static int _lvchange_status_is_valid(struct cmd_context *cmd, struct logical_volume *lv)
 | 
			
		||||
{
 | 
			
		||||
	if (!(lv->vg->status & LVM_WRITE)) {
 | 
			
		||||
		log_error("Operation not permitted on LV %s: writable VG required.",
 | 
			
		||||
			  display_lvname(lv));
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (lv_is_pvmove(lv)) {
 | 
			
		||||
		log_error("Operation not permitted on LV %s: used for pvmove.",
 | 
			
		||||
			  display_lvname(lv));
 | 
			
		||||
		if (arg_is_set(cmd, activate_ARG))
 | 
			
		||||
			log_error("Use 'pvmove --abort' to abandon a pvmove");
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (lv_is_mirror_log(lv)) {
 | 
			
		||||
		log_error("Operation not permitted on LV %s: is mirror log.",
 | 
			
		||||
			  display_lvname(lv));
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (lv_is_mirror_image(lv)) {
 | 
			
		||||
		log_error("Operation not permitted on LV %s: is mirror image.",
 | 
			
		||||
			  display_lvname(lv));
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (lv_is_origin(lv) && !lv_is_thin_volume(lv)) {
 | 
			
		||||
		log_error("Operation not permitted on LV %s: is under snapshot.",
 | 
			
		||||
			  display_lvname(lv));
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int _lvchange_properties_single(struct cmd_context *cmd,
 | 
			
		||||
			               struct logical_volume *lv,
 | 
			
		||||
			               struct processing_handle *handle)
 | 
			
		||||
{
 | 
			
		||||
	int doit = 0, docmds = 0;
 | 
			
		||||
 | 
			
		||||
	/* FIXME: sort out hidden/internal LVs, e.g. _lvchange_hidden_is_valid() */
 | 
			
		||||
 | 
			
		||||
	if (!_lvchange_status_is_valid(cmd, lv))
 | 
			
		||||
		return_ECMD_FAILED;
 | 
			
		||||
 | 
			
		||||
	if (arg_is_set(cmd, persistent_ARG) && lv_is_pool(lv)) {
 | 
			
		||||
		log_error("Operation not permitted on LV %s: persistent device numbers are not supported with pools.",
 | 
			
		||||
			  display_lvname(lv));
 | 
			
		||||
		return ECMD_FAILED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * If a persistent lv lock already exists from activation
 | 
			
		||||
	 * (with the needed mode or higher), this will be a no-op.
 | 
			
		||||
	 * Otherwise, the lv lock will be taken as non-persistent
 | 
			
		||||
	 * and released when this command exits.
 | 
			
		||||
	 */
 | 
			
		||||
	if (!lockd_lv(cmd, lv, "ex", 0)) {
 | 
			
		||||
		stack;
 | 
			
		||||
		return ECMD_FAILED;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < cmd->command->ro_count; i++) {
 | 
			
		||||
		opt_enum = cmd->command->required_opt_args[i].opt;
 | 
			
		||||
 | 
			
		||||
		if (!arg_is_set(cmd, opt_enum))
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		if (!archive(lv->vg))
 | 
			
		||||
			return_ECMD_FAILED;
 | 
			
		||||
 | 
			
		||||
		docmds++;
 | 
			
		||||
 | 
			
		||||
		switch (opt_enum) {
 | 
			
		||||
		case permission_ARG:
 | 
			
		||||
			doit += _lvchange_permission(cmd, lv);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case alloc_ARG:
 | 
			
		||||
		case contiguous_ARG:
 | 
			
		||||
			doit += _lvchange_alloc(cmd, lv);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case errorwhenfull_ARG:
 | 
			
		||||
			doit += _lvchange_errorwhenfull(cmd, lv);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case readahead_ARG:
 | 
			
		||||
			doit += _lvchange_readahead(cmd, lv);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case persistent_ARG:
 | 
			
		||||
			doit += _lvchange_persistent(cmd, lv);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case discards_ARG:
 | 
			
		||||
		case zero_ARG:
 | 
			
		||||
			doit += _lvchange_pool_update(cmd, lv);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case addtag_ARG:
 | 
			
		||||
		case deltag_ARG:
 | 
			
		||||
			doit += _lvchange_tag(cmd, lv, opt_enum);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case writemostly_ARG:
 | 
			
		||||
		case writebehind_ARG:
 | 
			
		||||
			doit += _lvchange_writemostly(lv);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case minrecoveryrate_ARG:
 | 
			
		||||
		case maxrecoveryrate_ARG:
 | 
			
		||||
			doit += _lvchange_recovery_rate(lv);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case profile_ARG:
 | 
			
		||||
		case metadataprofile_ARG:
 | 
			
		||||
		case detachprofile_ARG:
 | 
			
		||||
			doit += _lvchange_profile(lv);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case setactivationskip_ARG:
 | 
			
		||||
			doit += _lvchange_activation_skip(lv);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case cachemode_ARG:
 | 
			
		||||
		case cachepolicy_ARG:
 | 
			
		||||
		case cachesettings_ARG:
 | 
			
		||||
			doit += _lvchange_cache(cmd, lv);
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			log_error(INTERNAL_ERROR "Failed to check for option %s",
 | 
			
		||||
				  arg_long_option_name(i));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (doit)
 | 
			
		||||
		log_print_unless_silent("Logical volume %s changed.", display_lvname(lv));
 | 
			
		||||
 | 
			
		||||
	if (doit != docmds)
 | 
			
		||||
		return_ECMD_FAILED;
 | 
			
		||||
 | 
			
		||||
	return ECMD_PROCESSED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int lvchange_properties_cmd(struct cmd_context *cmd, int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
	struct processing_handle *handle = init_processing_handle(cmd, NULL);
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	ret = process_each_lv(cmd, argc, argv, NULL, NULL, READ_FOR_UPDATE, handle, _lvchange_properties_single);
 | 
			
		||||
 | 
			
		||||
	destroy_processing_handle(cmd, handle);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int _lvchange_activate_single(struct cmd_context *cmd,
 | 
			
		||||
				     struct logical_volume *lv,
 | 
			
		||||
				     struct processing_handle *handle)
 | 
			
		||||
{
 | 
			
		||||
	struct logical_volume *origin;
 | 
			
		||||
	char snaps_msg[128];
 | 
			
		||||
 | 
			
		||||
	/* FIXME: sort out hidden/internal LVs, e.g. _lvchange_hidden_is_valid() */
 | 
			
		||||
 | 
			
		||||
	if (!_lvchange_status_is_valid(cmd, lv))
 | 
			
		||||
		return_ECMD_FAILED;
 | 
			
		||||
 | 
			
		||||
	/* FIXME: untangle the proper logic for cow / sparse / virtual origin */
 | 
			
		||||
 | 
			
		||||
	/* If LV is sparse, activate origin instead */
 | 
			
		||||
	if (lv_is_cow(lv) && lv_is_virtual_origin(origin = origin_from_cow(lv)))
 | 
			
		||||
		lv = origin;
 | 
			
		||||
 | 
			
		||||
	if (lv_is_cow(lv)) {
 | 
			
		||||
		origin = origin_from_cow(lv);
 | 
			
		||||
		if (origin->origin_count < 2)
 | 
			
		||||
			snaps_msg[0] = '\0';
 | 
			
		||||
		else if (dm_snprintf(snaps_msg, sizeof(snaps_msg),
 | 
			
		||||
				     " and %u other snapshot(s)",
 | 
			
		||||
				     origin->origin_count - 1) < 0) {
 | 
			
		||||
			log_error("Failed to prepare message.");
 | 
			
		||||
			return ECMD_FAILED;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (!arg_is_set(cmd, yes_ARG) &&
 | 
			
		||||
		    (yes_no_prompt("Change of snapshot %s will also change its "
 | 
			
		||||
				   "origin %s%s. Proceed? [y/n]: ",
 | 
			
		||||
				   display_lvname(lv), display_lvname(origin),
 | 
			
		||||
				   snaps_msg) == 'n')) {
 | 
			
		||||
			log_error("Logical volume %s not changed.", display_lvname(lv));
 | 
			
		||||
			return ECMD_FAILED;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * If --sysinit -aay is used and at the same time lvmetad is used,
 | 
			
		||||
	 * we want to rely on autoactivation to take place. Also, we
 | 
			
		||||
	 * need to take special care here as lvmetad service does
 | 
			
		||||
	 * not neet to be running at this moment yet - it could be
 | 
			
		||||
	 * just too early during system initialization time.
 | 
			
		||||
	 */
 | 
			
		||||
	if (arg_is_set(cmd, sysinit_ARG) && (arg_uint_value(cmd, activate_ARG, 0) == CHANGE_AAY)) {
 | 
			
		||||
		if (lvmetad_used()) {
 | 
			
		||||
			log_warn("WARNING: lvmetad is active, skipping direct activation during sysinit.");
 | 
			
		||||
			return ECMD_PROCESSED;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!_lvchange_activate(cmd, lv))
 | 
			
		||||
		return_ECMD_FAILED;
 | 
			
		||||
 | 
			
		||||
	return ECMD_PROCESSED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int lvchange_activate_cmd(struct cmd_context *cmd, int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
	struct processing_handle *handle = init_processing_handle(cmd, NULL);
 | 
			
		||||
 | 
			
		||||
	cmd->handles_missing_pvs = 1;
 | 
			
		||||
	cmd->lockd_vg_default_sh = 1;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Include foreign VGs that contain active LVs.
 | 
			
		||||
	 * That shouldn't happen in general, but if it does by some
 | 
			
		||||
	 * mistake, then we want to allow those LVs to be deactivated.
 | 
			
		||||
	 */
 | 
			
		||||
	cmd->include_active_foreign_vgs = 1;
 | 
			
		||||
 | 
			
		||||
	/* Allow deactivating if locks fail. */
 | 
			
		||||
	if (is_change_activating((activation_change_t)arg_uint_value(cmd, activate_ARG, CHANGE_AY)))
 | 
			
		||||
		cmd->lockd_vg_enforce_sh = 1;
 | 
			
		||||
 | 
			
		||||
	ret = process_each_lv(cmd, argc, argv, NULL, NULL, 0, handle, _lvchange_activate_single);
 | 
			
		||||
 | 
			
		||||
	destroy_processing_handle(cmd, handle);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int _lvchange_refresh_single(struct cmd_context *cmd,
 | 
			
		||||
				    struct logical_volume *lv,
 | 
			
		||||
				    struct processing_handle *handle)
 | 
			
		||||
{
 | 
			
		||||
	/* FIXME: sort out hidden/internal LVs, e.g. _lvchange_hidden_is_valid() */
 | 
			
		||||
 | 
			
		||||
	if (!_lvchange_status_is_valid(cmd, lv))
 | 
			
		||||
		return_ECMD_FAILED;
 | 
			
		||||
 | 
			
		||||
	log_verbose("Refreshing logical volume %s (if active).", display_lvname(lv));
 | 
			
		||||
 | 
			
		||||
	if (!_lv_refresh(cmd, lv))
 | 
			
		||||
		return_ECMD_FAILED;
 | 
			
		||||
 | 
			
		||||
	return ECMD_PROCESSED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int lvchange_refresh_cmd(struct cmd_context *cmd, int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
	struct processing_handle *handle = init_processing_handle(cmd, NULL);
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	cmd->handles_missing_pvs = 1;
 | 
			
		||||
	cmd->lockd_vg_default_sh = 1;
 | 
			
		||||
 | 
			
		||||
	ret = process_each_lv(cmd, argc, argv, NULL, NULL, 0, handle, _lvchange_refresh_single);
 | 
			
		||||
 | 
			
		||||
	destroy_processing_handle(cmd, handle);
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										32
									
								
								tools/lvm.c
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								tools/lvm.c
									
									
									
									
									
								
							@@ -45,9 +45,9 @@ static char *_list_cmds(const char *text, int state)
 | 
			
		||||
		len = strlen(text);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (i < _cmdline->num_commands)
 | 
			
		||||
		if (!strncmp(text, _cmdline->commands[i++].name, len))
 | 
			
		||||
			return strdup(_cmdline->commands[i - 1].name);
 | 
			
		||||
	while (i < _cmdline->num_command_names)
 | 
			
		||||
		if (!strncmp(text, _cmdline->command_names[i++].name, len))
 | 
			
		||||
			return strdup(_cmdline->command_names[i - 1].name);
 | 
			
		||||
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
@@ -57,7 +57,7 @@ static char *_list_args(const char *text, int state)
 | 
			
		||||
{
 | 
			
		||||
	static int match_no = 0;
 | 
			
		||||
	static size_t len = 0;
 | 
			
		||||
	static struct command *com;
 | 
			
		||||
	static struct command_name *cname;
 | 
			
		||||
 | 
			
		||||
	/* Initialise if this is a new completion attempt */
 | 
			
		||||
	if (!state) {
 | 
			
		||||
@@ -65,40 +65,40 @@ static char *_list_args(const char *text, int state)
 | 
			
		||||
		int j;
 | 
			
		||||
 | 
			
		||||
		match_no = 0;
 | 
			
		||||
		com = NULL;
 | 
			
		||||
		cname = NULL;
 | 
			
		||||
		len = strlen(text);
 | 
			
		||||
 | 
			
		||||
		/* Find start of first word in line buffer */
 | 
			
		||||
		while (isspace(*s))
 | 
			
		||||
			s++;
 | 
			
		||||
 | 
			
		||||
		/* Look for word in list of commands */
 | 
			
		||||
		for (j = 0; j < _cmdline->num_commands; j++) {
 | 
			
		||||
		/* Look for word in list of command names */
 | 
			
		||||
		for (j = 0; j < _cmdline->num_command_names; j++) {
 | 
			
		||||
			const char *p;
 | 
			
		||||
			char *q = s;
 | 
			
		||||
 | 
			
		||||
			p = _cmdline->commands[j].name;
 | 
			
		||||
			p = _cmdline->command_names[j].name;
 | 
			
		||||
			while (*p == *q) {
 | 
			
		||||
				p++;
 | 
			
		||||
				q++;
 | 
			
		||||
			}
 | 
			
		||||
			if ((!*p) && *q == ' ') {
 | 
			
		||||
				com = _cmdline->commands + j;
 | 
			
		||||
				cname = _cmdline->command_names + j;
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!com)
 | 
			
		||||
	if (!cname)
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	/* Short form arguments */
 | 
			
		||||
	if (len < 3) {
 | 
			
		||||
		while (match_no < com->num_args) {
 | 
			
		||||
		while (match_no < cname->num_args) {
 | 
			
		||||
			char s[3];
 | 
			
		||||
			char c;
 | 
			
		||||
			if (!(c = (_cmdline->arg_props +
 | 
			
		||||
				   com->valid_args[match_no++])->short_arg))
 | 
			
		||||
				   cname->valid_args[match_no++])->short_arg))
 | 
			
		||||
				continue;
 | 
			
		||||
 | 
			
		||||
			sprintf(s, "-%c", c);
 | 
			
		||||
@@ -108,13 +108,13 @@ static char *_list_args(const char *text, int state)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Long form arguments */
 | 
			
		||||
	if (match_no < com->num_args)
 | 
			
		||||
		match_no = com->num_args;
 | 
			
		||||
	if (match_no < cname->num_args)
 | 
			
		||||
		match_no = cname->num_args;
 | 
			
		||||
 | 
			
		||||
	while (match_no - com->num_args < com->num_args) {
 | 
			
		||||
	while (match_no - cname->num_args < cname->num_args) {
 | 
			
		||||
		const char *l;
 | 
			
		||||
		l = (_cmdline->arg_props +
 | 
			
		||||
		     com->valid_args[match_no++ - com->num_args])->long_arg;
 | 
			
		||||
		     cname->valid_args[match_no++ - cname->num_args])->long_arg;
 | 
			
		||||
		if (*(l + 2) && !strncmp(text, l, len))
 | 
			
		||||
			return strdup(l);
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -19,10 +19,11 @@
 | 
			
		||||
struct cmd_context;
 | 
			
		||||
 | 
			
		||||
struct cmdline_context {
 | 
			
		||||
        struct arg_props *arg_props;
 | 
			
		||||
        struct command *commands;
 | 
			
		||||
        int num_commands;
 | 
			
		||||
        int commands_size;
 | 
			
		||||
	struct arg_props *arg_props;
 | 
			
		||||
	struct command *commands;
 | 
			
		||||
	int num_commands;
 | 
			
		||||
	struct command_name *command_names;
 | 
			
		||||
	int num_command_names;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int lvm2_main(int argc, char **argv);
 | 
			
		||||
 
 | 
			
		||||
@@ -30,12 +30,12 @@ void *cmdlib_lvm2_init(unsigned static_compile)
 | 
			
		||||
{
 | 
			
		||||
	struct cmd_context *cmd;
 | 
			
		||||
 | 
			
		||||
	lvm_register_commands();
 | 
			
		||||
 | 
			
		||||
	init_is_static(static_compile);
 | 
			
		||||
	if (!(cmd = init_lvm(1, 1)))
 | 
			
		||||
		return NULL;
 | 
			
		||||
 | 
			
		||||
	lvm_register_commands();
 | 
			
		||||
 | 
			
		||||
	return (void *) cmd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1185
									
								
								tools/lvmcmdline.c
									
									
									
									
									
								
							
							
						
						
									
										1185
									
								
								tools/lvmcmdline.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -2350,8 +2350,12 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
 | 
			
		||||
	struct dm_str_list *sl;
 | 
			
		||||
	struct dm_list final_lvs;
 | 
			
		||||
	struct lv_list *final_lvl;
 | 
			
		||||
	struct dm_list found_arg_lvnames;
 | 
			
		||||
	struct glv_list *glvl, *tglvl;
 | 
			
		||||
	int do_report_ret_code = 1;
 | 
			
		||||
	uint32_t lv_types;
 | 
			
		||||
	struct logical_volume *lv;
 | 
			
		||||
	struct lv_segment *seg;
 | 
			
		||||
 | 
			
		||||
	log_set_report_object_type(LOG_REPORT_OBJECT_TYPE_LV);
 | 
			
		||||
 | 
			
		||||
@@ -2360,6 +2364,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
 | 
			
		||||
		stack;
 | 
			
		||||
 | 
			
		||||
	dm_list_init(&final_lvs);
 | 
			
		||||
	dm_list_init(&found_arg_lvnames);
 | 
			
		||||
 | 
			
		||||
	if (!vg_check_status(vg, EXPORTED_VG)) {
 | 
			
		||||
		ret_max = ECMD_FAILED;
 | 
			
		||||
@@ -2453,6 +2458,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
 | 
			
		||||
		if (lvargs_supplied && str_list_match_item(arg_lvnames, lvl->lv->name)) {
 | 
			
		||||
			/* Remove LV from list of unprocessed LV names */
 | 
			
		||||
			str_list_del(arg_lvnames, lvl->lv->name);
 | 
			
		||||
			str_list_add(cmd->mem, &found_arg_lvnames, lvl->lv->name);
 | 
			
		||||
			process_lv = 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -2500,6 +2506,68 @@ int process_each_lv_in_vg(struct cmd_context *cmd, struct volume_group *vg,
 | 
			
		||||
		if (lv_is_removed(lvl->lv))
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * If the command definition specifies one required positional
 | 
			
		||||
		 * LV (possibly repeatable), and specifies accepted LV types,
 | 
			
		||||
		 * then verify that the LV being processed matches one of those
 | 
			
		||||
		 * types.
 | 
			
		||||
		 *
 | 
			
		||||
		 * process_each_lv() can only be used for commands that have
 | 
			
		||||
		 * one positional LV arg (optionally repeating, where each is
 | 
			
		||||
		 * processed independently.)  It cannot work for commands that
 | 
			
		||||
		 * have different required LVs in designated positions, like
 | 
			
		||||
		 * 'lvrename LV1 LV2', where each LV is not processed
 | 
			
		||||
		 * independently.  That means that this LV type check only
 | 
			
		||||
		 * needs to check the lv_type of the first positional arg.
 | 
			
		||||
		 *
 | 
			
		||||
		 * There is one command that violates this rule by stealing
 | 
			
		||||
		 * the first positional LV arg before calling process_each_lv:
 | 
			
		||||
		 * lvconvert --type snapshot LV_linear_striped_raid LV_snapshot
 | 
			
		||||
		 * This code cannot validate that case.  process_each_lv() sees
 | 
			
		||||
		 * a single LV name arg, but it's in pos 2.  Could we work around
 | 
			
		||||
		 * this by looking at the final positional arg rather than always
 | 
			
		||||
		 * looking at pos 1?
 | 
			
		||||
		 *
 | 
			
		||||
		 * This only validates types for required LV positional args
 | 
			
		||||
		 * (currently there are no command specifications that include
 | 
			
		||||
		 * specific LV types in optional positional args.)
 | 
			
		||||
		 */
 | 
			
		||||
 | 
			
		||||
		if ((cmd->command->rp_count == 1) &&
 | 
			
		||||
		     val_bit_is_set(cmd->command->required_pos_args[0].def.val_bits, lv_VAL) &&
 | 
			
		||||
		     cmd->command->required_pos_args[0].def.lv_types) {
 | 
			
		||||
 | 
			
		||||
			lv_types = cmd->command->required_pos_args[0].def.lv_types;
 | 
			
		||||
			lv = lvl->lv;
 | 
			
		||||
			seg = first_seg(lv);
 | 
			
		||||
 | 
			
		||||
			if ((lv_is_cow(lv) && !(lv_types & ARG_DEF_LV_SNAPSHOT)) ||
 | 
			
		||||
			    (lv_is_thin_volume(lv) && !(lv_types & ARG_DEF_LV_THIN)) ||
 | 
			
		||||
			    (lv_is_thin_pool(lv) && !(lv_types & ARG_DEF_LV_THINPOOL)) ||
 | 
			
		||||
			    (lv_is_cache(lv) && !(lv_types & ARG_DEF_LV_CACHE)) ||
 | 
			
		||||
			    (lv_is_cache_pool(lv) && !(lv_types & ARG_DEF_LV_CACHEPOOL)) ||
 | 
			
		||||
			    (lv_is_mirror(lv) && !(lv_types & ARG_DEF_LV_MIRROR)) ||
 | 
			
		||||
			    (lv_is_raid(lv) && !(lv_types & (ARG_DEF_LV_RAID | ARG_DEF_LV_RAID0 | ARG_DEF_LV_RAID1 | ARG_DEF_LV_RAID4 | ARG_DEF_LV_RAID5 | ARG_DEF_LV_RAID6 | ARG_DEF_LV_RAID10))) ||
 | 
			
		||||
			    (segtype_is_striped(seg->segtype) && !(lv_types & ARG_DEF_LV_STRIPED)) ||
 | 
			
		||||
			    (segtype_is_linear(seg->segtype) && !(lv_types & ARG_DEF_LV_LINEAR))) {
 | 
			
		||||
				/*
 | 
			
		||||
				 * If a named LV arg cannot be processed it's an error, otherwise
 | 
			
		||||
				 * the LV is skipped and doesn't cause the command to fail.
 | 
			
		||||
				 */
 | 
			
		||||
				if (str_list_match_item(&found_arg_lvnames, lv->name)) {
 | 
			
		||||
					log_error("Operation not permitted (%s %d) on LV %s with type %s.",
 | 
			
		||||
						  cmd->command->command_line_id, cmd->command->command_line_enum,
 | 
			
		||||
						  display_lvname(lv), seg->segtype->name);
 | 
			
		||||
					ret_max = ECMD_FAILED;
 | 
			
		||||
				} else {
 | 
			
		||||
					log_warn("Operation not permitted (%s %d) on LV %s with type %s.",
 | 
			
		||||
						  cmd->command->command_line_id, cmd->command->command_line_enum,
 | 
			
		||||
						  display_lvname(lv), seg->segtype->name);
 | 
			
		||||
				}
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		log_very_verbose("Processing LV %s in VG %s.", lvl->lv->name, vg->name);
 | 
			
		||||
 | 
			
		||||
		ret = process_single_lv(cmd, lvl->lv, handle);
 | 
			
		||||
 
 | 
			
		||||
@@ -50,20 +50,27 @@
 | 
			
		||||
#define CMD_LEN 256
 | 
			
		||||
#define MAX_ARGS 64
 | 
			
		||||
 | 
			
		||||
/* command functions */
 | 
			
		||||
typedef int (*command_fn) (struct cmd_context * cmd, int argc, char **argv);
 | 
			
		||||
/* define the enums for the values accepted by command line --options */
 | 
			
		||||
enum {
 | 
			
		||||
#define val(a, b, c, d) a ,
 | 
			
		||||
#include "vals.h"
 | 
			
		||||
#undef val
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define xx(a, b...) int a(struct cmd_context *cmd, int argc, char **argv);
 | 
			
		||||
#include "commands.h"
 | 
			
		||||
#undef xx
 | 
			
		||||
 | 
			
		||||
/* define the enums for the command line switches */
 | 
			
		||||
/* define the enums for the command line --options */
 | 
			
		||||
enum {
 | 
			
		||||
#define arg(a, b, c, d, e, f) a ,
 | 
			
		||||
#include "args.h"
 | 
			
		||||
#undef arg
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* command functions */
 | 
			
		||||
#define xx(a, b...) int a(struct cmd_context *cmd, int argc, char **argv);
 | 
			
		||||
#include "commands.h"
 | 
			
		||||
#undef xx
 | 
			
		||||
 | 
			
		||||
#include "command.h"
 | 
			
		||||
 | 
			
		||||
#define ARG_COUNTABLE 0x00000001	/* E.g. -vvvv */
 | 
			
		||||
#define ARG_GROUPABLE 0x00000002	/* E.g. --addtag */
 | 
			
		||||
 | 
			
		||||
@@ -79,13 +86,13 @@ struct arg_values {
 | 
			
		||||
/*	void *ptr; // Currently not used. */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* a global table of possible arguments */
 | 
			
		||||
/* a global table of possible --option's */
 | 
			
		||||
struct arg_props {
 | 
			
		||||
	int arg_enum; /* foo_ARG from args.h */
 | 
			
		||||
	const char short_arg;
 | 
			
		||||
	char _padding[7];
 | 
			
		||||
	const char *long_arg;
 | 
			
		||||
 | 
			
		||||
	int (*fn) (struct cmd_context *cmd, struct arg_values *av);
 | 
			
		||||
	int val_enum; /* foo_VAL from vals.h */
 | 
			
		||||
	uint32_t flags;
 | 
			
		||||
	uint32_t prio;
 | 
			
		||||
};
 | 
			
		||||
@@ -96,6 +103,14 @@ struct arg_value_group_list {
 | 
			
		||||
	uint32_t prio;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* a global table of possible --option values */
 | 
			
		||||
struct val_props {
 | 
			
		||||
	int val_enum; /* foo_VAL from vals.h */
 | 
			
		||||
	int (*fn) (struct cmd_context *cmd, struct arg_values *av);
 | 
			
		||||
	const char *name;
 | 
			
		||||
	const char *usage;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define CACHE_VGMETADATA	0x00000001
 | 
			
		||||
#define PERMITTED_READ_ONLY 	0x00000002
 | 
			
		||||
/* Process all VGs if none specified on the command line. */
 | 
			
		||||
@@ -118,19 +133,6 @@ struct arg_value_group_list {
 | 
			
		||||
#define ENABLE_DUPLICATE_DEVS    0x00000400
 | 
			
		||||
/* Command does not accept tags as args. */
 | 
			
		||||
#define DISALLOW_TAG_ARGS        0x00000800
 | 
			
		||||
 
 | 
			
		||||
/* a register of the lvm commands */
 | 
			
		||||
struct command {
 | 
			
		||||
	const char *name;
 | 
			
		||||
	const char *desc;
 | 
			
		||||
	const char *usage;
 | 
			
		||||
	command_fn fn;
 | 
			
		||||
 | 
			
		||||
	unsigned flags;
 | 
			
		||||
 | 
			
		||||
	int num_args;
 | 
			
		||||
	int *valid_args;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void usage(const char *name);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										136
									
								
								tools/vals.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								tools/vals.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,136 @@
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Define value types which describe values accepted
 | 
			
		||||
 * by the --option's in args.h, and can also describe
 | 
			
		||||
 * the values accepted as positional args.
 | 
			
		||||
 *
 | 
			
		||||
 * Previously, accepted values were only "described"
 | 
			
		||||
 * by identifying the parsing function to use.
 | 
			
		||||
 *
 | 
			
		||||
 * Some standard val types are used by many options,
 | 
			
		||||
 * e.g. many options (aa_ARG, bb_ARG, cc_ARG) all
 | 
			
		||||
 * accept a number_VAL.
 | 
			
		||||
 *
 | 
			
		||||
 * Other special val types are used by only one option,
 | 
			
		||||
 * e.g. only mirrorlog_ARG accepts a mirrorlog_VAL.
 | 
			
		||||
 * This typically means that there are some specific
 | 
			
		||||
 * words that are recognized after the option.
 | 
			
		||||
 *
 | 
			
		||||
 * Some options currently take a standard val type,
 | 
			
		||||
 * (esp string_VAL), but they could be given their
 | 
			
		||||
 * own custom val type.  The advantage of using a
 | 
			
		||||
 * custom val type is the possibility of validating
 | 
			
		||||
 * the value when parsing it with a custom parsing
 | 
			
		||||
 * function, and the possibility of displaying the
 | 
			
		||||
 * actual accepted values in the command usage.
 | 
			
		||||
 * Without a custom val type, the code must do ad hoc
 | 
			
		||||
 * validation of the string values, and the usage
 | 
			
		||||
 * output for the option will only say "String"
 | 
			
		||||
 * rather than giving the accepted string values.
 | 
			
		||||
 * Even without a custom parsing function, there is
 | 
			
		||||
 * reason to define a custom x_VAL enum so that a
 | 
			
		||||
 * more descriptive usage string can be specified
 | 
			
		||||
 * as opposed to just "String".
 | 
			
		||||
 *
 | 
			
		||||
 * Most of the val types defined here are used after
 | 
			
		||||
 * --option's, and are referenced in foo_ARG entries
 | 
			
		||||
 * in args.h.  But, some val types are only used to
 | 
			
		||||
 * represent positional values in command definitions,
 | 
			
		||||
 * e.g. vg_VAL.
 | 
			
		||||
 *
 | 
			
		||||
 * val(a, b, c, d)
 | 
			
		||||
 *
 | 
			
		||||
 * a:  foo_VAL enums
 | 
			
		||||
 * b:  the function to parse and set the value
 | 
			
		||||
 * c:  the name used to reference this value in command defs
 | 
			
		||||
 * d:  what to display in usage output for this value
 | 
			
		||||
 *
 | 
			
		||||
 * command defintions will use --option NAME, where NAME
 | 
			
		||||
 * is shown in val() field c.  NAME will be translated to
 | 
			
		||||
 * foo_VAL enum in field a, which is used in commands[]
 | 
			
		||||
 * structs.
 | 
			
		||||
 *
 | 
			
		||||
 * option definitions (arg.h) will reference foo_VAL enum
 | 
			
		||||
 * in field a.
 | 
			
		||||
 *
 | 
			
		||||
 * FIXME: for specialized val types, the set of recognized
 | 
			
		||||
 * words is not defined or stored in a consistent way,
 | 
			
		||||
 * but is just whatever the parsing function happens to look
 | 
			
		||||
 * for, so adding a new accepted value for the val type is
 | 
			
		||||
 * often just making the parsing function recognize a new
 | 
			
		||||
 * word.  This new word should then also be added to the
 | 
			
		||||
 * usage string for the val type here.  It would be nice
 | 
			
		||||
 * if the accepted values could be defined in a more
 | 
			
		||||
 * consistent way, perhaps in struct val_props.
 | 
			
		||||
 *
 | 
			
		||||
 * The usage text for an option is not always the full
 | 
			
		||||
 * set of words accepted for an option, but may be a
 | 
			
		||||
 * subset.  i.e. an outdated word that no longer does
 | 
			
		||||
 * anything may not be shown, but may still be recognized
 | 
			
		||||
 * and ignored, or an option that shouldn't be used in
 | 
			
		||||
 * general isn't shown to avoid suggesting it.
 | 
			
		||||
 * e.g. for --activate we show the most common "y|n|ay"
 | 
			
		||||
 * without showing the lvmlockd variations "ey|sy" which
 | 
			
		||||
 * are not applicable in general.
 | 
			
		||||
 *
 | 
			
		||||
 * FIXME: are there some specialized or irrelevant
 | 
			
		||||
 * options included in the usage text below that should
 | 
			
		||||
 * be removed?  Should "lvm1" be removed?
 | 
			
		||||
 *
 | 
			
		||||
 * For Number args that take optional units, a full usage
 | 
			
		||||
 * could be "Number[bBsSkKmMgGtTpPeE]" (with implied |),
 | 
			
		||||
 * but repeating this full specification produces cluttered
 | 
			
		||||
 * output, and doesn't indicate which unit is the default.
 | 
			
		||||
 * "Number[units]" would be cleaner, as would a subset of
 | 
			
		||||
 * common units, e.g. "Number[kmg...]", but neither helps
 | 
			
		||||
 * with default.  "Number[k|unit]" and "Number[m|unit]" show
 | 
			
		||||
 * the default, and "unit" indicates that other units
 | 
			
		||||
 * are possible without listing them all.  This also
 | 
			
		||||
 * suggests using the preferred lower case letters, because
 | 
			
		||||
 * --size and other option args treat upper/lower letters
 | 
			
		||||
 * the same, all as 1024 SI base.  For this reason, we
 | 
			
		||||
 * should avoid suggesting the upper case letters.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
val(none_VAL, NULL, "None", "")             /* unused, for enum value 0 */
 | 
			
		||||
val(conststr_VAL, NULL, "ConstString", "")  /* used only for command defs */
 | 
			
		||||
val(constnum_VAL, NULL, "ConstNumber", "")  /* used only for command defs */
 | 
			
		||||
val(bool_VAL, yes_no_arg, "Bool", "y|n")
 | 
			
		||||
val(number_VAL, int_arg, "Number", NULL)
 | 
			
		||||
val(string_VAL, string_arg, "String", NULL)
 | 
			
		||||
val(vg_VAL, string_arg, "VG", NULL)
 | 
			
		||||
val(lv_VAL, string_arg, "LV", NULL)
 | 
			
		||||
val(pv_VAL, string_arg, "PV", NULL)
 | 
			
		||||
val(tag_VAL, tag_arg, "Tag", NULL)
 | 
			
		||||
val(select_VAL, NULL, "Select", NULL)       /* used only for command defs */
 | 
			
		||||
val(activationmode_VAL, string_arg, "ActivationMode", "partial|degraded|complete")
 | 
			
		||||
val(activation_VAL, activation_arg, "Active", "y|n|ay")
 | 
			
		||||
val(cachemode_VAL, cachemode_arg, "CacheMode", "writethrough|writeback")
 | 
			
		||||
val(discards_VAL, discards_arg, "Discards", "passdown|nopassdown|ignore")
 | 
			
		||||
val(mirrorlog_VAL, mirrorlog_arg, "MirrorLog", "core|disk")
 | 
			
		||||
val(sizekb_VAL, size_kb_arg, "SizeKB", "Number[k|unit]")
 | 
			
		||||
val(sizemb_VAL, size_mb_arg, "SizeMB", "Number[m|unit]")
 | 
			
		||||
val(numsigned_VAL, int_arg_with_sign, "SNumber", "[+|-]Number")
 | 
			
		||||
val(numsignedper_VAL, int_arg_with_sign_and_percent, "SNumberP", "[+|-]Number[%{VG|PVS|FREE}]")
 | 
			
		||||
val(permission_VAL, permission_arg, "Permission", "rw|r")
 | 
			
		||||
val(metadatatype_VAL, metadatatype_arg, "MetadataType", "lvm2|lvm1")
 | 
			
		||||
val(units_VAL, string_arg, "Units", "hHbBsSkKmMgGtTpPeE")
 | 
			
		||||
val(segtype_VAL, segtype_arg, "SegType", "linear|striped|snapshot|mirror|raid*|thin|cache|thin-pool|cache-pool")
 | 
			
		||||
/* FIXME: cling_by_tags is left out of help text because it makes the line wrap */
 | 
			
		||||
val(alloc_VAL, alloc_arg, "Alloc", "contiguous|cling|normal|anywhere|inherit")
 | 
			
		||||
val(locktype_VAL, locktype_arg, "LockType", "sanlock|dlm|none")
 | 
			
		||||
val(readahead_VAL, readahead_arg, "Readahead", "auto|none|NumberSectors")
 | 
			
		||||
val(metadatacopies_VAL, metadatacopies_arg, "MetadataCopies", "all|unmanaged|Number")
 | 
			
		||||
 | 
			
		||||
/* this should always be last */
 | 
			
		||||
val(VAL_COUNT, NULL, NULL, NULL)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * I suspect many of the following are good candidates for a custom VAL enum
 | 
			
		||||
 * for the benefit of custom parsing, or custom usage, or both:
 | 
			
		||||
 *
 | 
			
		||||
 * configreport_ARG, configtype_ARG, polloperation_ARG, raidrebuild_ARG,
 | 
			
		||||
 * raidsyncaction_ARG, raidwritemostly_ARG, reportformat_ARG, syncaction_ARG,
 | 
			
		||||
 * cachepolicy_ARG, cachesettings_ARG, writemostly_ARG
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user