1  /* SPDX-License-Identifier: GPL-2.0-only */
2  /*
3   * Copyright 2023 Red Hat
4   */
5  
6  #ifndef VDO_ENCODINGS_H
7  #define VDO_ENCODINGS_H
8  
9  #include <linux/blk_types.h>
10  #include <linux/crc32.h>
11  #include <linux/limits.h>
12  #include <linux/uuid.h>
13  
14  #include "numeric.h"
15  
16  #include "constants.h"
17  #include "types.h"
18  
19  /*
20   * An in-memory representation of a version number for versioned structures on disk.
21   *
22   * A version number consists of two portions, a major version and a minor version. Any format
23   * change which does not require an explicit upgrade step from the previous version should
24   * increment the minor version. Any format change which either requires an explicit upgrade step,
25   * or is wholly incompatible (i.e. can not be upgraded to), should increment the major version, and
26   * set the minor version to 0.
27   */
28  struct version_number {
29  	u32 major_version;
30  	u32 minor_version;
31  };
32  
33  /*
34   * A packed, machine-independent, on-disk representation of a version_number. Both fields are
35   * stored in little-endian byte order.
36   */
37  struct packed_version_number {
38  	__le32 major_version;
39  	__le32 minor_version;
40  } __packed;
41  
42  /* The registry of component ids for use in headers */
43  #define VDO_SUPER_BLOCK 0
44  #define VDO_LAYOUT 1
45  #define VDO_RECOVERY_JOURNAL 2
46  #define VDO_SLAB_DEPOT 3
47  #define VDO_BLOCK_MAP 4
48  #define VDO_GEOMETRY_BLOCK 5
49  
50  /* The header for versioned data stored on disk. */
51  struct header {
52  	u32 id; /* The component this is a header for */
53  	struct version_number version; /* The version of the data format */
54  	size_t size; /* The size of the data following this header */
55  };
56  
57  /* A packed, machine-independent, on-disk representation of a component header. */
58  struct packed_header {
59  	__le32 id;
60  	struct packed_version_number version;
61  	__le64 size;
62  } __packed;
63  
64  enum {
65  	VDO_GEOMETRY_BLOCK_LOCATION = 0,
66  	VDO_GEOMETRY_MAGIC_NUMBER_SIZE = 8,
67  	VDO_DEFAULT_GEOMETRY_BLOCK_VERSION = 5,
68  };
69  
70  struct index_config {
71  	u32 mem;
72  	u32 unused;
73  	bool sparse;
74  } __packed;
75  
76  enum volume_region_id {
77  	VDO_INDEX_REGION = 0,
78  	VDO_DATA_REGION = 1,
79  	VDO_VOLUME_REGION_COUNT,
80  };
81  
82  struct volume_region {
83  	/* The ID of the region */
84  	enum volume_region_id id;
85  	/*
86  	 * The absolute starting offset on the device. The region continues until the next region
87  	 * begins.
88  	 */
89  	physical_block_number_t start_block;
90  } __packed;
91  
92  struct volume_geometry {
93  	/* For backwards compatibility */
94  	u32 unused;
95  	/* The nonce of this volume */
96  	nonce_t nonce;
97  	/* The uuid of this volume */
98  	uuid_t uuid;
99  	/* The block offset to be applied to bios */
100  	block_count_t bio_offset;
101  	/* The regions in ID order */
102  	struct volume_region regions[VDO_VOLUME_REGION_COUNT];
103  	/* The index config */
104  	struct index_config index_config;
105  } __packed;
106  
107  /* This volume geometry struct is used for sizing only */
108  struct volume_geometry_4_0 {
109  	/* For backwards compatibility */
110  	u32 unused;
111  	/* The nonce of this volume */
112  	nonce_t nonce;
113  	/* The uuid of this volume */
114  	uuid_t uuid;
115  	/* The regions in ID order */
116  	struct volume_region regions[VDO_VOLUME_REGION_COUNT];
117  	/* The index config */
118  	struct index_config index_config;
119  } __packed;
120  
121  extern const u8 VDO_GEOMETRY_MAGIC_NUMBER[VDO_GEOMETRY_MAGIC_NUMBER_SIZE + 1];
122  
123  /**
124   * DOC: Block map entries
125   *
126   * The entry for each logical block in the block map is encoded into five bytes, which saves space
127   * in both the on-disk and in-memory layouts. It consists of the 36 low-order bits of a
128   * physical_block_number_t (addressing 256 terabytes with a 4KB block size) and a 4-bit encoding of
129   * a block_mapping_state.
130   *
131   * Of the 8 high bits of the 5-byte structure:
132   *
133   * Bits 7..4: The four highest bits of the 36-bit physical block number
134   * Bits 3..0: The 4-bit block_mapping_state
135   *
136   * The following 4 bytes are the low order bytes of the physical block number, in little-endian
137   * order.
138   *
139   * Conversion functions to and from a data location are provided.
140   */
141  struct block_map_entry {
142  #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
143  	unsigned mapping_state : 4;
144  	unsigned pbn_high_nibble : 4;
145  #else
146  	unsigned pbn_high_nibble : 4;
147  	unsigned mapping_state : 4;
148  #endif
149  
150  	__le32 pbn_low_word;
151  } __packed;
152  
153  struct block_map_page_header {
154  	__le64 nonce;
155  	__le64 pbn;
156  
157  	/* May be non-zero on disk */
158  	u8 unused_long_word[8];
159  
160  	/* Whether this page has been written twice to disk */
161  	bool initialized;
162  
163  	/* Always zero on disk */
164  	u8 unused_byte1;
165  
166  	/* May be non-zero on disk */
167  	u8 unused_byte2;
168  	u8 unused_byte3;
169  } __packed;
170  
171  struct block_map_page {
172  	struct packed_version_number version;
173  	struct block_map_page_header header;
174  	struct block_map_entry entries[];
175  } __packed;
176  
177  enum block_map_page_validity {
178  	VDO_BLOCK_MAP_PAGE_VALID,
179  	VDO_BLOCK_MAP_PAGE_INVALID,
180  	/* Valid page found in the wrong location on disk */
181  	VDO_BLOCK_MAP_PAGE_BAD,
182  };
183  
184  struct block_map_state_2_0 {
185  	physical_block_number_t flat_page_origin;
186  	block_count_t flat_page_count;
187  	physical_block_number_t root_origin;
188  	block_count_t root_count;
189  } __packed;
190  
191  struct boundary {
192  	page_number_t levels[VDO_BLOCK_MAP_TREE_HEIGHT];
193  };
194  
195  extern const struct header VDO_BLOCK_MAP_HEADER_2_0;
196  
197  /* The state of the recovery journal as encoded in the VDO super block. */
198  struct recovery_journal_state_7_0 {
199  	/* Sequence number to start the journal */
200  	sequence_number_t journal_start;
201  	/* Number of logical blocks used by VDO */
202  	block_count_t logical_blocks_used;
203  	/* Number of block map pages allocated */
204  	block_count_t block_map_data_blocks;
205  } __packed;
206  
207  extern const struct header VDO_RECOVERY_JOURNAL_HEADER_7_0;
208  
209  typedef u16 journal_entry_count_t;
210  
211  /*
212   * A recovery journal entry stores three physical locations: a data location that is the value of a
213   * single mapping in the block map tree, and the two locations of the block map pages and slots
214   * that are acquiring and releasing a reference to the location. The journal entry also stores an
215   * operation code that says whether the mapping is for a logical block or for the block map tree
216   * itself.
217   */
218  struct recovery_journal_entry {
219  	struct block_map_slot slot;
220  	struct data_location mapping;
221  	struct data_location unmapping;
222  	enum journal_operation operation;
223  };
224  
225  /* The packed, on-disk representation of a recovery journal entry. */
226  struct packed_recovery_journal_entry {
227  	/*
228  	 * In little-endian bit order:
229  	 * Bits 15..12: The four highest bits of the 36-bit physical block number of the block map
230  	 * tree page
231  	 * Bits 11..2: The 10-bit block map page slot number
232  	 * Bit 1..0: The journal_operation of the entry (this actually only requires 1 bit, but
233  	 *           it is convenient to keep the extra bit as part of this field.
234  	 */
235  #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
236  	unsigned operation : 2;
237  	unsigned slot_low : 6;
238  	unsigned slot_high : 4;
239  	unsigned pbn_high_nibble : 4;
240  #else
241  	unsigned slot_low : 6;
242  	unsigned operation : 2;
243  	unsigned pbn_high_nibble : 4;
244  	unsigned slot_high : 4;
245  #endif
246  
247  	/*
248  	 * Bits 47..16: The 32 low-order bits of the block map page PBN, in little-endian byte
249  	 * order
250  	 */
251  	__le32 pbn_low_word;
252  
253  	/*
254  	 * Bits 87..48: The five-byte block map entry encoding the location that will be stored in
255  	 * the block map page slot
256  	 */
257  	struct block_map_entry mapping;
258  
259  	/*
260  	 * Bits 127..88: The five-byte block map entry encoding the location that was stored in the
261  	 * block map page slot
262  	 */
263  	struct block_map_entry unmapping;
264  } __packed;
265  
266  /* The packed, on-disk representation of an old format recovery journal entry. */
267  struct packed_recovery_journal_entry_1 {
268  	/*
269  	 * In little-endian bit order:
270  	 * Bits 15..12: The four highest bits of the 36-bit physical block number of the block map
271  	 *              tree page
272  	 * Bits 11..2: The 10-bit block map page slot number
273  	 * Bits 1..0: The 2-bit journal_operation of the entry
274  	 *
275  	 */
276  #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
277  	unsigned operation : 2;
278  	unsigned slot_low : 6;
279  	unsigned slot_high : 4;
280  	unsigned pbn_high_nibble : 4;
281  #else
282  	unsigned slot_low : 6;
283  	unsigned operation : 2;
284  	unsigned pbn_high_nibble : 4;
285  	unsigned slot_high : 4;
286  #endif
287  
288  	/*
289  	 * Bits 47..16: The 32 low-order bits of the block map page PBN, in little-endian byte
290  	 * order
291  	 */
292  	__le32 pbn_low_word;
293  
294  	/*
295  	 * Bits 87..48: The five-byte block map entry encoding the location that was or will be
296  	 * stored in the block map page slot
297  	 */
298  	struct block_map_entry block_map_entry;
299  } __packed;
300  
301  enum journal_operation_1 {
302  	VDO_JOURNAL_DATA_DECREMENT = 0,
303  	VDO_JOURNAL_DATA_INCREMENT = 1,
304  	VDO_JOURNAL_BLOCK_MAP_DECREMENT = 2,
305  	VDO_JOURNAL_BLOCK_MAP_INCREMENT = 3,
306  } __packed;
307  
308  struct recovery_block_header {
309  	sequence_number_t block_map_head; /* Block map head sequence number */
310  	sequence_number_t slab_journal_head; /* Slab journal head seq. number */
311  	sequence_number_t sequence_number; /* Sequence number for this block */
312  	nonce_t nonce; /* A given VDO instance's nonce */
313  	block_count_t logical_blocks_used; /* Logical blocks in use */
314  	block_count_t block_map_data_blocks; /* Allocated block map pages */
315  	journal_entry_count_t entry_count; /* Number of entries written */
316  	u8 check_byte; /* The protection check byte */
317  	u8 recovery_count; /* Number of recoveries completed */
318  	enum vdo_metadata_type metadata_type; /* Metadata type */
319  };
320  
321  /*
322   * The packed, on-disk representation of a recovery journal block header. All fields are kept in
323   * little-endian byte order.
324   */
325  struct packed_journal_header {
326  	/* Block map head 64-bit sequence number */
327  	__le64 block_map_head;
328  
329  	/* Slab journal head 64-bit sequence number */
330  	__le64 slab_journal_head;
331  
332  	/* The 64-bit sequence number for this block */
333  	__le64 sequence_number;
334  
335  	/* A given VDO instance's 64-bit nonce */
336  	__le64 nonce;
337  
338  	/* 8-bit metadata type (should always be one for the recovery journal) */
339  	u8 metadata_type;
340  
341  	/* 16-bit count of the entries encoded in the block */
342  	__le16 entry_count;
343  
344  	/* 64-bit count of the logical blocks used when this block was opened */
345  	__le64 logical_blocks_used;
346  
347  	/* 64-bit count of the block map blocks used when this block was opened */
348  	__le64 block_map_data_blocks;
349  
350  	/* The protection check byte */
351  	u8 check_byte;
352  
353  	/* The number of recoveries completed */
354  	u8 recovery_count;
355  } __packed;
356  
357  struct packed_journal_sector {
358  	/* The protection check byte */
359  	u8 check_byte;
360  
361  	/* The number of recoveries completed */
362  	u8 recovery_count;
363  
364  	/* The number of entries in this sector */
365  	u8 entry_count;
366  
367  	/* Journal entries for this sector */
368  	struct packed_recovery_journal_entry entries[];
369  } __packed;
370  
371  enum {
372  	/* The number of entries in each sector (except the last) when filled */
373  	RECOVERY_JOURNAL_ENTRIES_PER_SECTOR =
374  		((VDO_SECTOR_SIZE - sizeof(struct packed_journal_sector)) /
375  		 sizeof(struct packed_recovery_journal_entry)),
376  	RECOVERY_JOURNAL_ENTRIES_PER_BLOCK = RECOVERY_JOURNAL_ENTRIES_PER_SECTOR * 7,
377  	/* The number of entries in a v1 recovery journal block. */
378  	RECOVERY_JOURNAL_1_ENTRIES_PER_BLOCK = 311,
379  	/* The number of entries in each v1 sector (except the last) when filled */
380  	RECOVERY_JOURNAL_1_ENTRIES_PER_SECTOR =
381  		((VDO_SECTOR_SIZE - sizeof(struct packed_journal_sector)) /
382  		 sizeof(struct packed_recovery_journal_entry_1)),
383  	/* The number of entries in the last sector when a block is full */
384  	RECOVERY_JOURNAL_1_ENTRIES_IN_LAST_SECTOR =
385  		(RECOVERY_JOURNAL_1_ENTRIES_PER_BLOCK % RECOVERY_JOURNAL_1_ENTRIES_PER_SECTOR),
386  };
387  
388  /* A type representing a reference count of a block. */
389  typedef u8 vdo_refcount_t;
390  
391  /* The absolute position of an entry in a recovery journal or slab journal. */
392  struct journal_point {
393  	sequence_number_t sequence_number;
394  	journal_entry_count_t entry_count;
395  };
396  
397  /* A packed, platform-independent encoding of a struct journal_point. */
398  struct packed_journal_point {
399  	/*
400  	 * The packed representation is the little-endian 64-bit representation of the low-order 48
401  	 * bits of the sequence number, shifted up 16 bits, or'ed with the 16-bit entry count.
402  	 *
403  	 * Very long-term, the top 16 bits of the sequence number may not always be zero, as this
404  	 * encoding assumes--see BZ 1523240.
405  	 */
406  	__le64 encoded_point;
407  } __packed;
408  
409  /* Special vdo_refcount_t values. */
410  #define EMPTY_REFERENCE_COUNT 0
411  enum {
412  	MAXIMUM_REFERENCE_COUNT = 254,
413  	PROVISIONAL_REFERENCE_COUNT = 255,
414  };
415  
416  enum {
417  	COUNTS_PER_SECTOR =
418  		((VDO_SECTOR_SIZE - sizeof(struct packed_journal_point)) / sizeof(vdo_refcount_t)),
419  	COUNTS_PER_BLOCK = COUNTS_PER_SECTOR * VDO_SECTORS_PER_BLOCK,
420  };
421  
422  /* The format of each sector of a reference_block on disk. */
423  struct packed_reference_sector {
424  	struct packed_journal_point commit_point;
425  	vdo_refcount_t counts[COUNTS_PER_SECTOR];
426  } __packed;
427  
428  struct packed_reference_block {
429  	struct packed_reference_sector sectors[VDO_SECTORS_PER_BLOCK];
430  };
431  
432  struct slab_depot_state_2_0 {
433  	struct slab_config slab_config;
434  	physical_block_number_t first_block;
435  	physical_block_number_t last_block;
436  	zone_count_t zone_count;
437  } __packed;
438  
439  extern const struct header VDO_SLAB_DEPOT_HEADER_2_0;
440  
441  /*
442   * vdo_slab journal blocks may have one of two formats, depending upon whether or not any of the
443   * entries in the block are block map increments. Since the steady state for a VDO is that all of
444   * the necessary block map pages will be allocated, most slab journal blocks will have only data
445   * entries. Such blocks can hold more entries, hence the two formats.
446   */
447  
448  /* A single slab journal entry */
449  struct slab_journal_entry {
450  	slab_block_number sbn;
451  	enum journal_operation operation;
452  	bool increment;
453  };
454  
455  /* A single slab journal entry in its on-disk form */
456  typedef struct {
457  	u8 offset_low8;
458  	u8 offset_mid8;
459  
460  #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
461  	unsigned offset_high7 : 7;
462  	unsigned increment : 1;
463  #else
464  	unsigned increment : 1;
465  	unsigned offset_high7 : 7;
466  #endif
467  } __packed packed_slab_journal_entry;
468  
469  /* The unpacked representation of the header of a slab journal block */
470  struct slab_journal_block_header {
471  	/* Sequence number for head of journal */
472  	sequence_number_t head;
473  	/* Sequence number for this block */
474  	sequence_number_t sequence_number;
475  	/* The nonce for a given VDO instance */
476  	nonce_t nonce;
477  	/* Recovery journal point for last entry */
478  	struct journal_point recovery_point;
479  	/* Metadata type */
480  	enum vdo_metadata_type metadata_type;
481  	/* Whether this block contains block map increments */
482  	bool has_block_map_increments;
483  	/* The number of entries in the block */
484  	journal_entry_count_t entry_count;
485  };
486  
487  /*
488   * The packed, on-disk representation of a slab journal block header. All fields are kept in
489   * little-endian byte order.
490   */
491  struct packed_slab_journal_block_header {
492  	/* 64-bit sequence number for head of journal */
493  	__le64 head;
494  	/* 64-bit sequence number for this block */
495  	__le64 sequence_number;
496  	/* Recovery journal point for the last entry, packed into 64 bits */
497  	struct packed_journal_point recovery_point;
498  	/* The 64-bit nonce for a given VDO instance */
499  	__le64 nonce;
500  	/* 8-bit metadata type (should always be two, for the slab journal) */
501  	u8 metadata_type;
502  	/* Whether this block contains block map increments */
503  	bool has_block_map_increments;
504  	/* 16-bit count of the entries encoded in the block */
505  	__le16 entry_count;
506  } __packed;
507  
508  enum {
509  	VDO_SLAB_JOURNAL_PAYLOAD_SIZE =
510  		VDO_BLOCK_SIZE - sizeof(struct packed_slab_journal_block_header),
511  	VDO_SLAB_JOURNAL_FULL_ENTRIES_PER_BLOCK = (VDO_SLAB_JOURNAL_PAYLOAD_SIZE * 8) / 25,
512  	VDO_SLAB_JOURNAL_ENTRY_TYPES_SIZE =
513  		((VDO_SLAB_JOURNAL_FULL_ENTRIES_PER_BLOCK - 1) / 8) + 1,
514  	VDO_SLAB_JOURNAL_ENTRIES_PER_BLOCK =
515  		(VDO_SLAB_JOURNAL_PAYLOAD_SIZE / sizeof(packed_slab_journal_entry)),
516  };
517  
518  /* The payload of a slab journal block which has block map increments */
519  struct full_slab_journal_entries {
520  	/* The entries themselves */
521  	packed_slab_journal_entry entries[VDO_SLAB_JOURNAL_FULL_ENTRIES_PER_BLOCK];
522  	/* The bit map indicating which entries are block map increments */
523  	u8 entry_types[VDO_SLAB_JOURNAL_ENTRY_TYPES_SIZE];
524  } __packed;
525  
526  typedef union {
527  	/* Entries which include block map increments */
528  	struct full_slab_journal_entries full_entries;
529  	/* Entries which are only data updates */
530  	packed_slab_journal_entry entries[VDO_SLAB_JOURNAL_ENTRIES_PER_BLOCK];
531  	/* Ensure the payload fills to the end of the block */
532  	u8 space[VDO_SLAB_JOURNAL_PAYLOAD_SIZE];
533  } __packed slab_journal_payload;
534  
535  struct packed_slab_journal_block {
536  	struct packed_slab_journal_block_header header;
537  	slab_journal_payload payload;
538  } __packed;
539  
540  /* The offset of a slab journal tail block. */
541  typedef u8 tail_block_offset_t;
542  
543  struct slab_summary_entry {
544  	/* Bits 7..0: The offset of the tail block within the slab journal */
545  	tail_block_offset_t tail_block_offset;
546  
547  #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
548  	/* Bits 13..8: A hint about the fullness of the slab */
549  	unsigned int fullness_hint : 6;
550  	/* Bit 14: Whether the ref_counts must be loaded from the layer */
551  	unsigned int load_ref_counts : 1;
552  	/* Bit 15: The believed cleanliness of this slab */
553  	unsigned int is_dirty : 1;
554  #else
555  	/* Bit 15: The believed cleanliness of this slab */
556  	unsigned int is_dirty : 1;
557  	/* Bit 14: Whether the ref_counts must be loaded from the layer */
558  	unsigned int load_ref_counts : 1;
559  	/* Bits 13..8: A hint about the fullness of the slab */
560  	unsigned int fullness_hint : 6;
561  #endif
562  } __packed;
563  
564  enum {
565  	VDO_SLAB_SUMMARY_FULLNESS_HINT_BITS = 6,
566  	VDO_SLAB_SUMMARY_ENTRIES_PER_BLOCK = VDO_BLOCK_SIZE / sizeof(struct slab_summary_entry),
567  	VDO_SLAB_SUMMARY_BLOCKS_PER_ZONE = MAX_VDO_SLABS / VDO_SLAB_SUMMARY_ENTRIES_PER_BLOCK,
568  	VDO_SLAB_SUMMARY_BLOCKS = VDO_SLAB_SUMMARY_BLOCKS_PER_ZONE * MAX_VDO_PHYSICAL_ZONES,
569  };
570  
571  struct layout {
572  	physical_block_number_t start;
573  	block_count_t size;
574  	physical_block_number_t first_free;
575  	physical_block_number_t last_free;
576  	size_t num_partitions;
577  	struct partition *head;
578  };
579  
580  struct partition {
581  	enum partition_id id; /* The id of this partition */
582  	physical_block_number_t offset; /* The offset into the layout of this partition */
583  	block_count_t count; /* The number of blocks in the partition */
584  	struct partition *next; /* A pointer to the next partition in the layout */
585  };
586  
587  struct layout_3_0 {
588  	physical_block_number_t first_free;
589  	physical_block_number_t last_free;
590  	u8 partition_count;
591  } __packed;
592  
593  struct partition_3_0 {
594  	enum partition_id id;
595  	physical_block_number_t offset;
596  	physical_block_number_t base; /* unused but retained for backwards compatibility */
597  	block_count_t count;
598  } __packed;
599  
600  /*
601   * The configuration of the VDO service.
602   */
603  struct vdo_config {
604  	block_count_t logical_blocks; /* number of logical blocks */
605  	block_count_t physical_blocks; /* number of physical blocks */
606  	block_count_t slab_size; /* number of blocks in a slab */
607  	block_count_t recovery_journal_size; /* number of recovery journal blocks */
608  	block_count_t slab_journal_blocks; /* number of slab journal blocks */
609  };
610  
611  /* This is the structure that captures the vdo fields saved as a super block component. */
612  struct vdo_component {
613  	enum vdo_state state;
614  	u64 complete_recoveries;
615  	u64 read_only_recoveries;
616  	struct vdo_config config;
617  	nonce_t nonce;
618  };
619  
620  /*
621   * A packed, machine-independent, on-disk representation of the vdo_config in the VDO component
622   * data in the super block.
623   */
624  struct packed_vdo_config {
625  	__le64 logical_blocks;
626  	__le64 physical_blocks;
627  	__le64 slab_size;
628  	__le64 recovery_journal_size;
629  	__le64 slab_journal_blocks;
630  } __packed;
631  
632  /*
633   * A packed, machine-independent, on-disk representation of version 41.0 of the VDO component data
634   * in the super block.
635   */
636  struct packed_vdo_component_41_0 {
637  	__le32 state;
638  	__le64 complete_recoveries;
639  	__le64 read_only_recoveries;
640  	struct packed_vdo_config config;
641  	__le64 nonce;
642  } __packed;
643  
644  /*
645   * The version of the on-disk format of a VDO volume. This should be incremented any time the
646   * on-disk representation of any VDO structure changes. Changes which require only online upgrade
647   * steps should increment the minor version. Changes which require an offline upgrade or which can
648   * not be upgraded to at all should increment the major version and set the minor version to 0.
649   */
650  extern const struct version_number VDO_VOLUME_VERSION_67_0;
651  
652  enum {
653  	VDO_ENCODED_HEADER_SIZE = sizeof(struct packed_header),
654  	BLOCK_MAP_COMPONENT_ENCODED_SIZE =
655  		VDO_ENCODED_HEADER_SIZE + sizeof(struct block_map_state_2_0),
656  	RECOVERY_JOURNAL_COMPONENT_ENCODED_SIZE =
657  		VDO_ENCODED_HEADER_SIZE + sizeof(struct recovery_journal_state_7_0),
658  	SLAB_DEPOT_COMPONENT_ENCODED_SIZE =
659  		VDO_ENCODED_HEADER_SIZE + sizeof(struct slab_depot_state_2_0),
660  	VDO_PARTITION_COUNT = 4,
661  	VDO_LAYOUT_ENCODED_SIZE = (VDO_ENCODED_HEADER_SIZE +
662  				   sizeof(struct layout_3_0) +
663  				   (sizeof(struct partition_3_0) * VDO_PARTITION_COUNT)),
664  	VDO_SUPER_BLOCK_FIXED_SIZE = VDO_ENCODED_HEADER_SIZE + sizeof(u32),
665  	VDO_MAX_COMPONENT_DATA_SIZE = VDO_SECTOR_SIZE - VDO_SUPER_BLOCK_FIXED_SIZE,
666  	VDO_COMPONENT_ENCODED_SIZE =
667  		(sizeof(struct packed_version_number) + sizeof(struct packed_vdo_component_41_0)),
668  	VDO_COMPONENT_DATA_OFFSET = VDO_ENCODED_HEADER_SIZE,
669  	VDO_COMPONENT_DATA_SIZE = (sizeof(u32) +
670  				   sizeof(struct packed_version_number) +
671  				   VDO_COMPONENT_ENCODED_SIZE +
672  				   VDO_LAYOUT_ENCODED_SIZE +
673  				   RECOVERY_JOURNAL_COMPONENT_ENCODED_SIZE +
674  				   SLAB_DEPOT_COMPONENT_ENCODED_SIZE +
675  				   BLOCK_MAP_COMPONENT_ENCODED_SIZE),
676  };
677  
678  /* The entirety of the component data encoded in the VDO super block. */
679  struct vdo_component_states {
680  	/* For backwards compatibility */
681  	u32 unused;
682  
683  	/* The VDO volume version */
684  	struct version_number volume_version;
685  
686  	/* Components */
687  	struct vdo_component vdo;
688  	struct block_map_state_2_0 block_map;
689  	struct recovery_journal_state_7_0 recovery_journal;
690  	struct slab_depot_state_2_0 slab_depot;
691  
692  	/* Our partitioning of the underlying storage */
693  	struct layout layout;
694  };
695  
696  /**
697   * vdo_are_same_version() - Check whether two version numbers are the same.
698   * @version_a: The first version.
699   * @version_b: The second version.
700   *
701   * Return: true if the two versions are the same.
702   */
vdo_are_same_version(struct version_number version_a,struct version_number version_b)703  static inline bool vdo_are_same_version(struct version_number version_a,
704  					struct version_number version_b)
705  {
706  	return ((version_a.major_version == version_b.major_version) &&
707  		(version_a.minor_version == version_b.minor_version));
708  }
709  
710  /**
711   * vdo_is_upgradable_version() - Check whether an actual version is upgradable to an expected
712   *                               version.
713   * @expected_version: The expected version.
714   * @actual_version: The version being validated.
715   *
716   * An actual version is upgradable if its major number is expected but its minor number differs,
717   * and the expected version's minor number is greater than the actual version's minor number.
718   *
719   * Return: true if the actual version is upgradable.
720   */
vdo_is_upgradable_version(struct version_number expected_version,struct version_number actual_version)721  static inline bool vdo_is_upgradable_version(struct version_number expected_version,
722  					     struct version_number actual_version)
723  {
724  	return ((expected_version.major_version == actual_version.major_version) &&
725  		(expected_version.minor_version > actual_version.minor_version));
726  }
727  
728  int __must_check vdo_validate_header(const struct header *expected_header,
729  				     const struct header *actual_header, bool exact_size,
730  				     const char *component_name);
731  
732  void vdo_encode_header(u8 *buffer, size_t *offset, const struct header *header);
733  void vdo_decode_header(u8 *buffer, size_t *offset, struct header *header);
734  
735  /**
736   * vdo_pack_version_number() - Convert a version_number to its packed on-disk representation.
737   * @version: The version number to convert.
738   *
739   * Return: the platform-independent representation of the version
740   */
vdo_pack_version_number(struct version_number version)741  static inline struct packed_version_number vdo_pack_version_number(struct version_number version)
742  {
743  	return (struct packed_version_number) {
744  		.major_version = __cpu_to_le32(version.major_version),
745  		.minor_version = __cpu_to_le32(version.minor_version),
746  	};
747  }
748  
749  /**
750   * vdo_unpack_version_number() - Convert a packed_version_number to its native in-memory
751   *                               representation.
752   * @version: The version number to convert.
753   *
754   * Return: The platform-independent representation of the version.
755   */
vdo_unpack_version_number(struct packed_version_number version)756  static inline struct version_number vdo_unpack_version_number(struct packed_version_number version)
757  {
758  	return (struct version_number) {
759  		.major_version = __le32_to_cpu(version.major_version),
760  		.minor_version = __le32_to_cpu(version.minor_version),
761  	};
762  }
763  
764  /**
765   * vdo_pack_header() - Convert a component header to its packed on-disk representation.
766   * @header: The header to convert.
767   *
768   * Return: the platform-independent representation of the header
769   */
vdo_pack_header(const struct header * header)770  static inline struct packed_header vdo_pack_header(const struct header *header)
771  {
772  	return (struct packed_header) {
773  		.id = __cpu_to_le32(header->id),
774  		.version = vdo_pack_version_number(header->version),
775  		.size = __cpu_to_le64(header->size),
776  	};
777  }
778  
779  /**
780   * vdo_unpack_header() - Convert a packed_header to its native in-memory representation.
781   * @header: The header to convert.
782   *
783   * Return: The platform-independent representation of the version.
784   */
vdo_unpack_header(const struct packed_header * header)785  static inline struct header vdo_unpack_header(const struct packed_header *header)
786  {
787  	return (struct header) {
788  		.id = __le32_to_cpu(header->id),
789  		.version = vdo_unpack_version_number(header->version),
790  		.size = __le64_to_cpu(header->size),
791  	};
792  }
793  
794  /**
795   * vdo_get_index_region_start() - Get the start of the index region from a geometry.
796   * @geometry: The geometry.
797   *
798   * Return: The start of the index region.
799   */
800  static inline physical_block_number_t __must_check
vdo_get_index_region_start(struct volume_geometry geometry)801  vdo_get_index_region_start(struct volume_geometry geometry)
802  {
803  	return geometry.regions[VDO_INDEX_REGION].start_block;
804  }
805  
806  /**
807   * vdo_get_data_region_start() - Get the start of the data region from a geometry.
808   * @geometry: The geometry.
809   *
810   * Return: The start of the data region.
811   */
812  static inline physical_block_number_t __must_check
vdo_get_data_region_start(struct volume_geometry geometry)813  vdo_get_data_region_start(struct volume_geometry geometry)
814  {
815  	return geometry.regions[VDO_DATA_REGION].start_block;
816  }
817  
818  /**
819   * vdo_get_index_region_size() - Get the size of the index region from a geometry.
820   * @geometry: The geometry.
821   *
822   * Return: The size of the index region.
823   */
824  static inline physical_block_number_t __must_check
vdo_get_index_region_size(struct volume_geometry geometry)825  vdo_get_index_region_size(struct volume_geometry geometry)
826  {
827  	return vdo_get_data_region_start(geometry) -
828  		vdo_get_index_region_start(geometry);
829  }
830  
831  int __must_check vdo_parse_geometry_block(unsigned char *block,
832  					  struct volume_geometry *geometry);
833  
vdo_is_state_compressed(const enum block_mapping_state mapping_state)834  static inline bool vdo_is_state_compressed(const enum block_mapping_state mapping_state)
835  {
836  	return (mapping_state > VDO_MAPPING_STATE_UNCOMPRESSED);
837  }
838  
839  static inline struct block_map_entry
vdo_pack_block_map_entry(physical_block_number_t pbn,enum block_mapping_state mapping_state)840  vdo_pack_block_map_entry(physical_block_number_t pbn, enum block_mapping_state mapping_state)
841  {
842  	return (struct block_map_entry) {
843  		.mapping_state = (mapping_state & 0x0F),
844  		.pbn_high_nibble = ((pbn >> 32) & 0x0F),
845  		.pbn_low_word = __cpu_to_le32(pbn & UINT_MAX),
846  	};
847  }
848  
vdo_unpack_block_map_entry(const struct block_map_entry * entry)849  static inline struct data_location vdo_unpack_block_map_entry(const struct block_map_entry *entry)
850  {
851  	physical_block_number_t low32 = __le32_to_cpu(entry->pbn_low_word);
852  	physical_block_number_t high4 = entry->pbn_high_nibble;
853  
854  	return (struct data_location) {
855  		.pbn = ((high4 << 32) | low32),
856  		.state = entry->mapping_state,
857  	};
858  }
859  
vdo_is_mapped_location(const struct data_location * location)860  static inline bool vdo_is_mapped_location(const struct data_location *location)
861  {
862  	return (location->state != VDO_MAPPING_STATE_UNMAPPED);
863  }
864  
vdo_is_valid_location(const struct data_location * location)865  static inline bool vdo_is_valid_location(const struct data_location *location)
866  {
867  	if (location->pbn == VDO_ZERO_BLOCK)
868  		return !vdo_is_state_compressed(location->state);
869  	else
870  		return vdo_is_mapped_location(location);
871  }
872  
873  static inline physical_block_number_t __must_check
vdo_get_block_map_page_pbn(const struct block_map_page * page)874  vdo_get_block_map_page_pbn(const struct block_map_page *page)
875  {
876  	return __le64_to_cpu(page->header.pbn);
877  }
878  
879  struct block_map_page *vdo_format_block_map_page(void *buffer, nonce_t nonce,
880  						 physical_block_number_t pbn,
881  						 bool initialized);
882  
883  enum block_map_page_validity __must_check vdo_validate_block_map_page(struct block_map_page *page,
884  								      nonce_t nonce,
885  								      physical_block_number_t pbn);
886  
vdo_compute_block_map_page_count(block_count_t entries)887  static inline page_count_t vdo_compute_block_map_page_count(block_count_t entries)
888  {
889  	return DIV_ROUND_UP(entries, VDO_BLOCK_MAP_ENTRIES_PER_PAGE);
890  }
891  
892  block_count_t __must_check vdo_compute_new_forest_pages(root_count_t root_count,
893  							struct boundary *old_sizes,
894  							block_count_t entries,
895  							struct boundary *new_sizes);
896  
897  /**
898   * vdo_pack_recovery_journal_entry() - Return the packed, on-disk representation of a recovery
899   *                                     journal entry.
900   * @entry: The journal entry to pack.
901   *
902   * Return: The packed representation of the journal entry.
903   */
904  static inline struct packed_recovery_journal_entry
vdo_pack_recovery_journal_entry(const struct recovery_journal_entry * entry)905  vdo_pack_recovery_journal_entry(const struct recovery_journal_entry *entry)
906  {
907  	return (struct packed_recovery_journal_entry) {
908  		.operation = entry->operation,
909  		.slot_low = entry->slot.slot & 0x3F,
910  		.slot_high = (entry->slot.slot >> 6) & 0x0F,
911  		.pbn_high_nibble = (entry->slot.pbn >> 32) & 0x0F,
912  		.pbn_low_word = __cpu_to_le32(entry->slot.pbn & UINT_MAX),
913  		.mapping = vdo_pack_block_map_entry(entry->mapping.pbn,
914  						    entry->mapping.state),
915  		.unmapping = vdo_pack_block_map_entry(entry->unmapping.pbn,
916  						      entry->unmapping.state),
917  	};
918  }
919  
920  /**
921   * vdo_unpack_recovery_journal_entry() - Unpack the on-disk representation of a recovery journal
922   *                                       entry.
923   * @entry: The recovery journal entry to unpack.
924   *
925   * Return: The unpacked entry.
926   */
927  static inline struct recovery_journal_entry
vdo_unpack_recovery_journal_entry(const struct packed_recovery_journal_entry * entry)928  vdo_unpack_recovery_journal_entry(const struct packed_recovery_journal_entry *entry)
929  {
930  	physical_block_number_t low32 = __le32_to_cpu(entry->pbn_low_word);
931  	physical_block_number_t high4 = entry->pbn_high_nibble;
932  
933  	return (struct recovery_journal_entry) {
934  		.operation = entry->operation,
935  		.slot = {
936  			.pbn = ((high4 << 32) | low32),
937  			.slot = (entry->slot_low | (entry->slot_high << 6)),
938  		},
939  		.mapping = vdo_unpack_block_map_entry(&entry->mapping),
940  		.unmapping = vdo_unpack_block_map_entry(&entry->unmapping),
941  	};
942  }
943  
944  const char * __must_check vdo_get_journal_operation_name(enum journal_operation operation);
945  
946  /**
947   * vdo_is_valid_recovery_journal_sector() - Determine whether the header of the given sector could
948   *                                          describe a valid sector for the given journal block
949   *                                          header.
950   * @header: The unpacked block header to compare against.
951   * @sector: The packed sector to check.
952   * @sector_number: The number of the sector being checked.
953   *
954   * Return: true if the sector matches the block header.
955   */
956  static inline bool __must_check
vdo_is_valid_recovery_journal_sector(const struct recovery_block_header * header,const struct packed_journal_sector * sector,u8 sector_number)957  vdo_is_valid_recovery_journal_sector(const struct recovery_block_header *header,
958  				     const struct packed_journal_sector *sector,
959  				     u8 sector_number)
960  {
961  	if ((header->check_byte != sector->check_byte) ||
962  	    (header->recovery_count != sector->recovery_count))
963  		return false;
964  
965  	if (header->metadata_type == VDO_METADATA_RECOVERY_JOURNAL_2)
966  		return sector->entry_count <= RECOVERY_JOURNAL_ENTRIES_PER_SECTOR;
967  
968  	if (sector_number == 7)
969  		return sector->entry_count <= RECOVERY_JOURNAL_1_ENTRIES_IN_LAST_SECTOR;
970  
971  	return sector->entry_count <= RECOVERY_JOURNAL_1_ENTRIES_PER_SECTOR;
972  }
973  
974  /**
975   * vdo_compute_recovery_journal_block_number() - Compute the physical block number of the recovery
976   *                                               journal block which would have a given sequence
977   *                                               number.
978   * @journal_size: The size of the journal.
979   * @sequence_number: The sequence number.
980   *
981   * Return: The pbn of the journal block which would the specified sequence number.
982   */
983  static inline physical_block_number_t __must_check
vdo_compute_recovery_journal_block_number(block_count_t journal_size,sequence_number_t sequence_number)984  vdo_compute_recovery_journal_block_number(block_count_t journal_size,
985  					  sequence_number_t sequence_number)
986  {
987  	/*
988  	 * Since journal size is a power of two, the block number modulus can just be extracted
989  	 * from the low-order bits of the sequence.
990  	 */
991  	return (sequence_number & (journal_size - 1));
992  }
993  
994  /**
995   * vdo_get_journal_block_sector() - Find the recovery journal sector from the block header and
996   *                                  sector number.
997   * @header: The header of the recovery journal block.
998   * @sector_number: The index of the sector (1-based).
999   *
1000   * Return: A packed recovery journal sector.
1001   */
1002  static inline struct packed_journal_sector * __must_check
vdo_get_journal_block_sector(struct packed_journal_header * header,int sector_number)1003  vdo_get_journal_block_sector(struct packed_journal_header *header, int sector_number)
1004  {
1005  	char *sector_data = ((char *) header) + (VDO_SECTOR_SIZE * sector_number);
1006  
1007  	return (struct packed_journal_sector *) sector_data;
1008  }
1009  
1010  /**
1011   * vdo_pack_recovery_block_header() - Generate the packed representation of a recovery block
1012   *                                    header.
1013   * @header: The header containing the values to encode.
1014   * @packed: The header into which to pack the values.
1015   */
vdo_pack_recovery_block_header(const struct recovery_block_header * header,struct packed_journal_header * packed)1016  static inline void vdo_pack_recovery_block_header(const struct recovery_block_header *header,
1017  						  struct packed_journal_header *packed)
1018  {
1019  	*packed = (struct packed_journal_header) {
1020  		.block_map_head = __cpu_to_le64(header->block_map_head),
1021  		.slab_journal_head = __cpu_to_le64(header->slab_journal_head),
1022  		.sequence_number = __cpu_to_le64(header->sequence_number),
1023  		.nonce = __cpu_to_le64(header->nonce),
1024  		.logical_blocks_used = __cpu_to_le64(header->logical_blocks_used),
1025  		.block_map_data_blocks = __cpu_to_le64(header->block_map_data_blocks),
1026  		.entry_count = __cpu_to_le16(header->entry_count),
1027  		.check_byte = header->check_byte,
1028  		.recovery_count = header->recovery_count,
1029  		.metadata_type = header->metadata_type,
1030  	};
1031  }
1032  
1033  /**
1034   * vdo_unpack_recovery_block_header() - Decode the packed representation of a recovery block
1035   *                                      header.
1036   * @packed: The packed header to decode.
1037   *
1038   * Return: The unpacked header.
1039   */
1040  static inline struct recovery_block_header
vdo_unpack_recovery_block_header(const struct packed_journal_header * packed)1041  vdo_unpack_recovery_block_header(const struct packed_journal_header *packed)
1042  {
1043  	return (struct recovery_block_header) {
1044  		.block_map_head = __le64_to_cpu(packed->block_map_head),
1045  		.slab_journal_head = __le64_to_cpu(packed->slab_journal_head),
1046  		.sequence_number = __le64_to_cpu(packed->sequence_number),
1047  		.nonce = __le64_to_cpu(packed->nonce),
1048  		.logical_blocks_used = __le64_to_cpu(packed->logical_blocks_used),
1049  		.block_map_data_blocks = __le64_to_cpu(packed->block_map_data_blocks),
1050  		.entry_count = __le16_to_cpu(packed->entry_count),
1051  		.check_byte = packed->check_byte,
1052  		.recovery_count = packed->recovery_count,
1053  		.metadata_type = packed->metadata_type,
1054  	};
1055  }
1056  
1057  /**
1058   * vdo_compute_slab_count() - Compute the number of slabs a depot with given parameters would have.
1059   * @first_block: PBN of the first data block.
1060   * @last_block: PBN of the last data block.
1061   * @slab_size_shift: Exponent for the number of blocks per slab.
1062   *
1063   * Return: The number of slabs.
1064   */
vdo_compute_slab_count(physical_block_number_t first_block,physical_block_number_t last_block,unsigned int slab_size_shift)1065  static inline slab_count_t vdo_compute_slab_count(physical_block_number_t first_block,
1066  						  physical_block_number_t last_block,
1067  						  unsigned int slab_size_shift)
1068  {
1069  	return (slab_count_t) ((last_block - first_block) >> slab_size_shift);
1070  }
1071  
1072  int __must_check vdo_configure_slab_depot(const struct partition *partition,
1073  					  struct slab_config slab_config,
1074  					  zone_count_t zone_count,
1075  					  struct slab_depot_state_2_0 *state);
1076  
1077  int __must_check vdo_configure_slab(block_count_t slab_size,
1078  				    block_count_t slab_journal_blocks,
1079  				    struct slab_config *slab_config);
1080  
1081  /**
1082   * vdo_get_saved_reference_count_size() - Get the number of blocks required to save a reference
1083   *                                        counts state covering the specified number of data
1084   *                                        blocks.
1085   * @block_count: The number of physical data blocks that can be referenced.
1086   *
1087   * Return: The number of blocks required to save reference counts with the given block count.
1088   */
vdo_get_saved_reference_count_size(block_count_t block_count)1089  static inline block_count_t vdo_get_saved_reference_count_size(block_count_t block_count)
1090  {
1091  	return DIV_ROUND_UP(block_count, COUNTS_PER_BLOCK);
1092  }
1093  
1094  /**
1095   * vdo_get_slab_journal_start_block() - Get the physical block number of the start of the slab
1096   *                                      journal relative to the start block allocator partition.
1097   * @slab_config: The slab configuration of the VDO.
1098   * @origin: The first block of the slab.
1099   */
1100  static inline physical_block_number_t __must_check
vdo_get_slab_journal_start_block(const struct slab_config * slab_config,physical_block_number_t origin)1101  vdo_get_slab_journal_start_block(const struct slab_config *slab_config,
1102  				 physical_block_number_t origin)
1103  {
1104  	return origin + slab_config->data_blocks + slab_config->reference_count_blocks;
1105  }
1106  
1107  /**
1108   * vdo_advance_journal_point() - Move the given journal point forward by one entry.
1109   * @point: The journal point to adjust.
1110   * @entries_per_block: The number of entries in one full block.
1111   */
vdo_advance_journal_point(struct journal_point * point,journal_entry_count_t entries_per_block)1112  static inline void vdo_advance_journal_point(struct journal_point *point,
1113  					     journal_entry_count_t entries_per_block)
1114  {
1115  	point->entry_count++;
1116  	if (point->entry_count == entries_per_block) {
1117  		point->sequence_number++;
1118  		point->entry_count = 0;
1119  	}
1120  }
1121  
1122  /**
1123   * vdo_before_journal_point() - Check whether the first point precedes the second point.
1124   * @first: The first journal point.
1125   * @second: The second journal point.
1126   *
1127   * Return: true if the first point precedes the second point.
1128   */
vdo_before_journal_point(const struct journal_point * first,const struct journal_point * second)1129  static inline bool vdo_before_journal_point(const struct journal_point *first,
1130  					    const struct journal_point *second)
1131  {
1132  	return ((first->sequence_number < second->sequence_number) ||
1133  		((first->sequence_number == second->sequence_number) &&
1134  		 (first->entry_count < second->entry_count)));
1135  }
1136  
1137  /**
1138   * vdo_pack_journal_point() - Encode the journal location represented by a
1139   *                            journal_point into a packed_journal_point.
1140   * @unpacked: The unpacked input point.
1141   * @packed: The packed output point.
1142   */
vdo_pack_journal_point(const struct journal_point * unpacked,struct packed_journal_point * packed)1143  static inline void vdo_pack_journal_point(const struct journal_point *unpacked,
1144  					  struct packed_journal_point *packed)
1145  {
1146  	packed->encoded_point =
1147  		__cpu_to_le64((unpacked->sequence_number << 16) | unpacked->entry_count);
1148  }
1149  
1150  /**
1151   * vdo_unpack_journal_point() - Decode the journal location represented by a packed_journal_point
1152   *                              into a journal_point.
1153   * @packed: The packed input point.
1154   * @unpacked: The unpacked output point.
1155   */
vdo_unpack_journal_point(const struct packed_journal_point * packed,struct journal_point * unpacked)1156  static inline void vdo_unpack_journal_point(const struct packed_journal_point *packed,
1157  					    struct journal_point *unpacked)
1158  {
1159  	u64 native = __le64_to_cpu(packed->encoded_point);
1160  
1161  	unpacked->sequence_number = (native >> 16);
1162  	unpacked->entry_count = (native & 0xffff);
1163  }
1164  
1165  /**
1166   * vdo_pack_slab_journal_block_header() - Generate the packed representation of a slab block
1167   *                                        header.
1168   * @header: The header containing the values to encode.
1169   * @packed: The header into which to pack the values.
1170   */
1171  static inline void
vdo_pack_slab_journal_block_header(const struct slab_journal_block_header * header,struct packed_slab_journal_block_header * packed)1172  vdo_pack_slab_journal_block_header(const struct slab_journal_block_header *header,
1173  				   struct packed_slab_journal_block_header *packed)
1174  {
1175  	packed->head = __cpu_to_le64(header->head);
1176  	packed->sequence_number = __cpu_to_le64(header->sequence_number);
1177  	packed->nonce = __cpu_to_le64(header->nonce);
1178  	packed->entry_count = __cpu_to_le16(header->entry_count);
1179  	packed->metadata_type = header->metadata_type;
1180  	packed->has_block_map_increments = header->has_block_map_increments;
1181  
1182  	vdo_pack_journal_point(&header->recovery_point, &packed->recovery_point);
1183  }
1184  
1185  /**
1186   * vdo_unpack_slab_journal_block_header() - Decode the packed representation of a slab block
1187   *                                          header.
1188   * @packed: The packed header to decode.
1189   * @header: The header into which to unpack the values.
1190   */
1191  static inline void
vdo_unpack_slab_journal_block_header(const struct packed_slab_journal_block_header * packed,struct slab_journal_block_header * header)1192  vdo_unpack_slab_journal_block_header(const struct packed_slab_journal_block_header *packed,
1193  				     struct slab_journal_block_header *header)
1194  {
1195  	*header = (struct slab_journal_block_header) {
1196  		.head = __le64_to_cpu(packed->head),
1197  		.sequence_number = __le64_to_cpu(packed->sequence_number),
1198  		.nonce = __le64_to_cpu(packed->nonce),
1199  		.entry_count = __le16_to_cpu(packed->entry_count),
1200  		.metadata_type = packed->metadata_type,
1201  		.has_block_map_increments = packed->has_block_map_increments,
1202  	};
1203  	vdo_unpack_journal_point(&packed->recovery_point, &header->recovery_point);
1204  }
1205  
1206  /**
1207   * vdo_pack_slab_journal_entry() - Generate the packed encoding of a slab journal entry.
1208   * @packed: The entry into which to pack the values.
1209   * @sbn: The slab block number of the entry to encode.
1210   * @is_increment: The increment flag.
1211   */
vdo_pack_slab_journal_entry(packed_slab_journal_entry * packed,slab_block_number sbn,bool is_increment)1212  static inline void vdo_pack_slab_journal_entry(packed_slab_journal_entry *packed,
1213  					       slab_block_number sbn, bool is_increment)
1214  {
1215  	packed->offset_low8 = (sbn & 0x0000FF);
1216  	packed->offset_mid8 = (sbn & 0x00FF00) >> 8;
1217  	packed->offset_high7 = (sbn & 0x7F0000) >> 16;
1218  	packed->increment = is_increment ? 1 : 0;
1219  }
1220  
1221  /**
1222   * vdo_unpack_slab_journal_entry() - Decode the packed representation of a slab journal entry.
1223   * @packed: The packed entry to decode.
1224   *
1225   * Return: The decoded slab journal entry.
1226   */
1227  static inline struct slab_journal_entry __must_check
vdo_unpack_slab_journal_entry(const packed_slab_journal_entry * packed)1228  vdo_unpack_slab_journal_entry(const packed_slab_journal_entry *packed)
1229  {
1230  	struct slab_journal_entry entry;
1231  
1232  	entry.sbn = packed->offset_high7;
1233  	entry.sbn <<= 8;
1234  	entry.sbn |= packed->offset_mid8;
1235  	entry.sbn <<= 8;
1236  	entry.sbn |= packed->offset_low8;
1237  	entry.operation = VDO_JOURNAL_DATA_REMAPPING;
1238  	entry.increment = packed->increment;
1239  	return entry;
1240  }
1241  
1242  struct slab_journal_entry __must_check
1243  vdo_decode_slab_journal_entry(struct packed_slab_journal_block *block,
1244  			      journal_entry_count_t entry_count);
1245  
1246  /**
1247   * vdo_get_slab_summary_hint_shift() - Compute the shift for slab summary hints.
1248   * @slab_size_shift: Exponent for the number of blocks per slab.
1249   *
1250   * Return: The hint shift.
1251   */
vdo_get_slab_summary_hint_shift(unsigned int slab_size_shift)1252  static inline u8 __must_check vdo_get_slab_summary_hint_shift(unsigned int slab_size_shift)
1253  {
1254  	return ((slab_size_shift > VDO_SLAB_SUMMARY_FULLNESS_HINT_BITS) ?
1255  		(slab_size_shift - VDO_SLAB_SUMMARY_FULLNESS_HINT_BITS) :
1256  		0);
1257  }
1258  
1259  int __must_check vdo_initialize_layout(block_count_t size,
1260  				       physical_block_number_t offset,
1261  				       block_count_t block_map_blocks,
1262  				       block_count_t journal_blocks,
1263  				       block_count_t summary_blocks,
1264  				       struct layout *layout);
1265  
1266  void vdo_uninitialize_layout(struct layout *layout);
1267  
1268  int __must_check vdo_get_partition(struct layout *layout, enum partition_id id,
1269  				   struct partition **partition_ptr);
1270  
1271  struct partition * __must_check vdo_get_known_partition(struct layout *layout,
1272  							enum partition_id id);
1273  
1274  int vdo_validate_config(const struct vdo_config *config,
1275  			block_count_t physical_block_count,
1276  			block_count_t logical_block_count);
1277  
1278  void vdo_destroy_component_states(struct vdo_component_states *states);
1279  
1280  int __must_check vdo_decode_component_states(u8 *buffer,
1281  					     struct volume_geometry *geometry,
1282  					     struct vdo_component_states *states);
1283  
1284  int __must_check vdo_validate_component_states(struct vdo_component_states *states,
1285  					       nonce_t geometry_nonce,
1286  					       block_count_t physical_size,
1287  					       block_count_t logical_size);
1288  
1289  void vdo_encode_super_block(u8 *buffer, struct vdo_component_states *states);
1290  int __must_check vdo_decode_super_block(u8 *buffer);
1291  
1292  /* We start with 0L and postcondition with ~0L to match our historical usage in userspace. */
vdo_crc32(const void * buf,unsigned long len)1293  static inline u32 vdo_crc32(const void *buf, unsigned long len)
1294  {
1295  	return (crc32(0L, buf, len) ^ ~0L);
1296  }
1297  
1298  #endif /* VDO_ENCODINGS_H */
1299