Lines Matching full:layout
6 #include "index-layout.h"
21 * The UDS layout on storage media is divided into a number of fixed-size regions, the sizes of
40 * The header contains the encoded region layout table as well as some index configuration data.
53 * The header contains the encoded region layout table as well as index state data for that save.
101 static const u8 LAYOUT_MAGIC[MAGIC_SIZE] = "*ALBIREO*SINGLE*FILE*LAYOUT*001*";
295 static int __must_check open_layout_reader(struct index_layout *layout, in open_layout_reader() argument
299 return uds_make_buffered_reader(layout->factory, lr->start_block + offset, in open_layout_reader()
303 static int open_region_reader(struct index_layout *layout, struct layout_region *region, in open_region_reader() argument
306 return open_layout_reader(layout, region, -layout->super.start_offset, in open_region_reader()
310 static int __must_check open_layout_writer(struct index_layout *layout, in open_layout_writer() argument
314 return uds_make_buffered_writer(layout->factory, lr->start_block + offset, in open_layout_writer()
318 static int open_region_writer(struct index_layout *layout, struct layout_region *region, in open_region_writer() argument
321 return open_layout_writer(layout, region, -layout->super.start_offset, in open_region_writer()
344 static void define_sub_index_nonce(struct index_layout *layout) in define_sub_index_nonce() argument
350 struct sub_index_layout *sil = &layout->index; in define_sub_index_nonce()
351 u64 primary_nonce = layout->super.nonce; in define_sub_index_nonce()
364 static void setup_sub_index(struct index_layout *layout, u64 start_block, in setup_sub_index() argument
367 struct sub_index_layout *sil = &layout->index; in setup_sub_index()
398 define_sub_index_nonce(layout); in setup_sub_index()
401 static void initialize_layout(struct index_layout *layout, struct save_layout_sizes *sls) in initialize_layout() argument
403 u64 next_block = layout->offset / sls->block_size; in initialize_layout()
405 layout->total_blocks = sls->total_blocks; in initialize_layout()
406 generate_super_block_data(sls, &layout->super); in initialize_layout()
407 layout->header = (struct layout_region) { in initialize_layout()
414 layout->config = (struct layout_region) { in initialize_layout()
421 setup_sub_index(layout, next_block, sls); in initialize_layout()
424 layout->seal = (struct layout_region) { in initialize_layout()
463 "layout region table for ISL", &table); in make_index_save_region_table()
548 static int write_index_save_layout(struct index_layout *layout, in write_index_save_layout() argument
559 result = open_region_writer(layout, &isl->header, &writer); in write_index_save_layout()
605 static int __must_check invalidate_old_save(struct index_layout *layout, in invalidate_old_save() argument
608 reset_index_save_layout(isl, layout->super.page_map_blocks); in invalidate_old_save()
609 return write_index_save_layout(layout, isl); in invalidate_old_save()
612 static int discard_index_state_data(struct index_layout *layout) in discard_index_state_data() argument
618 for (i = 0; i < layout->super.max_saves; i++) { in discard_index_state_data()
619 result = invalidate_old_save(layout, &layout->index.saves[i]); in discard_index_state_data()
633 static int __must_check make_layout_region_table(struct index_layout *layout, in make_layout_region_table() argument
639 u16 region_count = 5 + layout->super.max_saves; in make_layout_region_table()
645 struct layout_region, "layout region table", in make_layout_region_table()
651 *lr++ = layout->header; in make_layout_region_table()
652 *lr++ = layout->config; in make_layout_region_table()
653 *lr++ = layout->index.sub_index; in make_layout_region_table()
654 *lr++ = layout->index.volume; in make_layout_region_table()
656 for (i = 0; i < layout->super.max_saves; i++) in make_layout_region_table()
657 *lr++ = layout->index.saves[i].index_save; in make_layout_region_table()
659 *lr++ = layout->seal; in make_layout_region_table()
661 if (is_converted_super_block(&layout->super)) { in make_layout_region_table()
665 sizeof(layout->super.volume_offset) - in make_layout_region_table()
666 sizeof(layout->super.start_offset)); in make_layout_region_table()
671 .region_blocks = layout->total_blocks, in make_layout_region_table()
684 static int __must_check write_layout_header(struct index_layout *layout, in write_layout_header() argument
692 result = vdo_allocate(table->encoded_size, u8, "layout data", &buffer); in write_layout_header()
697 memcpy(buffer + offset, &layout->super.magic_label, MAGIC_SIZE); in write_layout_header()
699 memcpy(buffer + offset, &layout->super.nonce_info, NONCE_INFO_SIZE); in write_layout_header()
701 encode_u64_le(buffer, &offset, layout->super.nonce); in write_layout_header()
702 encode_u32_le(buffer, &offset, layout->super.version); in write_layout_header()
703 encode_u32_le(buffer, &offset, layout->super.block_size); in write_layout_header()
704 encode_u16_le(buffer, &offset, layout->super.index_count); in write_layout_header()
705 encode_u16_le(buffer, &offset, layout->super.max_saves); in write_layout_header()
707 encode_u64_le(buffer, &offset, layout->super.open_chapter_blocks); in write_layout_header()
708 encode_u64_le(buffer, &offset, layout->super.page_map_blocks); in write_layout_header()
710 if (is_converted_super_block(&layout->super)) { in write_layout_header()
711 encode_u64_le(buffer, &offset, layout->super.volume_offset); in write_layout_header()
712 encode_u64_le(buffer, &offset, layout->super.start_offset); in write_layout_header()
723 static int __must_check write_uds_index_config(struct index_layout *layout, in write_uds_index_config() argument
730 result = open_layout_writer(layout, &layout->config, offset, &writer); in write_uds_index_config()
734 result = uds_write_config_contents(writer, config, layout->super.version); in write_uds_index_config()
750 static int __must_check save_layout(struct index_layout *layout, off_t offset) in save_layout() argument
756 result = make_layout_region_table(layout, &table); in save_layout()
760 result = open_layout_writer(layout, &layout->header, offset, &writer); in save_layout()
766 result = write_layout_header(layout, table, writer); in save_layout()
773 static int create_index_layout(struct index_layout *layout, struct uds_configuration *config) in create_index_layout() argument
783 &layout->index.saves); in create_index_layout()
787 initialize_layout(layout, &sizes); in create_index_layout()
789 result = discard_index_state_data(layout); in create_index_layout()
793 result = write_uds_index_config(layout, config, 0); in create_index_layout()
797 return save_layout(layout, 0); in create_index_layout()
831 static int find_latest_uds_index_save_slot(struct index_layout *layout, in find_latest_uds_index_save_slot() argument
840 for (i = 0; i < layout->super.max_saves; i++) { in find_latest_uds_index_save_slot()
841 isl = &layout->index.saves[i]; in find_latest_uds_index_save_slot()
842 save_time = validate_index_save_layout(isl, layout->index.nonce); in find_latest_uds_index_save_slot()
858 int uds_discard_open_chapter(struct index_layout *layout) in uds_discard_open_chapter() argument
864 result = find_latest_uds_index_save_slot(layout, &isl); in uds_discard_open_chapter()
868 result = open_region_writer(layout, &isl->open_chapter, &writer); in uds_discard_open_chapter()
883 int uds_load_index_state(struct index_layout *layout, struct uds_index *index) in uds_load_index_state() argument
890 result = find_latest_uds_index_save_slot(layout, &isl); in uds_load_index_state()
898 result = open_region_reader(layout, &isl->open_chapter, &readers[0]); in uds_load_index_state()
908 result = open_region_reader(layout, &isl->volume_index_zones[zone], in uds_load_index_state()
924 result = open_region_reader(layout, &isl->index_page_map, &readers[0]); in uds_load_index_state()
934 static struct index_save_layout *select_oldest_index_save_layout(struct index_layout *layout) in select_oldest_index_save_layout() argument
942 for (i = 0; i < layout->super.max_saves; i++) { in select_oldest_index_save_layout()
943 isl = &layout->index.saves[i]; in select_oldest_index_save_layout()
944 save_time = validate_index_save_layout(isl, layout->index.nonce); in select_oldest_index_save_layout()
1018 static int setup_uds_index_save_slot(struct index_layout *layout, in setup_uds_index_save_slot() argument
1025 isl = select_oldest_index_save_layout(layout); in setup_uds_index_save_slot()
1026 result = invalidate_old_save(layout, isl); in setup_uds_index_save_slot()
1030 instantiate_index_save_layout(isl, &layout->super, layout->index.nonce, in setup_uds_index_save_slot()
1044 int uds_save_index_state(struct index_layout *layout, struct uds_index *index) in uds_save_index_state() argument
1051 result = setup_uds_index_save_slot(layout, index->zone_count, &isl); in uds_save_index_state()
1061 result = open_region_writer(layout, &isl->open_chapter, &writers[0]); in uds_save_index_state()
1075 result = open_region_writer(layout, &isl->volume_index_zones[zone], in uds_save_index_state()
1094 result = open_region_writer(layout, &isl->index_page_map, &writers[0]); in uds_save_index_state()
1107 return write_index_save_layout(layout, isl); in uds_save_index_state()
1142 "single file layout region table", &table); in load_region_table()
1171 struct index_layout *layout, in read_super_block_data() argument
1175 struct super_block_data *super = &layout->super; in read_super_block_data()
1231 /* Sub-indexes are no longer used but the layout retains this field. */ in read_super_block_data()
1251 "incorrect layout region offset"); in verify_region()
1255 "incorrect layout region kind"); in verify_region()
1259 "incorrect layout region instance"); in verify_region()
1265 static int __must_check verify_sub_index(struct index_layout *layout, u64 start_block, in verify_sub_index() argument
1270 struct sub_index_layout *sil = &layout->index; in verify_sub_index()
1278 define_sub_index_nonce(layout); in verify_sub_index()
1286 next_block += sil->volume.block_count + layout->super.volume_offset; in verify_sub_index()
1288 for (i = 0; i < layout->super.max_saves; i++) { in verify_sub_index()
1298 next_block -= layout->super.volume_offset; in verify_sub_index()
1307 static int __must_check reconstitute_layout(struct index_layout *layout, in reconstitute_layout() argument
1313 result = vdo_allocate(layout->super.max_saves, struct index_save_layout, in reconstitute_layout()
1314 __func__, &layout->index.saves); in reconstitute_layout()
1318 layout->total_blocks = table->header.region_blocks; in reconstitute_layout()
1320 layout->header = table->regions[0]; in reconstitute_layout()
1321 result = verify_region(&layout->header, next_block++, RL_KIND_HEADER, in reconstitute_layout()
1326 layout->config = table->regions[1]; in reconstitute_layout()
1327 result = verify_region(&layout->config, next_block++, RL_KIND_CONFIG, in reconstitute_layout()
1332 result = verify_sub_index(layout, next_block, table); in reconstitute_layout()
1336 next_block += layout->index.sub_index.block_count; in reconstitute_layout()
1338 layout->seal = table->regions[table->header.region_count - 1]; in reconstitute_layout()
1339 result = verify_region(&layout->seal, next_block + layout->super.volume_offset, in reconstitute_layout()
1344 if (++next_block != (first_block + layout->total_blocks)) { in reconstitute_layout()
1346 "layout table does not span total blocks"); in reconstitute_layout()
1352 static int __must_check load_super_block(struct index_layout *layout, size_t block_size, in load_super_block() argument
1357 struct super_block_data *super = &layout->super; in load_super_block()
1369 result = read_super_block_data(reader, layout, table->header.payload); in load_super_block()
1383 result = reconstitute_layout(layout, table, first_block); in load_super_block()
1501 "index save layout table incomplete"); in reconstruct_index_save()
1563 static int __must_check load_sub_index_regions(struct index_layout *layout) in load_sub_index_regions() argument
1570 for (j = 0; j < layout->super.max_saves; j++) { in load_sub_index_regions()
1571 isl = &layout->index.saves[j]; in load_sub_index_regions()
1572 result = open_region_reader(layout, &isl->index_save, &reader); in load_sub_index_regions()
1593 static int __must_check verify_uds_index_config(struct index_layout *layout, in verify_uds_index_config() argument
1600 offset = layout->super.volume_offset - layout->super.start_offset; in verify_uds_index_config()
1601 result = open_layout_reader(layout, &layout->config, offset, &reader); in verify_uds_index_config()
1615 static int load_index_layout(struct index_layout *layout, struct uds_configuration *config) in load_index_layout() argument
1620 result = uds_make_buffered_reader(layout->factory, in load_index_layout()
1621 layout->offset / UDS_BLOCK_SIZE, 1, &reader); in load_index_layout()
1625 result = load_super_block(layout, UDS_BLOCK_SIZE, in load_index_layout()
1626 layout->offset / UDS_BLOCK_SIZE, reader); in load_index_layout()
1631 result = verify_uds_index_config(layout, config); in load_index_layout()
1635 return load_sub_index_regions(layout); in load_index_layout()
1638 static int create_layout_factory(struct index_layout *layout, in create_layout_factory() argument
1657 layout->factory = factory; in create_layout_factory()
1658 layout->factory_size = (config->size > 0) ? config->size : writable_size; in create_layout_factory()
1659 layout->offset = config->offset; in create_layout_factory()
1667 struct index_layout *layout = NULL; in uds_make_index_layout() local
1674 result = vdo_allocate(1, struct index_layout, __func__, &layout); in uds_make_index_layout()
1678 result = create_layout_factory(layout, config); in uds_make_index_layout()
1680 uds_free_index_layout(layout); in uds_make_index_layout()
1684 if (layout->factory_size < sizes.total_size) { in uds_make_index_layout()
1686 layout->factory_size, in uds_make_index_layout()
1688 uds_free_index_layout(layout); in uds_make_index_layout()
1693 result = create_index_layout(layout, config); in uds_make_index_layout()
1695 result = load_index_layout(layout, config); in uds_make_index_layout()
1697 uds_free_index_layout(layout); in uds_make_index_layout()
1701 *layout_ptr = layout; in uds_make_index_layout()
1705 void uds_free_index_layout(struct index_layout *layout) in uds_free_index_layout() argument
1707 if (layout == NULL) in uds_free_index_layout()
1710 vdo_free(layout->index.saves); in uds_free_index_layout()
1711 if (layout->factory != NULL) in uds_free_index_layout()
1712 uds_put_io_factory(layout->factory); in uds_free_index_layout()
1714 vdo_free(layout); in uds_free_index_layout()
1717 int uds_replace_index_layout_storage(struct index_layout *layout, in uds_replace_index_layout_storage() argument
1720 return uds_replace_storage(layout->factory, bdev); in uds_replace_index_layout_storage()
1724 int uds_open_volume_bufio(struct index_layout *layout, size_t block_size, in uds_open_volume_bufio() argument
1728 off_t offset = (layout->index.volume.start_block + in uds_open_volume_bufio()
1729 layout->super.volume_offset - in uds_open_volume_bufio()
1730 layout->super.start_offset); in uds_open_volume_bufio()
1732 return uds_make_bufio(layout->factory, offset, block_size, reserved_buffers, in uds_open_volume_bufio()
1736 u64 uds_get_volume_nonce(struct index_layout *layout) in uds_get_volume_nonce() argument
1738 return layout->index.nonce; in uds_get_volume_nonce()