brintos

brintos / linux-shallow public Read only

0
0
Text · 87.0 KiB · 0e04c20 Raw
2936 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright 2023 Red Hat4 */5 6#include <linux/atomic.h>7#include <linux/bitops.h>8#include <linux/completion.h>9#include <linux/delay.h>10#include <linux/device-mapper.h>11#include <linux/err.h>12#include <linux/module.h>13#include <linux/mutex.h>14#include <linux/spinlock.h>15 16#include "admin-state.h"17#include "block-map.h"18#include "completion.h"19#include "constants.h"20#include "data-vio.h"21#include "dedupe.h"22#include "dump.h"23#include "encodings.h"24#include "errors.h"25#include "flush.h"26#include "io-submitter.h"27#include "logger.h"28#include "memory-alloc.h"29#include "message-stats.h"30#include "recovery-journal.h"31#include "repair.h"32#include "slab-depot.h"33#include "status-codes.h"34#include "string-utils.h"35#include "thread-device.h"36#include "thread-registry.h"37#include "thread-utils.h"38#include "types.h"39#include "vdo.h"40#include "vio.h"41 42enum admin_phases {43	GROW_LOGICAL_PHASE_START,44	GROW_LOGICAL_PHASE_GROW_BLOCK_MAP,45	GROW_LOGICAL_PHASE_END,46	GROW_LOGICAL_PHASE_ERROR,47	GROW_PHYSICAL_PHASE_START,48	GROW_PHYSICAL_PHASE_COPY_SUMMARY,49	GROW_PHYSICAL_PHASE_UPDATE_COMPONENTS,50	GROW_PHYSICAL_PHASE_USE_NEW_SLABS,51	GROW_PHYSICAL_PHASE_END,52	GROW_PHYSICAL_PHASE_ERROR,53	LOAD_PHASE_START,54	LOAD_PHASE_LOAD_DEPOT,55	LOAD_PHASE_MAKE_DIRTY,56	LOAD_PHASE_PREPARE_TO_ALLOCATE,57	LOAD_PHASE_SCRUB_SLABS,58	LOAD_PHASE_DATA_REDUCTION,59	LOAD_PHASE_FINISHED,60	LOAD_PHASE_DRAIN_JOURNAL,61	LOAD_PHASE_WAIT_FOR_READ_ONLY,62	PRE_LOAD_PHASE_START,63	PRE_LOAD_PHASE_LOAD_COMPONENTS,64	PRE_LOAD_PHASE_END,65	PREPARE_GROW_PHYSICAL_PHASE_START,66	RESUME_PHASE_START,67	RESUME_PHASE_ALLOW_READ_ONLY_MODE,68	RESUME_PHASE_DEDUPE,69	RESUME_PHASE_DEPOT,70	RESUME_PHASE_JOURNAL,71	RESUME_PHASE_BLOCK_MAP,72	RESUME_PHASE_LOGICAL_ZONES,73	RESUME_PHASE_PACKER,74	RESUME_PHASE_FLUSHER,75	RESUME_PHASE_DATA_VIOS,76	RESUME_PHASE_END,77	SUSPEND_PHASE_START,78	SUSPEND_PHASE_PACKER,79	SUSPEND_PHASE_DATA_VIOS,80	SUSPEND_PHASE_DEDUPE,81	SUSPEND_PHASE_FLUSHES,82	SUSPEND_PHASE_LOGICAL_ZONES,83	SUSPEND_PHASE_BLOCK_MAP,84	SUSPEND_PHASE_JOURNAL,85	SUSPEND_PHASE_DEPOT,86	SUSPEND_PHASE_READ_ONLY_WAIT,87	SUSPEND_PHASE_WRITE_SUPER_BLOCK,88	SUSPEND_PHASE_END,89};90 91static const char * const ADMIN_PHASE_NAMES[] = {92	"GROW_LOGICAL_PHASE_START",93	"GROW_LOGICAL_PHASE_GROW_BLOCK_MAP",94	"GROW_LOGICAL_PHASE_END",95	"GROW_LOGICAL_PHASE_ERROR",96	"GROW_PHYSICAL_PHASE_START",97	"GROW_PHYSICAL_PHASE_COPY_SUMMARY",98	"GROW_PHYSICAL_PHASE_UPDATE_COMPONENTS",99	"GROW_PHYSICAL_PHASE_USE_NEW_SLABS",100	"GROW_PHYSICAL_PHASE_END",101	"GROW_PHYSICAL_PHASE_ERROR",102	"LOAD_PHASE_START",103	"LOAD_PHASE_LOAD_DEPOT",104	"LOAD_PHASE_MAKE_DIRTY",105	"LOAD_PHASE_PREPARE_TO_ALLOCATE",106	"LOAD_PHASE_SCRUB_SLABS",107	"LOAD_PHASE_DATA_REDUCTION",108	"LOAD_PHASE_FINISHED",109	"LOAD_PHASE_DRAIN_JOURNAL",110	"LOAD_PHASE_WAIT_FOR_READ_ONLY",111	"PRE_LOAD_PHASE_START",112	"PRE_LOAD_PHASE_LOAD_COMPONENTS",113	"PRE_LOAD_PHASE_END",114	"PREPARE_GROW_PHYSICAL_PHASE_START",115	"RESUME_PHASE_START",116	"RESUME_PHASE_ALLOW_READ_ONLY_MODE",117	"RESUME_PHASE_DEDUPE",118	"RESUME_PHASE_DEPOT",119	"RESUME_PHASE_JOURNAL",120	"RESUME_PHASE_BLOCK_MAP",121	"RESUME_PHASE_LOGICAL_ZONES",122	"RESUME_PHASE_PACKER",123	"RESUME_PHASE_FLUSHER",124	"RESUME_PHASE_DATA_VIOS",125	"RESUME_PHASE_END",126	"SUSPEND_PHASE_START",127	"SUSPEND_PHASE_PACKER",128	"SUSPEND_PHASE_DATA_VIOS",129	"SUSPEND_PHASE_DEDUPE",130	"SUSPEND_PHASE_FLUSHES",131	"SUSPEND_PHASE_LOGICAL_ZONES",132	"SUSPEND_PHASE_BLOCK_MAP",133	"SUSPEND_PHASE_JOURNAL",134	"SUSPEND_PHASE_DEPOT",135	"SUSPEND_PHASE_READ_ONLY_WAIT",136	"SUSPEND_PHASE_WRITE_SUPER_BLOCK",137	"SUSPEND_PHASE_END",138};139 140/* If we bump this, update the arrays below */141#define TABLE_VERSION 4142 143/* arrays for handling different table versions */144static const u8 REQUIRED_ARGC[] = { 10, 12, 9, 7, 6 };145/* pool name no longer used. only here for verification of older versions */146static const u8 POOL_NAME_ARG_INDEX[] = { 8, 10, 8 };147 148/*149 * Track in-use instance numbers using a flat bit array.150 *151 * O(n) run time isn't ideal, but if we have 1000 VDO devices in use simultaneously we still only152 * need to scan 16 words, so it's not likely to be a big deal compared to other resource usage.153 */154 155/*156 * This minimum size for the bit array creates a numbering space of 0-999, which allows157 * successive starts of the same volume to have different instance numbers in any158 * reasonably-sized test. Changing instances on restart allows vdoMonReport to detect that159 * the ephemeral stats have reset to zero.160 */161#define BIT_COUNT_MINIMUM 1000162/* Grow the bit array by this many bits when needed */163#define BIT_COUNT_INCREMENT 100164 165struct instance_tracker {166	unsigned int bit_count;167	unsigned long *words;168	unsigned int count;169	unsigned int next;170};171 172static DEFINE_MUTEX(instances_lock);173static struct instance_tracker instances;174 175/**176 * free_device_config() - Free a device config created by parse_device_config().177 * @config: The config to free.178 */179static void free_device_config(struct device_config *config)180{181	if (config == NULL)182		return;183 184	if (config->owned_device != NULL)185		dm_put_device(config->owning_target, config->owned_device);186 187	vdo_free(config->parent_device_name);188	vdo_free(config->original_string);189 190	/* Reduce the chance a use-after-free (as in BZ 1669960) happens to work. */191	memset(config, 0, sizeof(*config));192	vdo_free(config);193}194 195/**196 * get_version_number() - Decide the version number from argv.197 *198 * @argc: The number of table values.199 * @argv: The array of table values.200 * @error_ptr: A pointer to return a error string in.201 * @version_ptr: A pointer to return the version.202 *203 * Return: VDO_SUCCESS or an error code.204 */205static int get_version_number(int argc, char **argv, char **error_ptr,206			      unsigned int *version_ptr)207{208	/* version, if it exists, is in a form of V<n> */209	if (sscanf(argv[0], "V%u", version_ptr) == 1) {210		if (*version_ptr < 1 || *version_ptr > TABLE_VERSION) {211			*error_ptr = "Unknown version number detected";212			return VDO_BAD_CONFIGURATION;213		}214	} else {215		/* V0 actually has no version number in the table string */216		*version_ptr = 0;217	}218 219	/*220	 * V0 and V1 have no optional parameters. There will always be a parameter for thread221	 * config, even if it's a "." to show it's an empty list.222	 */223	if (*version_ptr <= 1) {224		if (argc != REQUIRED_ARGC[*version_ptr]) {225			*error_ptr = "Incorrect number of arguments for version";226			return VDO_BAD_CONFIGURATION;227		}228	} else if (argc < REQUIRED_ARGC[*version_ptr]) {229		*error_ptr = "Incorrect number of arguments for version";230		return VDO_BAD_CONFIGURATION;231	}232 233	if (*version_ptr != TABLE_VERSION) {234		vdo_log_warning("Detected version mismatch between kernel module and tools kernel: %d, tool: %d",235				TABLE_VERSION, *version_ptr);236		vdo_log_warning("Please consider upgrading management tools to match kernel.");237	}238	return VDO_SUCCESS;239}240 241/* Free a list of non-NULL string pointers, and then the list itself. */242static void free_string_array(char **string_array)243{244	unsigned int offset;245 246	for (offset = 0; string_array[offset] != NULL; offset++)247		vdo_free(string_array[offset]);248	vdo_free(string_array);249}250 251/*252 * Split the input string into substrings, separated at occurrences of the indicated character,253 * returning a null-terminated list of string pointers.254 *255 * The string pointers and the pointer array itself should both be freed with vdo_free() when no256 * longer needed. This can be done with vdo_free_string_array (below) if the pointers in the array257 * are not changed. Since the array and copied strings are allocated by this function, it may only258 * be used in contexts where allocation is permitted.259 *260 * Empty substrings are not ignored; that is, returned substrings may be empty strings if the261 * separator occurs twice in a row.262 */263static int split_string(const char *string, char separator, char ***substring_array_ptr)264{265	unsigned int current_substring = 0, substring_count = 1;266	const char *s;267	char **substrings;268	int result;269	ptrdiff_t length;270 271	for (s = string; *s != 0; s++) {272		if (*s == separator)273			substring_count++;274	}275 276	result = vdo_allocate(substring_count + 1, char *, "string-splitting array",277			      &substrings);278	if (result != VDO_SUCCESS)279		return result;280 281	for (s = string; *s != 0; s++) {282		if (*s == separator) {283			ptrdiff_t length = s - string;284 285			result = vdo_allocate(length + 1, char, "split string",286					      &substrings[current_substring]);287			if (result != VDO_SUCCESS) {288				free_string_array(substrings);289				return result;290			}291			/*292			 * Trailing NUL is already in place after allocation; deal with the zero or293			 * more non-NUL bytes in the string.294			 */295			if (length > 0)296				memcpy(substrings[current_substring], string, length);297			string = s + 1;298			current_substring++;299			BUG_ON(current_substring >= substring_count);300		}301	}302	/* Process final string, with no trailing separator. */303	BUG_ON(current_substring != (substring_count - 1));304	length = strlen(string);305 306	result = vdo_allocate(length + 1, char, "split string",307			      &substrings[current_substring]);308	if (result != VDO_SUCCESS) {309		free_string_array(substrings);310		return result;311	}312	memcpy(substrings[current_substring], string, length);313	current_substring++;314	/* substrings[current_substring] is NULL already */315	*substring_array_ptr = substrings;316	return VDO_SUCCESS;317}318 319/*320 * Join the input substrings into one string, joined with the indicated character, returning a321 * string. array_length is a bound on the number of valid elements in substring_array, in case it322 * is not NULL-terminated.323 */324static int join_strings(char **substring_array, size_t array_length, char separator,325			char **string_ptr)326{327	size_t string_length = 0;328	size_t i;329	int result;330	char *output, *current_position;331 332	for (i = 0; (i < array_length) && (substring_array[i] != NULL); i++)333		string_length += strlen(substring_array[i]) + 1;334 335	result = vdo_allocate(string_length, char, __func__, &output);336	if (result != VDO_SUCCESS)337		return result;338 339	current_position = &output[0];340 341	for (i = 0; (i < array_length) && (substring_array[i] != NULL); i++) {342		current_position = vdo_append_to_buffer(current_position,343							output + string_length, "%s",344							substring_array[i]);345		*current_position = separator;346		current_position++;347	}348 349	/* We output one too many separators; replace the last with a zero byte. */350	if (current_position != output)351		*(current_position - 1) = '\0';352 353	*string_ptr = output;354	return VDO_SUCCESS;355}356 357/**358 * parse_bool() - Parse a two-valued option into a bool.359 * @bool_str: The string value to convert to a bool.360 * @true_str: The string value which should be converted to true.361 * @false_str: The string value which should be converted to false.362 * @bool_ptr: A pointer to return the bool value in.363 *364 * Return: VDO_SUCCESS or an error if bool_str is neither true_str nor false_str.365 */366static inline int __must_check parse_bool(const char *bool_str, const char *true_str,367					  const char *false_str, bool *bool_ptr)368{369	bool value = false;370 371	if (strcmp(bool_str, true_str) == 0)372		value = true;373	else if (strcmp(bool_str, false_str) == 0)374		value = false;375	else376		return VDO_BAD_CONFIGURATION;377 378	*bool_ptr = value;379	return VDO_SUCCESS;380}381 382/**383 * process_one_thread_config_spec() - Process one component of a thread parameter configuration384 *				      string and update the configuration data structure.385 * @thread_param_type: The type of thread specified.386 * @count: The thread count requested.387 * @config: The configuration data structure to update.388 *389 * If the thread count requested is invalid, a message is logged and -EINVAL returned. If the390 * thread name is unknown, a message is logged but no error is returned.391 *392 * Return: VDO_SUCCESS or -EINVAL393 */394static int process_one_thread_config_spec(const char *thread_param_type,395					  unsigned int count,396					  struct thread_count_config *config)397{398	/* Handle limited thread parameters */399	if (strcmp(thread_param_type, "bioRotationInterval") == 0) {400		if (count == 0) {401			vdo_log_error("thread config string error:  'bioRotationInterval' of at least 1 is required");402			return -EINVAL;403		} else if (count > VDO_BIO_ROTATION_INTERVAL_LIMIT) {404			vdo_log_error("thread config string error: 'bioRotationInterval' cannot be higher than %d",405				      VDO_BIO_ROTATION_INTERVAL_LIMIT);406			return -EINVAL;407		}408		config->bio_rotation_interval = count;409		return VDO_SUCCESS;410	}411	if (strcmp(thread_param_type, "logical") == 0) {412		if (count > MAX_VDO_LOGICAL_ZONES) {413			vdo_log_error("thread config string error: at most %d 'logical' threads are allowed",414				      MAX_VDO_LOGICAL_ZONES);415			return -EINVAL;416		}417		config->logical_zones = count;418		return VDO_SUCCESS;419	}420	if (strcmp(thread_param_type, "physical") == 0) {421		if (count > MAX_VDO_PHYSICAL_ZONES) {422			vdo_log_error("thread config string error: at most %d 'physical' threads are allowed",423				      MAX_VDO_PHYSICAL_ZONES);424			return -EINVAL;425		}426		config->physical_zones = count;427		return VDO_SUCCESS;428	}429	/* Handle other thread count parameters */430	if (count > MAXIMUM_VDO_THREADS) {431		vdo_log_error("thread config string error: at most %d '%s' threads are allowed",432			      MAXIMUM_VDO_THREADS, thread_param_type);433		return -EINVAL;434	}435	if (strcmp(thread_param_type, "hash") == 0) {436		config->hash_zones = count;437		return VDO_SUCCESS;438	}439	if (strcmp(thread_param_type, "cpu") == 0) {440		if (count == 0) {441			vdo_log_error("thread config string error: at least one 'cpu' thread required");442			return -EINVAL;443		}444		config->cpu_threads = count;445		return VDO_SUCCESS;446	}447	if (strcmp(thread_param_type, "ack") == 0) {448		config->bio_ack_threads = count;449		return VDO_SUCCESS;450	}451	if (strcmp(thread_param_type, "bio") == 0) {452		if (count == 0) {453			vdo_log_error("thread config string error: at least one 'bio' thread required");454			return -EINVAL;455		}456		config->bio_threads = count;457		return VDO_SUCCESS;458	}459 460	/*461	 * Don't fail, just log. This will handle version mismatches between user mode tools and462	 * kernel.463	 */464	vdo_log_info("unknown thread parameter type \"%s\"", thread_param_type);465	return VDO_SUCCESS;466}467 468/**469 * parse_one_thread_config_spec() - Parse one component of a thread parameter configuration string470 *				    and update the configuration data structure.471 * @spec: The thread parameter specification string.472 * @config: The configuration data to be updated.473 */474static int parse_one_thread_config_spec(const char *spec,475					struct thread_count_config *config)476{477	unsigned int count;478	char **fields;479	int result;480 481	result = split_string(spec, '=', &fields);482	if (result != VDO_SUCCESS)483		return result;484 485	if ((fields[0] == NULL) || (fields[1] == NULL) || (fields[2] != NULL)) {486		vdo_log_error("thread config string error: expected thread parameter assignment, saw \"%s\"",487			      spec);488		free_string_array(fields);489		return -EINVAL;490	}491 492	result = kstrtouint(fields[1], 10, &count);493	if (result) {494		vdo_log_error("thread config string error: integer value needed, found \"%s\"",495			      fields[1]);496		free_string_array(fields);497		return result;498	}499 500	result = process_one_thread_config_spec(fields[0], count, config);501	free_string_array(fields);502	return result;503}504 505/**506 * parse_thread_config_string() - Parse the configuration string passed and update the specified507 *				  counts and other parameters of various types of threads to be508 *				  created.509 * @string: Thread parameter configuration string.510 * @config: The thread configuration data to update.511 *512 * The configuration string should contain one or more comma-separated specs of the form513 * "typename=number"; the supported type names are "cpu", "ack", "bio", "bioRotationInterval",514 * "logical", "physical", and "hash".515 *516 * If an error occurs during parsing of a single key/value pair, we deem it serious enough to stop517 * further parsing.518 *519 * This function can't set the "reason" value the caller wants to pass back, because we'd want to520 * format it to say which field was invalid, and we can't allocate the "reason" strings521 * dynamically. So if an error occurs, we'll log the details and pass back an error.522 *523 * Return: VDO_SUCCESS or -EINVAL or -ENOMEM524 */525static int parse_thread_config_string(const char *string,526				      struct thread_count_config *config)527{528	int result = VDO_SUCCESS;529	char **specs;530 531	if (strcmp(".", string) != 0) {532		unsigned int i;533 534		result = split_string(string, ',', &specs);535		if (result != VDO_SUCCESS)536			return result;537 538		for (i = 0; specs[i] != NULL; i++) {539			result = parse_one_thread_config_spec(specs[i], config);540			if (result != VDO_SUCCESS)541				break;542		}543		free_string_array(specs);544	}545	return result;546}547 548/**549 * process_one_key_value_pair() - Process one component of an optional parameter string and update550 *				  the configuration data structure.551 * @key: The optional parameter key name.552 * @value: The optional parameter value.553 * @config: The configuration data structure to update.554 *555 * If the value requested is invalid, a message is logged and -EINVAL returned. If the key is556 * unknown, a message is logged but no error is returned.557 *558 * Return: VDO_SUCCESS or -EINVAL559 */560static int process_one_key_value_pair(const char *key, unsigned int value,561				      struct device_config *config)562{563	/* Non thread optional parameters */564	if (strcmp(key, "maxDiscard") == 0) {565		if (value == 0) {566			vdo_log_error("optional parameter error: at least one max discard block required");567			return -EINVAL;568		}569		/* Max discard sectors in blkdev_issue_discard is UINT_MAX >> 9 */570		if (value > (UINT_MAX / VDO_BLOCK_SIZE)) {571			vdo_log_error("optional parameter error: at most %d max discard	 blocks are allowed",572				      UINT_MAX / VDO_BLOCK_SIZE);573			return -EINVAL;574		}575		config->max_discard_blocks = value;576		return VDO_SUCCESS;577	}578	/* Handles unknown key names */579	return process_one_thread_config_spec(key, value, &config->thread_counts);580}581 582/**583 * parse_one_key_value_pair() - Parse one key/value pair and update the configuration data584 *				structure.585 * @key: The optional key name.586 * @value: The optional value.587 * @config: The configuration data to be updated.588 *589 * Return: VDO_SUCCESS or error.590 */591static int parse_one_key_value_pair(const char *key, const char *value,592				    struct device_config *config)593{594	unsigned int count;595	int result;596 597	if (strcmp(key, "deduplication") == 0)598		return parse_bool(value, "on", "off", &config->deduplication);599 600	if (strcmp(key, "compression") == 0)601		return parse_bool(value, "on", "off", &config->compression);602 603	/* The remaining arguments must have integral values. */604	result = kstrtouint(value, 10, &count);605	if (result) {606		vdo_log_error("optional config string error: integer value needed, found \"%s\"",607			      value);608		return result;609	}610	return process_one_key_value_pair(key, count, config);611}612 613/**614 * parse_key_value_pairs() - Parse all key/value pairs from a list of arguments.615 * @argc: The total number of arguments in list.616 * @argv: The list of key/value pairs.617 * @config: The device configuration data to update.618 *619 * If an error occurs during parsing of a single key/value pair, we deem it serious enough to stop620 * further parsing.621 *622 * This function can't set the "reason" value the caller wants to pass back, because we'd want to623 * format it to say which field was invalid, and we can't allocate the "reason" strings624 * dynamically. So if an error occurs, we'll log the details and return the error.625 *626 * Return: VDO_SUCCESS or error627 */628static int parse_key_value_pairs(int argc, char **argv, struct device_config *config)629{630	int result = VDO_SUCCESS;631 632	while (argc) {633		result = parse_one_key_value_pair(argv[0], argv[1], config);634		if (result != VDO_SUCCESS)635			break;636 637		argc -= 2;638		argv += 2;639	}640 641	return result;642}643 644/**645 * parse_optional_arguments() - Parse the configuration string passed in for optional arguments.646 * @arg_set: The structure holding the arguments to parse.647 * @error_ptr: Pointer to a buffer to hold the error string.648 * @config: Pointer to device configuration data to update.649 *650 * For V0/V1 configurations, there will only be one optional parameter; the thread configuration.651 * The configuration string should contain one or more comma-separated specs of the form652 * "typename=number"; the supported type names are "cpu", "ack", "bio", "bioRotationInterval",653 * "logical", "physical", and "hash".654 *655 * For V2 configurations and beyond, there could be any number of arguments. They should contain656 * one or more key/value pairs separated by a space.657 *658 * Return: VDO_SUCCESS or error659 */660static int parse_optional_arguments(struct dm_arg_set *arg_set, char **error_ptr,661				    struct device_config *config)662{663	int result = VDO_SUCCESS;664 665	if (config->version == 0 || config->version == 1) {666		result = parse_thread_config_string(arg_set->argv[0],667						    &config->thread_counts);668		if (result != VDO_SUCCESS) {669			*error_ptr = "Invalid thread-count configuration";670			return VDO_BAD_CONFIGURATION;671		}672	} else {673		if ((arg_set->argc % 2) != 0) {674			*error_ptr = "Odd number of optional arguments given but they should be <key> <value> pairs";675			return VDO_BAD_CONFIGURATION;676		}677		result = parse_key_value_pairs(arg_set->argc, arg_set->argv, config);678		if (result != VDO_SUCCESS) {679			*error_ptr = "Invalid optional argument configuration";680			return VDO_BAD_CONFIGURATION;681		}682	}683	return result;684}685 686/**687 * handle_parse_error() - Handle a parsing error.688 * @config: The config to free.689 * @error_ptr: A place to store a constant string about the error.690 * @error_str: A constant string to store in error_ptr.691 */692static void handle_parse_error(struct device_config *config, char **error_ptr,693			       char *error_str)694{695	free_device_config(config);696	*error_ptr = error_str;697}698 699/**700 * parse_device_config() - Convert the dmsetup table into a struct device_config.701 * @argc: The number of table values.702 * @argv: The array of table values.703 * @ti: The target structure for this table.704 * @config_ptr: A pointer to return the allocated config.705 *706 * Return: VDO_SUCCESS or an error code.707 */708static int parse_device_config(int argc, char **argv, struct dm_target *ti,709			       struct device_config **config_ptr)710{711	bool enable_512e;712	size_t logical_bytes = to_bytes(ti->len);713	struct dm_arg_set arg_set;714	char **error_ptr = &ti->error;715	struct device_config *config = NULL;716	int result;717 718	if ((logical_bytes % VDO_BLOCK_SIZE) != 0) {719		handle_parse_error(config, error_ptr,720				   "Logical size must be a multiple of 4096");721		return VDO_BAD_CONFIGURATION;722	}723 724	if (argc == 0) {725		handle_parse_error(config, error_ptr, "Incorrect number of arguments");726		return VDO_BAD_CONFIGURATION;727	}728 729	result = vdo_allocate(1, struct device_config, "device_config", &config);730	if (result != VDO_SUCCESS) {731		handle_parse_error(config, error_ptr,732				   "Could not allocate config structure");733		return VDO_BAD_CONFIGURATION;734	}735 736	config->owning_target = ti;737	config->logical_blocks = logical_bytes / VDO_BLOCK_SIZE;738	INIT_LIST_HEAD(&config->config_list);739 740	/* Save the original string. */741	result = join_strings(argv, argc, ' ', &config->original_string);742	if (result != VDO_SUCCESS) {743		handle_parse_error(config, error_ptr, "Could not populate string");744		return VDO_BAD_CONFIGURATION;745	}746 747	vdo_log_info("table line: %s", config->original_string);748 749	config->thread_counts = (struct thread_count_config) {750		.bio_ack_threads = 1,751		.bio_threads = DEFAULT_VDO_BIO_SUBMIT_QUEUE_COUNT,752		.bio_rotation_interval = DEFAULT_VDO_BIO_SUBMIT_QUEUE_ROTATE_INTERVAL,753		.cpu_threads = 1,754		.logical_zones = 0,755		.physical_zones = 0,756		.hash_zones = 0,757	};758	config->max_discard_blocks = 1;759	config->deduplication = true;760	config->compression = false;761 762	arg_set.argc = argc;763	arg_set.argv = argv;764 765	result = get_version_number(argc, argv, error_ptr, &config->version);766	if (result != VDO_SUCCESS) {767		/* get_version_number sets error_ptr itself. */768		handle_parse_error(config, error_ptr, *error_ptr);769		return result;770	}771	/* Move the arg pointer forward only if the argument was there. */772	if (config->version >= 1)773		dm_shift_arg(&arg_set);774 775	result = vdo_duplicate_string(dm_shift_arg(&arg_set), "parent device name",776				      &config->parent_device_name);777	if (result != VDO_SUCCESS) {778		handle_parse_error(config, error_ptr,779				   "Could not copy parent device name");780		return VDO_BAD_CONFIGURATION;781	}782 783	/* Get the physical blocks, if known. */784	if (config->version >= 1) {785		result = kstrtoull(dm_shift_arg(&arg_set), 10, &config->physical_blocks);786		if (result != VDO_SUCCESS) {787			handle_parse_error(config, error_ptr,788					   "Invalid physical block count");789			return VDO_BAD_CONFIGURATION;790		}791	}792 793	/* Get the logical block size and validate */794	result = parse_bool(dm_shift_arg(&arg_set), "512", "4096", &enable_512e);795	if (result != VDO_SUCCESS) {796		handle_parse_error(config, error_ptr, "Invalid logical block size");797		return VDO_BAD_CONFIGURATION;798	}799	config->logical_block_size = (enable_512e ? 512 : 4096);800 801	/* Skip past the two no longer used read cache options. */802	if (config->version <= 1)803		dm_consume_args(&arg_set, 2);804 805	/* Get the page cache size. */806	result = kstrtouint(dm_shift_arg(&arg_set), 10, &config->cache_size);807	if (result != VDO_SUCCESS) {808		handle_parse_error(config, error_ptr,809				   "Invalid block map page cache size");810		return VDO_BAD_CONFIGURATION;811	}812 813	/* Get the block map era length. */814	result = kstrtouint(dm_shift_arg(&arg_set), 10, &config->block_map_maximum_age);815	if (result != VDO_SUCCESS) {816		handle_parse_error(config, error_ptr, "Invalid block map maximum age");817		return VDO_BAD_CONFIGURATION;818	}819 820	/* Skip past the no longer used MD RAID5 optimization mode */821	if (config->version <= 2)822		dm_consume_args(&arg_set, 1);823 824	/* Skip past the no longer used write policy setting */825	if (config->version <= 3)826		dm_consume_args(&arg_set, 1);827 828	/* Skip past the no longer used pool name for older table lines */829	if (config->version <= 2) {830		/*831		 * Make sure the enum to get the pool name from argv directly is still in sync with832		 * the parsing of the table line.833		 */834		if (&arg_set.argv[0] != &argv[POOL_NAME_ARG_INDEX[config->version]]) {835			handle_parse_error(config, error_ptr,836					   "Pool name not in expected location");837			return VDO_BAD_CONFIGURATION;838		}839		dm_shift_arg(&arg_set);840	}841 842	/* Get the optional arguments and validate. */843	result = parse_optional_arguments(&arg_set, error_ptr, config);844	if (result != VDO_SUCCESS) {845		/* parse_optional_arguments sets error_ptr itself. */846		handle_parse_error(config, error_ptr, *error_ptr);847		return result;848	}849 850	/*851	 * Logical, physical, and hash zone counts can all be zero; then we get one thread doing852	 * everything, our older configuration. If any zone count is non-zero, the others must be853	 * as well.854	 */855	if (((config->thread_counts.logical_zones == 0) !=856	     (config->thread_counts.physical_zones == 0)) ||857	    ((config->thread_counts.physical_zones == 0) !=858	     (config->thread_counts.hash_zones == 0))) {859		handle_parse_error(config, error_ptr,860				   "Logical, physical, and hash zones counts must all be zero or all non-zero");861		return VDO_BAD_CONFIGURATION;862	}863 864	if (config->cache_size <865	    (2 * MAXIMUM_VDO_USER_VIOS * config->thread_counts.logical_zones)) {866		handle_parse_error(config, error_ptr,867				   "Insufficient block map cache for logical zones");868		return VDO_BAD_CONFIGURATION;869	}870 871	result = dm_get_device(ti, config->parent_device_name,872			       dm_table_get_mode(ti->table), &config->owned_device);873	if (result != 0) {874		vdo_log_error("couldn't open device \"%s\": error %d",875			      config->parent_device_name, result);876		handle_parse_error(config, error_ptr, "Unable to open storage device");877		return VDO_BAD_CONFIGURATION;878	}879 880	if (config->version == 0) {881		u64 device_size = bdev_nr_bytes(config->owned_device->bdev);882 883		config->physical_blocks = device_size / VDO_BLOCK_SIZE;884	}885 886	*config_ptr = config;887	return result;888}889 890static struct vdo *get_vdo_for_target(struct dm_target *ti)891{892	return ((struct device_config *) ti->private)->vdo;893}894 895 896static int vdo_map_bio(struct dm_target *ti, struct bio *bio)897{898	struct vdo *vdo = get_vdo_for_target(ti);899	struct vdo_work_queue *current_work_queue;900	const struct admin_state_code *code = vdo_get_admin_state_code(&vdo->admin.state);901 902	VDO_ASSERT_LOG_ONLY(code->normal, "vdo should not receive bios while in state %s",903			    code->name);904 905	/* Count all incoming bios. */906	vdo_count_bios(&vdo->stats.bios_in, bio);907 908 909	/* Handle empty bios.  Empty flush bios are not associated with a vio. */910	if ((bio_op(bio) == REQ_OP_FLUSH) || ((bio->bi_opf & REQ_PREFLUSH) != 0)) {911		vdo_launch_flush(vdo, bio);912		return DM_MAPIO_SUBMITTED;913	}914 915	/* This could deadlock, */916	current_work_queue = vdo_get_current_work_queue();917	BUG_ON((current_work_queue != NULL) &&918	       (vdo == vdo_get_work_queue_owner(current_work_queue)->vdo));919	vdo_launch_bio(vdo->data_vio_pool, bio);920	return DM_MAPIO_SUBMITTED;921}922 923static void vdo_io_hints(struct dm_target *ti, struct queue_limits *limits)924{925	struct vdo *vdo = get_vdo_for_target(ti);926 927	limits->logical_block_size = vdo->device_config->logical_block_size;928	limits->physical_block_size = VDO_BLOCK_SIZE;929 930	/* The minimum io size for random io */931	limits->io_min = VDO_BLOCK_SIZE;932	/* The optimal io size for streamed/sequential io */933	limits->io_opt = VDO_BLOCK_SIZE;934 935	/*936	 * Sets the maximum discard size that will be passed into VDO. This value comes from a937	 * table line value passed in during dmsetup create.938	 *939	 * The value 1024 is the largest usable value on HD systems. A 2048 sector discard on a940	 * busy HD system takes 31 seconds. We should use a value no higher than 1024, which takes941	 * 15 to 16 seconds on a busy HD system. However, using large values results in 120 second942	 * blocked task warnings in kernel logs. In order to avoid these warnings, we choose to943	 * use the smallest reasonable value.944	 *945	 * The value is used by dm-thin to determine whether to pass down discards. The block layer946	 * splits large discards on this boundary when this is set.947	 */948	limits->max_hw_discard_sectors =949		(vdo->device_config->max_discard_blocks * VDO_SECTORS_PER_BLOCK);950 951	/*952	 * Force discards to not begin or end with a partial block by stating the granularity is953	 * 4k.954	 */955	limits->discard_granularity = VDO_BLOCK_SIZE;956}957 958static int vdo_iterate_devices(struct dm_target *ti, iterate_devices_callout_fn fn,959			       void *data)960{961	struct device_config *config = get_vdo_for_target(ti)->device_config;962 963	return fn(ti, config->owned_device, 0,964		  config->physical_blocks * VDO_SECTORS_PER_BLOCK, data);965}966 967/*968 * Status line is:969 *    <device> <operating mode> <in recovery> <index state> <compression state>970 *    <used physical blocks> <total physical blocks>971 */972 973static void vdo_status(struct dm_target *ti, status_type_t status_type,974		       unsigned int status_flags, char *result, unsigned int maxlen)975{976	struct vdo *vdo = get_vdo_for_target(ti);977	struct vdo_statistics *stats;978	struct device_config *device_config;979	/* N.B.: The DMEMIT macro uses the variables named "sz", "result", "maxlen". */980	int sz = 0;981 982	switch (status_type) {983	case STATUSTYPE_INFO:984		/* Report info for dmsetup status */985		mutex_lock(&vdo->stats_mutex);986		vdo_fetch_statistics(vdo, &vdo->stats_buffer);987		stats = &vdo->stats_buffer;988 989		DMEMIT("/dev/%pg %s %s %s %s %llu %llu",990		       vdo_get_backing_device(vdo), stats->mode,991		       stats->in_recovery_mode ? "recovering" : "-",992		       vdo_get_dedupe_index_state_name(vdo->hash_zones),993		       vdo_get_compressing(vdo) ? "online" : "offline",994		       stats->data_blocks_used + stats->overhead_blocks_used,995		       stats->physical_blocks);996		mutex_unlock(&vdo->stats_mutex);997		break;998 999	case STATUSTYPE_TABLE:1000		/* Report the string actually specified in the beginning. */1001		device_config = (struct device_config *) ti->private;1002		DMEMIT("%s", device_config->original_string);1003		break;1004 1005	case STATUSTYPE_IMA:1006		/* FIXME: We ought to be more detailed here, but this is what thin does. */1007		*result = '\0';1008		break;1009	}1010}1011 1012static block_count_t __must_check get_underlying_device_block_count(const struct vdo *vdo)1013{1014	return bdev_nr_bytes(vdo_get_backing_device(vdo)) / VDO_BLOCK_SIZE;1015}1016 1017static int __must_check process_vdo_message_locked(struct vdo *vdo, unsigned int argc,1018						   char **argv)1019{1020	if ((argc == 2) && (strcasecmp(argv[0], "compression") == 0)) {1021		if (strcasecmp(argv[1], "on") == 0) {1022			vdo_set_compressing(vdo, true);1023			return 0;1024		}1025 1026		if (strcasecmp(argv[1], "off") == 0) {1027			vdo_set_compressing(vdo, false);1028			return 0;1029		}1030 1031		vdo_log_warning("invalid argument '%s' to dmsetup compression message",1032				argv[1]);1033		return -EINVAL;1034	}1035 1036	vdo_log_warning("unrecognized dmsetup message '%s' received", argv[0]);1037	return -EINVAL;1038}1039 1040/*1041 * If the message is a dump, just do it. Otherwise, check that no other message is being processed,1042 * and only proceed if so.1043 * Returns -EBUSY if another message is being processed1044 */1045static int __must_check process_vdo_message(struct vdo *vdo, unsigned int argc,1046					    char **argv)1047{1048	int result;1049 1050	/*1051	 * All messages which may be processed in parallel with other messages should be handled1052	 * here before the atomic check below. Messages which should be exclusive should be1053	 * processed in process_vdo_message_locked().1054	 */1055 1056	/* Dump messages should always be processed */1057	if (strcasecmp(argv[0], "dump") == 0)1058		return vdo_dump(vdo, argc, argv, "dmsetup message");1059 1060	if (argc == 1) {1061		if (strcasecmp(argv[0], "dump-on-shutdown") == 0) {1062			vdo->dump_on_shutdown = true;1063			return 0;1064		}1065 1066		/* Index messages should always be processed */1067		if ((strcasecmp(argv[0], "index-close") == 0) ||1068		    (strcasecmp(argv[0], "index-create") == 0) ||1069		    (strcasecmp(argv[0], "index-disable") == 0) ||1070		    (strcasecmp(argv[0], "index-enable") == 0))1071			return vdo_message_dedupe_index(vdo->hash_zones, argv[0]);1072	}1073 1074	if (atomic_cmpxchg(&vdo->processing_message, 0, 1) != 0)1075		return -EBUSY;1076 1077	result = process_vdo_message_locked(vdo, argc, argv);1078 1079	/* Pairs with the implicit barrier in cmpxchg just above */1080	smp_wmb();1081	atomic_set(&vdo->processing_message, 0);1082	return result;1083}1084 1085static int vdo_message(struct dm_target *ti, unsigned int argc, char **argv,1086		       char *result_buffer, unsigned int maxlen)1087{1088	struct registered_thread allocating_thread, instance_thread;1089	struct vdo *vdo;1090	int result;1091 1092	if (argc == 0) {1093		vdo_log_warning("unspecified dmsetup message");1094		return -EINVAL;1095	}1096 1097	vdo = get_vdo_for_target(ti);1098	vdo_register_allocating_thread(&allocating_thread, NULL);1099	vdo_register_thread_device_id(&instance_thread, &vdo->instance);1100 1101	/*1102	 * Must be done here so we don't map return codes. The code in dm-ioctl expects a 1 for a1103	 * return code to look at the buffer and see if it is full or not.1104	 */1105	if ((argc == 1) && (strcasecmp(argv[0], "stats") == 0)) {1106		vdo_write_stats(vdo, result_buffer, maxlen);1107		result = 1;1108	} else if ((argc == 1) && (strcasecmp(argv[0], "config") == 0)) {1109		vdo_write_config(vdo, &result_buffer, &maxlen);1110		result = 1;1111	} else {1112		result = vdo_status_to_errno(process_vdo_message(vdo, argc, argv));1113	}1114 1115	vdo_unregister_thread_device_id();1116	vdo_unregister_allocating_thread();1117	return result;1118}1119 1120static void configure_target_capabilities(struct dm_target *ti)1121{1122	ti->discards_supported = 1;1123	ti->flush_supported = true;1124	ti->num_discard_bios = 1;1125	ti->num_flush_bios = 1;1126 1127	/*1128	 * If this value changes, please make sure to update the value for max_discard_sectors1129	 * accordingly.1130	 */1131	BUG_ON(dm_set_target_max_io_len(ti, VDO_SECTORS_PER_BLOCK) != 0);1132}1133 1134/*1135 * Implements vdo_filter_fn.1136 */1137static bool vdo_uses_device(struct vdo *vdo, const void *context)1138{1139	const struct device_config *config = context;1140 1141	return vdo_get_backing_device(vdo)->bd_dev == config->owned_device->bdev->bd_dev;1142}1143 1144/**1145 * get_thread_id_for_phase() - Get the thread id for the current phase of the admin operation in1146 *                             progress.1147 */1148static thread_id_t __must_check get_thread_id_for_phase(struct vdo *vdo)1149{1150	switch (vdo->admin.phase) {1151	case RESUME_PHASE_PACKER:1152	case RESUME_PHASE_FLUSHER:1153	case SUSPEND_PHASE_PACKER:1154	case SUSPEND_PHASE_FLUSHES:1155		return vdo->thread_config.packer_thread;1156 1157	case RESUME_PHASE_DATA_VIOS:1158	case SUSPEND_PHASE_DATA_VIOS:1159		return vdo->thread_config.cpu_thread;1160 1161	case LOAD_PHASE_DRAIN_JOURNAL:1162	case RESUME_PHASE_JOURNAL:1163	case SUSPEND_PHASE_JOURNAL:1164		return vdo->thread_config.journal_thread;1165 1166	default:1167		return vdo->thread_config.admin_thread;1168	}1169}1170 1171static struct vdo_completion *prepare_admin_completion(struct vdo *vdo,1172						       vdo_action_fn callback,1173						       vdo_action_fn error_handler)1174{1175	struct vdo_completion *completion = &vdo->admin.completion;1176 1177	/*1178	 * We can't use vdo_prepare_completion_for_requeue() here because we don't want to reset1179	 * any error in the completion.1180	 */1181	completion->callback = callback;1182	completion->error_handler = error_handler;1183	completion->callback_thread_id = get_thread_id_for_phase(vdo);1184	completion->requeue = true;1185	return completion;1186}1187 1188/**1189 * advance_phase() - Increment the phase of the current admin operation and prepare the admin1190 *                   completion to run on the thread for the next phase.1191 * @vdo: The on which an admin operation is being performed1192 *1193 * Return: The current phase1194 */1195static u32 advance_phase(struct vdo *vdo)1196{1197	u32 phase = vdo->admin.phase++;1198 1199	vdo->admin.completion.callback_thread_id = get_thread_id_for_phase(vdo);1200	vdo->admin.completion.requeue = true;1201	return phase;1202}1203 1204/*1205 * Perform an administrative operation (load, suspend, grow logical, or grow physical). This method1206 * should not be called from vdo threads.1207 */1208static int perform_admin_operation(struct vdo *vdo, u32 starting_phase,1209				   vdo_action_fn callback, vdo_action_fn error_handler,1210				   const char *type)1211{1212	int result;1213	struct vdo_administrator *admin = &vdo->admin;1214 1215	if (atomic_cmpxchg(&admin->busy, 0, 1) != 0) {1216		return vdo_log_error_strerror(VDO_COMPONENT_BUSY,1217					      "Can't start %s operation, another operation is already in progress",1218					      type);1219	}1220 1221	admin->phase = starting_phase;1222	reinit_completion(&admin->callback_sync);1223	vdo_reset_completion(&admin->completion);1224	vdo_launch_completion(prepare_admin_completion(vdo, callback, error_handler));1225 1226	/*1227	 * Using the "interruptible" interface means that Linux will not log a message when we wait1228	 * for more than 120 seconds.1229	 */1230	while (wait_for_completion_interruptible(&admin->callback_sync)) {1231		/* However, if we get a signal in a user-mode process, we could spin... */1232		fsleep(1000);1233	}1234 1235	result = admin->completion.result;1236	/* pairs with implicit barrier in cmpxchg above */1237	smp_wmb();1238	atomic_set(&admin->busy, 0);1239	return result;1240}1241 1242/* Assert that we are operating on the correct thread for the current phase. */1243static void assert_admin_phase_thread(struct vdo *vdo, const char *what)1244{1245	VDO_ASSERT_LOG_ONLY(vdo_get_callback_thread_id() == get_thread_id_for_phase(vdo),1246			    "%s on correct thread for %s", what,1247			    ADMIN_PHASE_NAMES[vdo->admin.phase]);1248}1249 1250/**1251 * finish_operation_callback() - Callback to finish an admin operation.1252 * @completion: The admin_completion.1253 */1254static void finish_operation_callback(struct vdo_completion *completion)1255{1256	struct vdo_administrator *admin = &completion->vdo->admin;1257 1258	vdo_finish_operation(&admin->state, completion->result);1259	complete(&admin->callback_sync);1260}1261 1262/**1263 * decode_from_super_block() - Decode the VDO state from the super block and validate that it is1264 *                             correct.1265 * @vdo: The vdo being loaded.1266 *1267 * On error from this method, the component states must be destroyed explicitly. If this method1268 * returns successfully, the component states must not be destroyed.1269 *1270 * Return: VDO_SUCCESS or an error.1271 */1272static int __must_check decode_from_super_block(struct vdo *vdo)1273{1274	const struct device_config *config = vdo->device_config;1275	int result;1276 1277	result = vdo_decode_component_states(vdo->super_block.buffer, &vdo->geometry,1278					     &vdo->states);1279	if (result != VDO_SUCCESS)1280		return result;1281 1282	vdo_set_state(vdo, vdo->states.vdo.state);1283	vdo->load_state = vdo->states.vdo.state;1284 1285	/*1286	 * If the device config specifies a larger logical size than was recorded in the super1287	 * block, just accept it.1288	 */1289	if (vdo->states.vdo.config.logical_blocks < config->logical_blocks) {1290		vdo_log_warning("Growing logical size: a logical size of %llu blocks was specified, but that differs from the %llu blocks configured in the vdo super block",1291				(unsigned long long) config->logical_blocks,1292				(unsigned long long) vdo->states.vdo.config.logical_blocks);1293		vdo->states.vdo.config.logical_blocks = config->logical_blocks;1294	}1295 1296	result = vdo_validate_component_states(&vdo->states, vdo->geometry.nonce,1297					       config->physical_blocks,1298					       config->logical_blocks);1299	if (result != VDO_SUCCESS)1300		return result;1301 1302	vdo->layout = vdo->states.layout;1303	return VDO_SUCCESS;1304}1305 1306/**1307 * decode_vdo() - Decode the component data portion of a super block and fill in the corresponding1308 *                portions of the vdo being loaded.1309 * @vdo: The vdo being loaded.1310 *1311 * This will also allocate the recovery journal and slab depot. If this method is called with an1312 * asynchronous layer (i.e. a thread config which specifies at least one base thread), the block1313 * map and packer will be constructed as well.1314 *1315 * Return: VDO_SUCCESS or an error.1316 */1317static int __must_check decode_vdo(struct vdo *vdo)1318{1319	block_count_t maximum_age, journal_length;1320	struct partition *partition;1321	int result;1322 1323	result = decode_from_super_block(vdo);1324	if (result != VDO_SUCCESS) {1325		vdo_destroy_component_states(&vdo->states);1326		return result;1327	}1328 1329	maximum_age = vdo_convert_maximum_age(vdo->device_config->block_map_maximum_age);1330	journal_length =1331		vdo_get_recovery_journal_length(vdo->states.vdo.config.recovery_journal_size);1332	if (maximum_age > (journal_length / 2)) {1333		return vdo_log_error_strerror(VDO_BAD_CONFIGURATION,1334					      "maximum age: %llu exceeds limit %llu",1335					      (unsigned long long) maximum_age,1336					      (unsigned long long) (journal_length / 2));1337	}1338 1339	if (maximum_age == 0) {1340		return vdo_log_error_strerror(VDO_BAD_CONFIGURATION,1341					      "maximum age must be greater than 0");1342	}1343 1344	result = vdo_enable_read_only_entry(vdo);1345	if (result != VDO_SUCCESS)1346		return result;1347 1348	partition = vdo_get_known_partition(&vdo->layout,1349					    VDO_RECOVERY_JOURNAL_PARTITION);1350	result = vdo_decode_recovery_journal(vdo->states.recovery_journal,1351					     vdo->states.vdo.nonce, vdo, partition,1352					     vdo->states.vdo.complete_recoveries,1353					     vdo->states.vdo.config.recovery_journal_size,1354					     &vdo->recovery_journal);1355	if (result != VDO_SUCCESS)1356		return result;1357 1358	partition = vdo_get_known_partition(&vdo->layout, VDO_SLAB_SUMMARY_PARTITION);1359	result = vdo_decode_slab_depot(vdo->states.slab_depot, vdo, partition,1360				       &vdo->depot);1361	if (result != VDO_SUCCESS)1362		return result;1363 1364	result = vdo_decode_block_map(vdo->states.block_map,1365				      vdo->states.vdo.config.logical_blocks, vdo,1366				      vdo->recovery_journal, vdo->states.vdo.nonce,1367				      vdo->device_config->cache_size, maximum_age,1368				      &vdo->block_map);1369	if (result != VDO_SUCCESS)1370		return result;1371 1372	result = vdo_make_physical_zones(vdo, &vdo->physical_zones);1373	if (result != VDO_SUCCESS)1374		return result;1375 1376	/* The logical zones depend on the physical zones already existing. */1377	result = vdo_make_logical_zones(vdo, &vdo->logical_zones);1378	if (result != VDO_SUCCESS)1379		return result;1380 1381	return vdo_make_hash_zones(vdo, &vdo->hash_zones);1382}1383 1384/**1385 * pre_load_callback() - Callback to initiate a pre-load, registered in vdo_initialize().1386 * @completion: The admin completion.1387 */1388static void pre_load_callback(struct vdo_completion *completion)1389{1390	struct vdo *vdo = completion->vdo;1391	int result;1392 1393	assert_admin_phase_thread(vdo, __func__);1394 1395	switch (advance_phase(vdo)) {1396	case PRE_LOAD_PHASE_START:1397		result = vdo_start_operation(&vdo->admin.state,1398					     VDO_ADMIN_STATE_PRE_LOADING);1399		if (result != VDO_SUCCESS) {1400			vdo_continue_completion(completion, result);1401			return;1402		}1403 1404		vdo_load_super_block(vdo, completion);1405		return;1406 1407	case PRE_LOAD_PHASE_LOAD_COMPONENTS:1408		vdo_continue_completion(completion, decode_vdo(vdo));1409		return;1410 1411	case PRE_LOAD_PHASE_END:1412		break;1413 1414	default:1415		vdo_set_completion_result(completion, UDS_BAD_STATE);1416	}1417 1418	finish_operation_callback(completion);1419}1420 1421static void release_instance(unsigned int instance)1422{1423	mutex_lock(&instances_lock);1424	if (instance >= instances.bit_count) {1425		VDO_ASSERT_LOG_ONLY(false,1426				    "instance number %u must be less than bit count %u",1427				    instance, instances.bit_count);1428	} else if (test_bit(instance, instances.words) == 0) {1429		VDO_ASSERT_LOG_ONLY(false, "instance number %u must be allocated", instance);1430	} else {1431		__clear_bit(instance, instances.words);1432		instances.count -= 1;1433	}1434	mutex_unlock(&instances_lock);1435}1436 1437static void set_device_config(struct dm_target *ti, struct vdo *vdo,1438			      struct device_config *config)1439{1440	list_del_init(&config->config_list);1441	list_add_tail(&config->config_list, &vdo->device_config_list);1442	config->vdo = vdo;1443	ti->private = config;1444	configure_target_capabilities(ti);1445}1446 1447static int vdo_initialize(struct dm_target *ti, unsigned int instance,1448			  struct device_config *config)1449{1450	struct vdo *vdo;1451	int result;1452	u64 block_size = VDO_BLOCK_SIZE;1453	u64 logical_size = to_bytes(ti->len);1454	block_count_t logical_blocks = logical_size / block_size;1455 1456	vdo_log_info("loading device '%s'", vdo_get_device_name(ti));1457	vdo_log_debug("Logical block size     = %llu", (u64) config->logical_block_size);1458	vdo_log_debug("Logical blocks         = %llu", logical_blocks);1459	vdo_log_debug("Physical block size    = %llu", (u64) block_size);1460	vdo_log_debug("Physical blocks        = %llu", config->physical_blocks);1461	vdo_log_debug("Block map cache blocks = %u", config->cache_size);1462	vdo_log_debug("Block map maximum age  = %u", config->block_map_maximum_age);1463	vdo_log_debug("Deduplication          = %s", (config->deduplication ? "on" : "off"));1464	vdo_log_debug("Compression            = %s", (config->compression ? "on" : "off"));1465 1466	vdo = vdo_find_matching(vdo_uses_device, config);1467	if (vdo != NULL) {1468		vdo_log_error("Existing vdo already uses device %s",1469			      vdo->device_config->parent_device_name);1470		ti->error = "Cannot share storage device with already-running VDO";1471		return VDO_BAD_CONFIGURATION;1472	}1473 1474	result = vdo_make(instance, config, &ti->error, &vdo);1475	if (result != VDO_SUCCESS) {1476		vdo_log_error("Could not create VDO device. (VDO error %d, message %s)",1477			      result, ti->error);1478		vdo_destroy(vdo);1479		return result;1480	}1481 1482	result = perform_admin_operation(vdo, PRE_LOAD_PHASE_START, pre_load_callback,1483					 finish_operation_callback, "pre-load");1484	if (result != VDO_SUCCESS) {1485		ti->error = ((result == VDO_INVALID_ADMIN_STATE) ?1486			     "Pre-load is only valid immediately after initialization" :1487			     "Cannot load metadata from device");1488		vdo_log_error("Could not start VDO device. (VDO error %d, message %s)",1489			      result, ti->error);1490		vdo_destroy(vdo);1491		return result;1492	}1493 1494	set_device_config(ti, vdo, config);1495	vdo->device_config = config;1496	return VDO_SUCCESS;1497}1498 1499/* Implements vdo_filter_fn. */1500static bool __must_check vdo_is_named(struct vdo *vdo, const void *context)1501{1502	struct dm_target *ti = vdo->device_config->owning_target;1503	const char *device_name = vdo_get_device_name(ti);1504 1505	return strcmp(device_name, context) == 0;1506}1507 1508/**1509 * get_bit_array_size() - Return the number of bytes needed to store a bit array of the specified1510 *                        capacity in an array of unsigned longs.1511 * @bit_count: The number of bits the array must hold.1512 *1513 * Return: the number of bytes needed for the array representation.1514 */1515static size_t get_bit_array_size(unsigned int bit_count)1516{1517	/* Round up to a multiple of the word size and convert to a byte count. */1518	return (BITS_TO_LONGS(bit_count) * sizeof(unsigned long));1519}1520 1521/**1522 * grow_bit_array() - Re-allocate the bitmap word array so there will more instance numbers that1523 *                    can be allocated.1524 *1525 * Since the array is initially NULL, this also initializes the array the first time we allocate an1526 * instance number.1527 *1528 * Return: VDO_SUCCESS or an error code from the allocation1529 */1530static int grow_bit_array(void)1531{1532	unsigned int new_count = max(instances.bit_count + BIT_COUNT_INCREMENT,1533				     (unsigned int) BIT_COUNT_MINIMUM);1534	unsigned long *new_words;1535	int result;1536 1537	result = vdo_reallocate_memory(instances.words,1538				       get_bit_array_size(instances.bit_count),1539				       get_bit_array_size(new_count),1540				       "instance number bit array", &new_words);1541	if (result != VDO_SUCCESS)1542		return result;1543 1544	instances.bit_count = new_count;1545	instances.words = new_words;1546	return VDO_SUCCESS;1547}1548 1549/**1550 * allocate_instance() - Allocate an instance number.1551 * @instance_ptr: A point to hold the instance number1552 *1553 * Return: VDO_SUCCESS or an error code1554 *1555 * This function must be called while holding the instances lock.1556 */1557static int allocate_instance(unsigned int *instance_ptr)1558{1559	unsigned int instance;1560	int result;1561 1562	/* If there are no unallocated instances, grow the bit array. */1563	if (instances.count >= instances.bit_count) {1564		result = grow_bit_array();1565		if (result != VDO_SUCCESS)1566			return result;1567	}1568 1569	/*1570	 * There must be a zero bit somewhere now. Find it, starting just after the last instance1571	 * allocated.1572	 */1573	instance = find_next_zero_bit(instances.words, instances.bit_count,1574				      instances.next);1575	if (instance >= instances.bit_count) {1576		/* Nothing free after next, so wrap around to instance zero. */1577		instance = find_first_zero_bit(instances.words, instances.bit_count);1578		result = VDO_ASSERT(instance < instances.bit_count,1579				    "impossibly, no zero bit found");1580		if (result != VDO_SUCCESS)1581			return result;1582	}1583 1584	__set_bit(instance, instances.words);1585	instances.count++;1586	instances.next = instance + 1;1587	*instance_ptr = instance;1588	return VDO_SUCCESS;1589}1590 1591static int construct_new_vdo_registered(struct dm_target *ti, unsigned int argc,1592					char **argv, unsigned int instance)1593{1594	int result;1595	struct device_config *config;1596 1597	result = parse_device_config(argc, argv, ti, &config);1598	if (result != VDO_SUCCESS) {1599		vdo_log_error_strerror(result, "parsing failed: %s", ti->error);1600		release_instance(instance);1601		return -EINVAL;1602	}1603 1604	/* Beyond this point, the instance number will be cleaned up for us if needed */1605	result = vdo_initialize(ti, instance, config);1606	if (result != VDO_SUCCESS) {1607		release_instance(instance);1608		free_device_config(config);1609		return vdo_status_to_errno(result);1610	}1611 1612	return VDO_SUCCESS;1613}1614 1615static int construct_new_vdo(struct dm_target *ti, unsigned int argc, char **argv)1616{1617	int result;1618	unsigned int instance;1619	struct registered_thread instance_thread;1620 1621	mutex_lock(&instances_lock);1622	result = allocate_instance(&instance);1623	mutex_unlock(&instances_lock);1624	if (result != VDO_SUCCESS)1625		return -ENOMEM;1626 1627	vdo_register_thread_device_id(&instance_thread, &instance);1628	result = construct_new_vdo_registered(ti, argc, argv, instance);1629	vdo_unregister_thread_device_id();1630	return result;1631}1632 1633/**1634 * check_may_grow_physical() - Callback to check that we're not in recovery mode, used in1635 *                             vdo_prepare_to_grow_physical().1636 * @completion: The admin completion.1637 */1638static void check_may_grow_physical(struct vdo_completion *completion)1639{1640	struct vdo *vdo = completion->vdo;1641 1642	assert_admin_phase_thread(vdo, __func__);1643 1644	/* These checks can only be done from a vdo thread. */1645	if (vdo_is_read_only(vdo))1646		vdo_set_completion_result(completion, VDO_READ_ONLY);1647 1648	if (vdo_in_recovery_mode(vdo))1649		vdo_set_completion_result(completion, VDO_RETRY_AFTER_REBUILD);1650 1651	finish_operation_callback(completion);1652}1653 1654static block_count_t get_partition_size(struct layout *layout, enum partition_id id)1655{1656	return vdo_get_known_partition(layout, id)->count;1657}1658 1659/**1660 * grow_layout() - Make the layout for growing a vdo.1661 * @vdo: The vdo preparing to grow.1662 * @old_size: The current size of the vdo.1663 * @new_size: The size to which the vdo will be grown.1664 *1665 * Return: VDO_SUCCESS or an error code.1666 */1667static int grow_layout(struct vdo *vdo, block_count_t old_size, block_count_t new_size)1668{1669	int result;1670	block_count_t min_new_size;1671 1672	if (vdo->next_layout.size == new_size) {1673		/* We are already prepared to grow to the new size, so we're done. */1674		return VDO_SUCCESS;1675	}1676 1677	/* Make a copy completion if there isn't one */1678	if (vdo->partition_copier == NULL) {1679		vdo->partition_copier = dm_kcopyd_client_create(NULL);1680		if (IS_ERR(vdo->partition_copier)) {1681			result = PTR_ERR(vdo->partition_copier);1682			vdo->partition_copier = NULL;1683			return result;1684		}1685	}1686 1687	/* Free any unused preparation. */1688	vdo_uninitialize_layout(&vdo->next_layout);1689 1690	/*1691	 * Make a new layout with the existing partition sizes for everything but the slab depot1692	 * partition.1693	 */1694	result = vdo_initialize_layout(new_size, vdo->layout.start,1695				       get_partition_size(&vdo->layout,1696							  VDO_BLOCK_MAP_PARTITION),1697				       get_partition_size(&vdo->layout,1698							  VDO_RECOVERY_JOURNAL_PARTITION),1699				       get_partition_size(&vdo->layout,1700							  VDO_SLAB_SUMMARY_PARTITION),1701				       &vdo->next_layout);1702	if (result != VDO_SUCCESS) {1703		dm_kcopyd_client_destroy(vdo_forget(vdo->partition_copier));1704		return result;1705	}1706 1707	/* Ensure the new journal and summary are entirely within the added blocks. */1708	min_new_size = (old_size +1709			get_partition_size(&vdo->next_layout,1710					   VDO_SLAB_SUMMARY_PARTITION) +1711			get_partition_size(&vdo->next_layout,1712					   VDO_RECOVERY_JOURNAL_PARTITION));1713	if (min_new_size > new_size) {1714		/* Copying the journal and summary would destroy some old metadata. */1715		vdo_uninitialize_layout(&vdo->next_layout);1716		dm_kcopyd_client_destroy(vdo_forget(vdo->partition_copier));1717		return VDO_INCREMENT_TOO_SMALL;1718	}1719 1720	return VDO_SUCCESS;1721}1722 1723static int prepare_to_grow_physical(struct vdo *vdo, block_count_t new_physical_blocks)1724{1725	int result;1726	block_count_t current_physical_blocks = vdo->states.vdo.config.physical_blocks;1727 1728	vdo_log_info("Preparing to resize physical to %llu",1729		     (unsigned long long) new_physical_blocks);1730	VDO_ASSERT_LOG_ONLY((new_physical_blocks > current_physical_blocks),1731			    "New physical size is larger than current physical size");1732	result = perform_admin_operation(vdo, PREPARE_GROW_PHYSICAL_PHASE_START,1733					 check_may_grow_physical,1734					 finish_operation_callback,1735					 "prepare grow-physical");1736	if (result != VDO_SUCCESS)1737		return result;1738 1739	result = grow_layout(vdo, current_physical_blocks, new_physical_blocks);1740	if (result != VDO_SUCCESS)1741		return result;1742 1743	result = vdo_prepare_to_grow_slab_depot(vdo->depot,1744						vdo_get_known_partition(&vdo->next_layout,1745									VDO_SLAB_DEPOT_PARTITION));1746	if (result != VDO_SUCCESS) {1747		vdo_uninitialize_layout(&vdo->next_layout);1748		return result;1749	}1750 1751	vdo_log_info("Done preparing to resize physical");1752	return VDO_SUCCESS;1753}1754 1755/**1756 * validate_new_device_config() - Check whether a new device config represents a valid modification1757 *				  to an existing config.1758 * @to_validate: The new config to validate.1759 * @config: The existing config.1760 * @may_grow: Set to true if growing the logical and physical size of the vdo is currently1761 *	      permitted.1762 * @error_ptr: A pointer to hold the reason for any error.1763 *1764 * Return: VDO_SUCCESS or an error.1765 */1766static int validate_new_device_config(struct device_config *to_validate,1767				      struct device_config *config, bool may_grow,1768				      char **error_ptr)1769{1770	if (to_validate->owning_target->begin != config->owning_target->begin) {1771		*error_ptr = "Starting sector cannot change";1772		return VDO_PARAMETER_MISMATCH;1773	}1774 1775	if (to_validate->logical_block_size != config->logical_block_size) {1776		*error_ptr = "Logical block size cannot change";1777		return VDO_PARAMETER_MISMATCH;1778	}1779 1780	if (to_validate->logical_blocks < config->logical_blocks) {1781		*error_ptr = "Can't shrink VDO logical size";1782		return VDO_PARAMETER_MISMATCH;1783	}1784 1785	if (to_validate->cache_size != config->cache_size) {1786		*error_ptr = "Block map cache size cannot change";1787		return VDO_PARAMETER_MISMATCH;1788	}1789 1790	if (to_validate->block_map_maximum_age != config->block_map_maximum_age) {1791		*error_ptr = "Block map maximum age cannot change";1792		return VDO_PARAMETER_MISMATCH;1793	}1794 1795	if (memcmp(&to_validate->thread_counts, &config->thread_counts,1796		   sizeof(struct thread_count_config)) != 0) {1797		*error_ptr = "Thread configuration cannot change";1798		return VDO_PARAMETER_MISMATCH;1799	}1800 1801	if (to_validate->physical_blocks < config->physical_blocks) {1802		*error_ptr = "Removing physical storage from a VDO is not supported";1803		return VDO_NOT_IMPLEMENTED;1804	}1805 1806	if (!may_grow && (to_validate->physical_blocks > config->physical_blocks)) {1807		*error_ptr = "VDO physical size may not grow in current state";1808		return VDO_NOT_IMPLEMENTED;1809	}1810 1811	return VDO_SUCCESS;1812}1813 1814static int prepare_to_modify(struct dm_target *ti, struct device_config *config,1815			     struct vdo *vdo)1816{1817	int result;1818	bool may_grow = (vdo_get_admin_state(vdo) != VDO_ADMIN_STATE_PRE_LOADED);1819 1820	result = validate_new_device_config(config, vdo->device_config, may_grow,1821					    &ti->error);1822	if (result != VDO_SUCCESS)1823		return -EINVAL;1824 1825	if (config->logical_blocks > vdo->device_config->logical_blocks) {1826		block_count_t logical_blocks = vdo->states.vdo.config.logical_blocks;1827 1828		vdo_log_info("Preparing to resize logical to %llu",1829			     (unsigned long long) config->logical_blocks);1830		VDO_ASSERT_LOG_ONLY((config->logical_blocks > logical_blocks),1831				    "New logical size is larger than current size");1832 1833		result = vdo_prepare_to_grow_block_map(vdo->block_map,1834						       config->logical_blocks);1835		if (result != VDO_SUCCESS) {1836			ti->error = "Device vdo_prepare_to_grow_logical failed";1837			return result;1838		}1839 1840		vdo_log_info("Done preparing to resize logical");1841	}1842 1843	if (config->physical_blocks > vdo->device_config->physical_blocks) {1844		result = prepare_to_grow_physical(vdo, config->physical_blocks);1845		if (result != VDO_SUCCESS) {1846			if (result == VDO_PARAMETER_MISMATCH) {1847				/*1848				 * If we don't trap this case, vdo_status_to_errno() will remap1849				 * it to -EIO, which is misleading and ahistorical.1850				 */1851				result = -EINVAL;1852			}1853 1854			if (result == VDO_TOO_MANY_SLABS)1855				ti->error = "Device vdo_prepare_to_grow_physical failed (specified physical size too big based on formatted slab size)";1856			else1857				ti->error = "Device vdo_prepare_to_grow_physical failed";1858 1859			return result;1860		}1861	}1862 1863	if (strcmp(config->parent_device_name, vdo->device_config->parent_device_name) != 0) {1864		const char *device_name = vdo_get_device_name(config->owning_target);1865 1866		vdo_log_info("Updating backing device of %s from %s to %s", device_name,1867			     vdo->device_config->parent_device_name,1868			     config->parent_device_name);1869	}1870 1871	return VDO_SUCCESS;1872}1873 1874static int update_existing_vdo(const char *device_name, struct dm_target *ti,1875			       unsigned int argc, char **argv, struct vdo *vdo)1876{1877	int result;1878	struct device_config *config;1879 1880	result = parse_device_config(argc, argv, ti, &config);1881	if (result != VDO_SUCCESS)1882		return -EINVAL;1883 1884	vdo_log_info("preparing to modify device '%s'", device_name);1885	result = prepare_to_modify(ti, config, vdo);1886	if (result != VDO_SUCCESS) {1887		free_device_config(config);1888		return vdo_status_to_errno(result);1889	}1890 1891	set_device_config(ti, vdo, config);1892	return VDO_SUCCESS;1893}1894 1895static int vdo_ctr(struct dm_target *ti, unsigned int argc, char **argv)1896{1897	int result;1898	struct registered_thread allocating_thread, instance_thread;1899	const char *device_name;1900	struct vdo *vdo;1901 1902	vdo_register_allocating_thread(&allocating_thread, NULL);1903	device_name = vdo_get_device_name(ti);1904	vdo = vdo_find_matching(vdo_is_named, device_name);1905	if (vdo == NULL) {1906		result = construct_new_vdo(ti, argc, argv);1907	} else {1908		vdo_register_thread_device_id(&instance_thread, &vdo->instance);1909		result = update_existing_vdo(device_name, ti, argc, argv, vdo);1910		vdo_unregister_thread_device_id();1911	}1912 1913	vdo_unregister_allocating_thread();1914	return result;1915}1916 1917static void vdo_dtr(struct dm_target *ti)1918{1919	struct device_config *config = ti->private;1920	struct vdo *vdo = vdo_forget(config->vdo);1921 1922	list_del_init(&config->config_list);1923	if (list_empty(&vdo->device_config_list)) {1924		const char *device_name;1925 1926		/* This was the last config referencing the VDO. Free it. */1927		unsigned int instance = vdo->instance;1928		struct registered_thread allocating_thread, instance_thread;1929 1930		vdo_register_thread_device_id(&instance_thread, &instance);1931		vdo_register_allocating_thread(&allocating_thread, NULL);1932 1933		device_name = vdo_get_device_name(ti);1934		vdo_log_info("stopping device '%s'", device_name);1935		if (vdo->dump_on_shutdown)1936			vdo_dump_all(vdo, "device shutdown");1937 1938		vdo_destroy(vdo_forget(vdo));1939		vdo_log_info("device '%s' stopped", device_name);1940		vdo_unregister_thread_device_id();1941		vdo_unregister_allocating_thread();1942		release_instance(instance);1943	} else if (config == vdo->device_config) {1944		/*1945		 * The VDO still references this config. Give it a reference to a config that isn't1946		 * being destroyed.1947		 */1948		vdo->device_config = list_first_entry(&vdo->device_config_list,1949						      struct device_config, config_list);1950	}1951 1952	free_device_config(config);1953	ti->private = NULL;1954}1955 1956static void vdo_presuspend(struct dm_target *ti)1957{1958	get_vdo_for_target(ti)->suspend_type =1959		(dm_noflush_suspending(ti) ? VDO_ADMIN_STATE_SUSPENDING : VDO_ADMIN_STATE_SAVING);1960}1961 1962/**1963 * write_super_block_for_suspend() - Update the VDO state and save the super block.1964 * @completion: The admin completion1965 */1966static void write_super_block_for_suspend(struct vdo_completion *completion)1967{1968	struct vdo *vdo = completion->vdo;1969 1970	switch (vdo_get_state(vdo)) {1971	case VDO_DIRTY:1972	case VDO_NEW:1973		vdo_set_state(vdo, VDO_CLEAN);1974		break;1975 1976	case VDO_CLEAN:1977	case VDO_READ_ONLY_MODE:1978	case VDO_FORCE_REBUILD:1979	case VDO_RECOVERING:1980	case VDO_REBUILD_FOR_UPGRADE:1981		break;1982 1983	case VDO_REPLAYING:1984	default:1985		vdo_continue_completion(completion, UDS_BAD_STATE);1986		return;1987	}1988 1989	vdo_save_components(vdo, completion);1990}1991 1992/**1993 * suspend_callback() - Callback to initiate a suspend, registered in vdo_postsuspend().1994 * @completion: The sub-task completion.1995 */1996static void suspend_callback(struct vdo_completion *completion)1997{1998	struct vdo *vdo = completion->vdo;1999	struct admin_state *state = &vdo->admin.state;2000	int result;2001 2002	assert_admin_phase_thread(vdo, __func__);2003 2004	switch (advance_phase(vdo)) {2005	case SUSPEND_PHASE_START:2006		if (vdo_get_admin_state_code(state)->quiescent) {2007			/* Already suspended */2008			break;2009		}2010 2011		vdo_continue_completion(completion,2012					vdo_start_operation(state, vdo->suspend_type));2013		return;2014 2015	case SUSPEND_PHASE_PACKER:2016		/*2017		 * If the VDO was already resumed from a prior suspend while read-only, some of the2018		 * components may not have been resumed. By setting a read-only error here, we2019		 * guarantee that the result of this suspend will be VDO_READ_ONLY and not2020		 * VDO_INVALID_ADMIN_STATE in that case.2021		 */2022		if (vdo_in_read_only_mode(vdo))2023			vdo_set_completion_result(completion, VDO_READ_ONLY);2024 2025		vdo_drain_packer(vdo->packer, completion);2026		return;2027 2028	case SUSPEND_PHASE_DATA_VIOS:2029		drain_data_vio_pool(vdo->data_vio_pool, completion);2030		return;2031 2032	case SUSPEND_PHASE_DEDUPE:2033		vdo_drain_hash_zones(vdo->hash_zones, completion);2034		return;2035 2036	case SUSPEND_PHASE_FLUSHES:2037		vdo_drain_flusher(vdo->flusher, completion);2038		return;2039 2040	case SUSPEND_PHASE_LOGICAL_ZONES:2041		/*2042		 * Attempt to flush all I/O before completing post suspend work. We believe a2043		 * suspended device is expected to have persisted all data written before the2044		 * suspend, even if it hasn't been flushed yet.2045		 */2046		result = vdo_synchronous_flush(vdo);2047		if (result != VDO_SUCCESS)2048			vdo_enter_read_only_mode(vdo, result);2049 2050		vdo_drain_logical_zones(vdo->logical_zones,2051					vdo_get_admin_state_code(state), completion);2052		return;2053 2054	case SUSPEND_PHASE_BLOCK_MAP:2055		vdo_drain_block_map(vdo->block_map, vdo_get_admin_state_code(state),2056				    completion);2057		return;2058 2059	case SUSPEND_PHASE_JOURNAL:2060		vdo_drain_recovery_journal(vdo->recovery_journal,2061					   vdo_get_admin_state_code(state), completion);2062		return;2063 2064	case SUSPEND_PHASE_DEPOT:2065		vdo_drain_slab_depot(vdo->depot, vdo_get_admin_state_code(state),2066				     completion);2067		return;2068 2069	case SUSPEND_PHASE_READ_ONLY_WAIT:2070		vdo_wait_until_not_entering_read_only_mode(completion);2071		return;2072 2073	case SUSPEND_PHASE_WRITE_SUPER_BLOCK:2074		if (vdo_is_state_suspending(state) || (completion->result != VDO_SUCCESS)) {2075			/* If we didn't save the VDO or there was an error, we're done. */2076			break;2077		}2078 2079		write_super_block_for_suspend(completion);2080		return;2081 2082	case SUSPEND_PHASE_END:2083		break;2084 2085	default:2086		vdo_set_completion_result(completion, UDS_BAD_STATE);2087	}2088 2089	finish_operation_callback(completion);2090}2091 2092static void vdo_postsuspend(struct dm_target *ti)2093{2094	struct vdo *vdo = get_vdo_for_target(ti);2095	struct registered_thread instance_thread;2096	const char *device_name;2097	int result;2098 2099	vdo_register_thread_device_id(&instance_thread, &vdo->instance);2100	device_name = vdo_get_device_name(vdo->device_config->owning_target);2101	vdo_log_info("suspending device '%s'", device_name);2102 2103	/*2104	 * It's important to note any error here does not actually stop device-mapper from2105	 * suspending the device. All this work is done post suspend.2106	 */2107	result = perform_admin_operation(vdo, SUSPEND_PHASE_START, suspend_callback,2108					 suspend_callback, "suspend");2109 2110	if ((result == VDO_SUCCESS) || (result == VDO_READ_ONLY)) {2111		/*2112		 * Treat VDO_READ_ONLY as a success since a read-only suspension still leaves the2113		 * VDO suspended.2114		 */2115		vdo_log_info("device '%s' suspended", device_name);2116	} else if (result == VDO_INVALID_ADMIN_STATE) {2117		vdo_log_error("Suspend invoked while in unexpected state: %s",2118			      vdo_get_admin_state(vdo)->name);2119	} else {2120		vdo_log_error_strerror(result, "Suspend of device '%s' failed",2121				       device_name);2122	}2123 2124	vdo_unregister_thread_device_id();2125}2126 2127/**2128 * was_new() - Check whether the vdo was new when it was loaded.2129 * @vdo: The vdo to query.2130 *2131 * Return: true if the vdo was new.2132 */2133static bool was_new(const struct vdo *vdo)2134{2135	return (vdo->load_state == VDO_NEW);2136}2137 2138/**2139 * requires_repair() - Check whether a vdo requires recovery or rebuild.2140 * @vdo: The vdo to query.2141 *2142 * Return: true if the vdo must be repaired.2143 */2144static bool __must_check requires_repair(const struct vdo *vdo)2145{2146	switch (vdo_get_state(vdo)) {2147	case VDO_DIRTY:2148	case VDO_FORCE_REBUILD:2149	case VDO_REPLAYING:2150	case VDO_REBUILD_FOR_UPGRADE:2151		return true;2152 2153	default:2154		return false;2155	}2156}2157 2158/**2159 * get_load_type() - Determine how the slab depot was loaded.2160 * @vdo: The vdo.2161 *2162 * Return: How the depot was loaded.2163 */2164static enum slab_depot_load_type get_load_type(struct vdo *vdo)2165{2166	if (vdo_state_requires_read_only_rebuild(vdo->load_state))2167		return VDO_SLAB_DEPOT_REBUILD_LOAD;2168 2169	if (vdo_state_requires_recovery(vdo->load_state))2170		return VDO_SLAB_DEPOT_RECOVERY_LOAD;2171 2172	return VDO_SLAB_DEPOT_NORMAL_LOAD;2173}2174 2175/**2176 * load_callback() - Callback to do the destructive parts of loading a VDO.2177 * @completion: The sub-task completion.2178 */2179static void load_callback(struct vdo_completion *completion)2180{2181	struct vdo *vdo = completion->vdo;2182	int result;2183 2184	assert_admin_phase_thread(vdo, __func__);2185 2186	switch (advance_phase(vdo)) {2187	case LOAD_PHASE_START:2188		result = vdo_start_operation(&vdo->admin.state, VDO_ADMIN_STATE_LOADING);2189		if (result != VDO_SUCCESS) {2190			vdo_continue_completion(completion, result);2191			return;2192		}2193 2194		/* Prepare the recovery journal for new entries. */2195		vdo_open_recovery_journal(vdo->recovery_journal, vdo->depot,2196					  vdo->block_map);2197		vdo_allow_read_only_mode_entry(completion);2198		return;2199 2200	case LOAD_PHASE_LOAD_DEPOT:2201		vdo_set_dedupe_state_normal(vdo->hash_zones);2202		if (vdo_is_read_only(vdo)) {2203			/*2204			 * In read-only mode we don't use the allocator and it may not even be2205			 * readable, so don't bother trying to load it.2206			 */2207			vdo_set_completion_result(completion, VDO_READ_ONLY);2208			break;2209		}2210 2211		if (requires_repair(vdo)) {2212			vdo_repair(completion);2213			return;2214		}2215 2216		vdo_load_slab_depot(vdo->depot,2217				    (was_new(vdo) ? VDO_ADMIN_STATE_FORMATTING :2218				     VDO_ADMIN_STATE_LOADING),2219				    completion, NULL);2220		return;2221 2222	case LOAD_PHASE_MAKE_DIRTY:2223		vdo_set_state(vdo, VDO_DIRTY);2224		vdo_save_components(vdo, completion);2225		return;2226 2227	case LOAD_PHASE_PREPARE_TO_ALLOCATE:2228		vdo_initialize_block_map_from_journal(vdo->block_map,2229						      vdo->recovery_journal);2230		vdo_prepare_slab_depot_to_allocate(vdo->depot, get_load_type(vdo),2231						   completion);2232		return;2233 2234	case LOAD_PHASE_SCRUB_SLABS:2235		if (vdo_state_requires_recovery(vdo->load_state))2236			vdo_enter_recovery_mode(vdo);2237 2238		vdo_scrub_all_unrecovered_slabs(vdo->depot, completion);2239		return;2240 2241	case LOAD_PHASE_DATA_REDUCTION:2242		WRITE_ONCE(vdo->compressing, vdo->device_config->compression);2243		if (vdo->device_config->deduplication) {2244			/*2245			 * Don't try to load or rebuild the index first (and log scary error2246			 * messages) if this is known to be a newly-formatted volume.2247			 */2248			vdo_start_dedupe_index(vdo->hash_zones, was_new(vdo));2249		}2250 2251		vdo->allocations_allowed = false;2252		fallthrough;2253 2254	case LOAD_PHASE_FINISHED:2255		break;2256 2257	case LOAD_PHASE_DRAIN_JOURNAL:2258		vdo_drain_recovery_journal(vdo->recovery_journal, VDO_ADMIN_STATE_SAVING,2259					   completion);2260		return;2261 2262	case LOAD_PHASE_WAIT_FOR_READ_ONLY:2263		/* Avoid an infinite loop */2264		completion->error_handler = NULL;2265		vdo->admin.phase = LOAD_PHASE_FINISHED;2266		vdo_wait_until_not_entering_read_only_mode(completion);2267		return;2268 2269	default:2270		vdo_set_completion_result(completion, UDS_BAD_STATE);2271	}2272 2273	finish_operation_callback(completion);2274}2275 2276/**2277 * handle_load_error() - Handle an error during the load operation.2278 * @completion: The admin completion.2279 *2280 * If at all possible, brings the vdo online in read-only mode. This handler is registered in2281 * vdo_preresume_registered().2282 */2283static void handle_load_error(struct vdo_completion *completion)2284{2285	struct vdo *vdo = completion->vdo;2286 2287	if (vdo_requeue_completion_if_needed(completion,2288					     vdo->thread_config.admin_thread))2289		return;2290 2291	if (vdo_state_requires_read_only_rebuild(vdo->load_state) &&2292	    (vdo->admin.phase == LOAD_PHASE_MAKE_DIRTY)) {2293		vdo_log_error_strerror(completion->result, "aborting load");2294		vdo->admin.phase = LOAD_PHASE_DRAIN_JOURNAL;2295		load_callback(vdo_forget(completion));2296		return;2297	}2298 2299	if ((completion->result == VDO_UNSUPPORTED_VERSION) &&2300	    (vdo->admin.phase == LOAD_PHASE_MAKE_DIRTY)) {2301		vdo_log_error("Aborting load due to unsupported version");2302		vdo->admin.phase = LOAD_PHASE_FINISHED;2303		load_callback(completion);2304		return;2305	}2306 2307	vdo_log_error_strerror(completion->result,2308			       "Entering read-only mode due to load error");2309	vdo->admin.phase = LOAD_PHASE_WAIT_FOR_READ_ONLY;2310	vdo_enter_read_only_mode(vdo, completion->result);2311	completion->result = VDO_READ_ONLY;2312	load_callback(completion);2313}2314 2315/**2316 * write_super_block_for_resume() - Update the VDO state and save the super block.2317 * @completion: The admin completion2318 */2319static void write_super_block_for_resume(struct vdo_completion *completion)2320{2321	struct vdo *vdo = completion->vdo;2322 2323	switch (vdo_get_state(vdo)) {2324	case VDO_CLEAN:2325	case VDO_NEW:2326		vdo_set_state(vdo, VDO_DIRTY);2327		vdo_save_components(vdo, completion);2328		return;2329 2330	case VDO_DIRTY:2331	case VDO_READ_ONLY_MODE:2332	case VDO_FORCE_REBUILD:2333	case VDO_RECOVERING:2334	case VDO_REBUILD_FOR_UPGRADE:2335		/* No need to write the super block in these cases */2336		vdo_launch_completion(completion);2337		return;2338 2339	case VDO_REPLAYING:2340	default:2341		vdo_continue_completion(completion, UDS_BAD_STATE);2342	}2343}2344 2345/**2346 * resume_callback() - Callback to resume a VDO.2347 * @completion: The admin completion.2348 */2349static void resume_callback(struct vdo_completion *completion)2350{2351	struct vdo *vdo = completion->vdo;2352	int result;2353 2354	assert_admin_phase_thread(vdo, __func__);2355 2356	switch (advance_phase(vdo)) {2357	case RESUME_PHASE_START:2358		result = vdo_start_operation(&vdo->admin.state,2359					     VDO_ADMIN_STATE_RESUMING);2360		if (result != VDO_SUCCESS) {2361			vdo_continue_completion(completion, result);2362			return;2363		}2364 2365		write_super_block_for_resume(completion);2366		return;2367 2368	case RESUME_PHASE_ALLOW_READ_ONLY_MODE:2369		vdo_allow_read_only_mode_entry(completion);2370		return;2371 2372	case RESUME_PHASE_DEDUPE:2373		vdo_resume_hash_zones(vdo->hash_zones, completion);2374		return;2375 2376	case RESUME_PHASE_DEPOT:2377		vdo_resume_slab_depot(vdo->depot, completion);2378		return;2379 2380	case RESUME_PHASE_JOURNAL:2381		vdo_resume_recovery_journal(vdo->recovery_journal, completion);2382		return;2383 2384	case RESUME_PHASE_BLOCK_MAP:2385		vdo_resume_block_map(vdo->block_map, completion);2386		return;2387 2388	case RESUME_PHASE_LOGICAL_ZONES:2389		vdo_resume_logical_zones(vdo->logical_zones, completion);2390		return;2391 2392	case RESUME_PHASE_PACKER:2393	{2394		bool was_enabled = vdo_get_compressing(vdo);2395		bool enable = vdo->device_config->compression;2396 2397		if (enable != was_enabled)2398			WRITE_ONCE(vdo->compressing, enable);2399		vdo_log_info("compression is %s", (enable ? "enabled" : "disabled"));2400 2401		vdo_resume_packer(vdo->packer, completion);2402		return;2403	}2404 2405	case RESUME_PHASE_FLUSHER:2406		vdo_resume_flusher(vdo->flusher, completion);2407		return;2408 2409	case RESUME_PHASE_DATA_VIOS:2410		resume_data_vio_pool(vdo->data_vio_pool, completion);2411		return;2412 2413	case RESUME_PHASE_END:2414		break;2415 2416	default:2417		vdo_set_completion_result(completion, UDS_BAD_STATE);2418	}2419 2420	finish_operation_callback(completion);2421}2422 2423/**2424 * grow_logical_callback() - Callback to initiate a grow logical.2425 * @completion: The admin completion.2426 *2427 * Registered in perform_grow_logical().2428 */2429static void grow_logical_callback(struct vdo_completion *completion)2430{2431	struct vdo *vdo = completion->vdo;2432	int result;2433 2434	assert_admin_phase_thread(vdo, __func__);2435 2436	switch (advance_phase(vdo)) {2437	case GROW_LOGICAL_PHASE_START:2438		if (vdo_is_read_only(vdo)) {2439			vdo_log_error_strerror(VDO_READ_ONLY,2440					       "Can't grow logical size of a read-only VDO");2441			vdo_set_completion_result(completion, VDO_READ_ONLY);2442			break;2443		}2444 2445		result = vdo_start_operation(&vdo->admin.state,2446					     VDO_ADMIN_STATE_SUSPENDED_OPERATION);2447		if (result != VDO_SUCCESS) {2448			vdo_continue_completion(completion, result);2449			return;2450		}2451 2452		vdo->states.vdo.config.logical_blocks = vdo->block_map->next_entry_count;2453		vdo_save_components(vdo, completion);2454		return;2455 2456	case GROW_LOGICAL_PHASE_GROW_BLOCK_MAP:2457		vdo_grow_block_map(vdo->block_map, completion);2458		return;2459 2460	case GROW_LOGICAL_PHASE_END:2461		break;2462 2463	case GROW_LOGICAL_PHASE_ERROR:2464		vdo_enter_read_only_mode(vdo, completion->result);2465		break;2466 2467	default:2468		vdo_set_completion_result(completion, UDS_BAD_STATE);2469	}2470 2471	finish_operation_callback(completion);2472}2473 2474/**2475 * handle_logical_growth_error() - Handle an error during the grow physical process.2476 * @completion: The admin completion.2477 */2478static void handle_logical_growth_error(struct vdo_completion *completion)2479{2480	struct vdo *vdo = completion->vdo;2481 2482	if (vdo->admin.phase == GROW_LOGICAL_PHASE_GROW_BLOCK_MAP) {2483		/*2484		 * We've failed to write the new size in the super block, so set our in memory2485		 * config back to the old size.2486		 */2487		vdo->states.vdo.config.logical_blocks = vdo->block_map->entry_count;2488		vdo_abandon_block_map_growth(vdo->block_map);2489	}2490 2491	vdo->admin.phase = GROW_LOGICAL_PHASE_ERROR;2492	grow_logical_callback(completion);2493}2494 2495/**2496 * perform_grow_logical() - Grow the logical size of the vdo.2497 * @vdo: The vdo to grow.2498 * @new_logical_blocks: The size to which the vdo should be grown.2499 *2500 * Context: This method may only be called when the vdo has been suspended and must not be called2501 * from a base thread.2502 *2503 * Return: VDO_SUCCESS or an error.2504 */2505static int perform_grow_logical(struct vdo *vdo, block_count_t new_logical_blocks)2506{2507	int result;2508 2509	if (vdo->device_config->logical_blocks == new_logical_blocks) {2510		/*2511		 * A table was loaded for which we prepared to grow, but a table without that2512		 * growth was what we are resuming with.2513		 */2514		vdo_abandon_block_map_growth(vdo->block_map);2515		return VDO_SUCCESS;2516	}2517 2518	vdo_log_info("Resizing logical to %llu",2519		     (unsigned long long) new_logical_blocks);2520	if (vdo->block_map->next_entry_count != new_logical_blocks)2521		return VDO_PARAMETER_MISMATCH;2522 2523	result = perform_admin_operation(vdo, GROW_LOGICAL_PHASE_START,2524					 grow_logical_callback,2525					 handle_logical_growth_error, "grow logical");2526	if (result != VDO_SUCCESS)2527		return result;2528 2529	vdo_log_info("Logical blocks now %llu", (unsigned long long) new_logical_blocks);2530	return VDO_SUCCESS;2531}2532 2533static void copy_callback(int read_err, unsigned long write_err, void *context)2534{2535	struct vdo_completion *completion = context;2536	int result = (((read_err == 0) && (write_err == 0)) ? VDO_SUCCESS : -EIO);2537 2538	vdo_continue_completion(completion, result);2539}2540 2541static void partition_to_region(struct partition *partition, struct vdo *vdo,2542				struct dm_io_region *region)2543{2544	physical_block_number_t pbn = partition->offset - vdo->geometry.bio_offset;2545 2546	*region = (struct dm_io_region) {2547		.bdev = vdo_get_backing_device(vdo),2548		.sector = pbn * VDO_SECTORS_PER_BLOCK,2549		.count = partition->count * VDO_SECTORS_PER_BLOCK,2550	};2551}2552 2553/**2554 * copy_partition() - Copy a partition from the location specified in the current layout to that in2555 *                    the next layout.2556 * @vdo: The vdo preparing to grow.2557 * @id: The ID of the partition to copy.2558 * @parent: The completion to notify when the copy is complete.2559 */2560static void copy_partition(struct vdo *vdo, enum partition_id id,2561			   struct vdo_completion *parent)2562{2563	struct dm_io_region read_region, write_regions[1];2564	struct partition *from = vdo_get_known_partition(&vdo->layout, id);2565	struct partition *to = vdo_get_known_partition(&vdo->next_layout, id);2566 2567	partition_to_region(from, vdo, &read_region);2568	partition_to_region(to, vdo, &write_regions[0]);2569	dm_kcopyd_copy(vdo->partition_copier, &read_region, 1, write_regions, 0,2570		       copy_callback, parent);2571}2572 2573/**2574 * grow_physical_callback() - Callback to initiate a grow physical.2575 * @completion: The admin completion.2576 *2577 * Registered in perform_grow_physical().2578 */2579static void grow_physical_callback(struct vdo_completion *completion)2580{2581	struct vdo *vdo = completion->vdo;2582	int result;2583 2584	assert_admin_phase_thread(vdo, __func__);2585 2586	switch (advance_phase(vdo)) {2587	case GROW_PHYSICAL_PHASE_START:2588		if (vdo_is_read_only(vdo)) {2589			vdo_log_error_strerror(VDO_READ_ONLY,2590					       "Can't grow physical size of a read-only VDO");2591			vdo_set_completion_result(completion, VDO_READ_ONLY);2592			break;2593		}2594 2595		result = vdo_start_operation(&vdo->admin.state,2596					     VDO_ADMIN_STATE_SUSPENDED_OPERATION);2597		if (result != VDO_SUCCESS) {2598			vdo_continue_completion(completion, result);2599			return;2600		}2601 2602		/* Copy the journal into the new layout. */2603		copy_partition(vdo, VDO_RECOVERY_JOURNAL_PARTITION, completion);2604		return;2605 2606	case GROW_PHYSICAL_PHASE_COPY_SUMMARY:2607		copy_partition(vdo, VDO_SLAB_SUMMARY_PARTITION, completion);2608		return;2609 2610	case GROW_PHYSICAL_PHASE_UPDATE_COMPONENTS:2611		vdo_uninitialize_layout(&vdo->layout);2612		vdo->layout = vdo->next_layout;2613		vdo_forget(vdo->next_layout.head);2614		vdo->states.vdo.config.physical_blocks = vdo->layout.size;2615		vdo_update_slab_depot_size(vdo->depot);2616		vdo_save_components(vdo, completion);2617		return;2618 2619	case GROW_PHYSICAL_PHASE_USE_NEW_SLABS:2620		vdo_use_new_slabs(vdo->depot, completion);2621		return;2622 2623	case GROW_PHYSICAL_PHASE_END:2624		vdo->depot->summary_origin =2625			vdo_get_known_partition(&vdo->layout,2626						VDO_SLAB_SUMMARY_PARTITION)->offset;2627		vdo->recovery_journal->origin =2628			vdo_get_known_partition(&vdo->layout,2629						VDO_RECOVERY_JOURNAL_PARTITION)->offset;2630		break;2631 2632	case GROW_PHYSICAL_PHASE_ERROR:2633		vdo_enter_read_only_mode(vdo, completion->result);2634		break;2635 2636	default:2637		vdo_set_completion_result(completion, UDS_BAD_STATE);2638	}2639 2640	vdo_uninitialize_layout(&vdo->next_layout);2641	finish_operation_callback(completion);2642}2643 2644/**2645 * handle_physical_growth_error() - Handle an error during the grow physical process.2646 * @completion: The sub-task completion.2647 */2648static void handle_physical_growth_error(struct vdo_completion *completion)2649{2650	completion->vdo->admin.phase = GROW_PHYSICAL_PHASE_ERROR;2651	grow_physical_callback(completion);2652}2653 2654/**2655 * perform_grow_physical() - Grow the physical size of the vdo.2656 * @vdo: The vdo to resize.2657 * @new_physical_blocks: The new physical size in blocks.2658 *2659 * Context: This method may only be called when the vdo has been suspended and must not be called2660 * from a base thread.2661 *2662 * Return: VDO_SUCCESS or an error.2663 */2664static int perform_grow_physical(struct vdo *vdo, block_count_t new_physical_blocks)2665{2666	int result;2667	block_count_t new_depot_size, prepared_depot_size;2668	block_count_t old_physical_blocks = vdo->states.vdo.config.physical_blocks;2669 2670	/* Skip any noop grows. */2671	if (old_physical_blocks == new_physical_blocks)2672		return VDO_SUCCESS;2673 2674	if (new_physical_blocks != vdo->next_layout.size) {2675		/*2676		 * Either the VDO isn't prepared to grow, or it was prepared to grow to a different2677		 * size. Doing this check here relies on the fact that the call to this method is2678		 * done under the dmsetup message lock.2679		 */2680		vdo_uninitialize_layout(&vdo->next_layout);2681		vdo_abandon_new_slabs(vdo->depot);2682		return VDO_PARAMETER_MISMATCH;2683	}2684 2685	/* Validate that we are prepared to grow appropriately. */2686	new_depot_size =2687		vdo_get_known_partition(&vdo->next_layout, VDO_SLAB_DEPOT_PARTITION)->count;2688	prepared_depot_size = (vdo->depot->new_slabs == NULL) ? 0 : vdo->depot->new_size;2689	if (prepared_depot_size != new_depot_size)2690		return VDO_PARAMETER_MISMATCH;2691 2692	result = perform_admin_operation(vdo, GROW_PHYSICAL_PHASE_START,2693					 grow_physical_callback,2694					 handle_physical_growth_error, "grow physical");2695	if (result != VDO_SUCCESS)2696		return result;2697 2698	vdo_log_info("Physical block count was %llu, now %llu",2699		     (unsigned long long) old_physical_blocks,2700		     (unsigned long long) new_physical_blocks);2701	return VDO_SUCCESS;2702}2703 2704/**2705 * apply_new_vdo_configuration() - Attempt to make any configuration changes from the table being2706 *                                 resumed.2707 * @vdo: The vdo being resumed.2708 * @config: The new device configuration derived from the table with which the vdo is being2709 *          resumed.2710 *2711 * Return: VDO_SUCCESS or an error.2712 */2713static int __must_check apply_new_vdo_configuration(struct vdo *vdo,2714						    struct device_config *config)2715{2716	int result;2717 2718	result = perform_grow_logical(vdo, config->logical_blocks);2719	if (result != VDO_SUCCESS) {2720		vdo_log_error("grow logical operation failed, result = %d", result);2721		return result;2722	}2723 2724	result = perform_grow_physical(vdo, config->physical_blocks);2725	if (result != VDO_SUCCESS)2726		vdo_log_error("resize operation failed, result = %d", result);2727 2728	return result;2729}2730 2731static int vdo_preresume_registered(struct dm_target *ti, struct vdo *vdo)2732{2733	struct device_config *config = ti->private;2734	const char *device_name = vdo_get_device_name(ti);2735	block_count_t backing_blocks;2736	int result;2737 2738	backing_blocks = get_underlying_device_block_count(vdo);2739	if (backing_blocks < config->physical_blocks) {2740		/* FIXME: can this still happen? */2741		vdo_log_error("resume of device '%s' failed: backing device has %llu blocks but VDO physical size is %llu blocks",2742			      device_name, (unsigned long long) backing_blocks,2743			      (unsigned long long) config->physical_blocks);2744		return -EINVAL;2745	}2746 2747	if (vdo_get_admin_state(vdo) == VDO_ADMIN_STATE_PRE_LOADED) {2748		vdo_log_info("starting device '%s'", device_name);2749		result = perform_admin_operation(vdo, LOAD_PHASE_START, load_callback,2750						 handle_load_error, "load");2751		if (result == VDO_UNSUPPORTED_VERSION) {2752			 /*2753			  * A component version is not supported. This can happen when the2754			  * recovery journal metadata is in an old version format. Abort the2755			  * load without saving the state.2756			  */2757			vdo->suspend_type = VDO_ADMIN_STATE_SUSPENDING;2758			perform_admin_operation(vdo, SUSPEND_PHASE_START,2759						suspend_callback, suspend_callback,2760						"suspend");2761			return result;2762		}2763 2764		if ((result != VDO_SUCCESS) && (result != VDO_READ_ONLY)) {2765			/*2766			 * Something has gone very wrong. Make sure everything has drained and2767			 * leave the device in an unresumable state.2768			 */2769			vdo_log_error_strerror(result,2770					       "Start failed, could not load VDO metadata");2771			vdo->suspend_type = VDO_ADMIN_STATE_STOPPING;2772			perform_admin_operation(vdo, SUSPEND_PHASE_START,2773						suspend_callback, suspend_callback,2774						"suspend");2775			return result;2776		}2777 2778		/* Even if the VDO is read-only, it is now able to handle read requests. */2779		vdo_log_info("device '%s' started", device_name);2780	}2781 2782	vdo_log_info("resuming device '%s'", device_name);2783 2784	/* If this fails, the VDO was not in a state to be resumed. This should never happen. */2785	result = apply_new_vdo_configuration(vdo, config);2786	BUG_ON(result == VDO_INVALID_ADMIN_STATE);2787 2788	/*2789	 * Now that we've tried to modify the vdo, the new config *is* the config, whether the2790	 * modifications worked or not.2791	 */2792	vdo->device_config = config;2793 2794	/*2795	 * Any error here is highly unexpected and the state of the vdo is questionable, so we mark2796	 * it read-only in memory. Because we are suspended, the read-only state will not be2797	 * written to disk.2798	 */2799	if (result != VDO_SUCCESS) {2800		vdo_log_error_strerror(result,2801				       "Commit of modifications to device '%s' failed",2802				       device_name);2803		vdo_enter_read_only_mode(vdo, result);2804		return result;2805	}2806 2807	if (vdo_get_admin_state(vdo)->normal) {2808		/* The VDO was just started, so we don't need to resume it. */2809		return VDO_SUCCESS;2810	}2811 2812	result = perform_admin_operation(vdo, RESUME_PHASE_START, resume_callback,2813					 resume_callback, "resume");2814	BUG_ON(result == VDO_INVALID_ADMIN_STATE);2815	if (result == VDO_READ_ONLY) {2816		/* Even if the vdo is read-only, it has still resumed. */2817		result = VDO_SUCCESS;2818	}2819 2820	if (result != VDO_SUCCESS)2821		vdo_log_error("resume of device '%s' failed with error: %d", device_name,2822			      result);2823 2824	return result;2825}2826 2827static int vdo_preresume(struct dm_target *ti)2828{2829	struct registered_thread instance_thread;2830	struct vdo *vdo = get_vdo_for_target(ti);2831	int result;2832 2833	vdo_register_thread_device_id(&instance_thread, &vdo->instance);2834	result = vdo_preresume_registered(ti, vdo);2835	if ((result == VDO_PARAMETER_MISMATCH) || (result == VDO_INVALID_ADMIN_STATE) ||2836	    (result == VDO_UNSUPPORTED_VERSION))2837		result = -EINVAL;2838	vdo_unregister_thread_device_id();2839	return vdo_status_to_errno(result);2840}2841 2842static void vdo_resume(struct dm_target *ti)2843{2844	struct registered_thread instance_thread;2845 2846	vdo_register_thread_device_id(&instance_thread,2847				      &get_vdo_for_target(ti)->instance);2848	vdo_log_info("device '%s' resumed", vdo_get_device_name(ti));2849	vdo_unregister_thread_device_id();2850}2851 2852/*2853 * If anything changes that affects how user tools will interact with vdo, update the version2854 * number and make sure documentation about the change is complete so tools can properly update2855 * their management code.2856 */2857static struct target_type vdo_target_bio = {2858	.features = DM_TARGET_SINGLETON,2859	.name = "vdo",2860	.version = { 9, 1, 0 },2861	.module = THIS_MODULE,2862	.ctr = vdo_ctr,2863	.dtr = vdo_dtr,2864	.io_hints = vdo_io_hints,2865	.iterate_devices = vdo_iterate_devices,2866	.map = vdo_map_bio,2867	.message = vdo_message,2868	.status = vdo_status,2869	.presuspend = vdo_presuspend,2870	.postsuspend = vdo_postsuspend,2871	.preresume = vdo_preresume,2872	.resume = vdo_resume,2873};2874 2875static bool dm_registered;2876 2877static void vdo_module_destroy(void)2878{2879	vdo_log_debug("unloading");2880 2881	if (dm_registered)2882		dm_unregister_target(&vdo_target_bio);2883 2884	VDO_ASSERT_LOG_ONLY(instances.count == 0,2885			    "should have no instance numbers still in use, but have %u",2886			    instances.count);2887	vdo_free(instances.words);2888	memset(&instances, 0, sizeof(struct instance_tracker));2889}2890 2891static int __init vdo_init(void)2892{2893	int result = 0;2894 2895	/* Memory tracking must be initialized first for accurate accounting. */2896	vdo_memory_init();2897	vdo_initialize_threads_mutex();2898	vdo_initialize_thread_device_registry();2899	vdo_initialize_device_registry_once();2900 2901	/* Add VDO errors to the set of errors registered by the indexer. */2902	result = vdo_register_status_codes();2903	if (result != VDO_SUCCESS) {2904		vdo_log_error("vdo_register_status_codes failed %d", result);2905		vdo_module_destroy();2906		return result;2907	}2908 2909	result = dm_register_target(&vdo_target_bio);2910	if (result < 0) {2911		vdo_log_error("dm_register_target failed %d", result);2912		vdo_module_destroy();2913		return result;2914	}2915	dm_registered = true;2916 2917	return result;2918}2919 2920static void __exit vdo_exit(void)2921{2922	vdo_module_destroy();2923	/* Memory tracking cleanup must be done last. */2924	vdo_memory_exit();2925}2926 2927module_init(vdo_init);2928module_exit(vdo_exit);2929 2930module_param_named(log_level, vdo_log_level, uint, 0644);2931MODULE_PARM_DESC(log_level, "Log level for log messages");2932 2933MODULE_DESCRIPTION(DM_NAME " target for transparent deduplication");2934MODULE_AUTHOR("Red Hat, Inc.");2935MODULE_LICENSE("GPL");2936