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.
100 static const u8 LAYOUT_MAGIC[] = "*ALBIREO*SINGLE*FILE*LAYOUT*001*";
296 static int __must_check open_layout_reader(struct index_layout *layout, in open_layout_reader() argument
300 return uds_make_buffered_reader(layout->factory, lr->start_block + offset, in open_layout_reader()
304 static int open_region_reader(struct index_layout *layout, struct layout_region *region, in open_region_reader() argument
307 return open_layout_reader(layout, region, -layout->super.start_offset, in open_region_reader()
311 static int __must_check open_layout_writer(struct index_layout *layout, in open_layout_writer() argument
315 return uds_make_buffered_writer(layout->factory, lr->start_block + offset, in open_layout_writer()
319 static int open_region_writer(struct index_layout *layout, struct layout_region *region, in open_region_writer() argument
322 return open_layout_writer(layout, region, -layout->super.start_offset, in open_region_writer()
345 static void define_sub_index_nonce(struct index_layout *layout) in define_sub_index_nonce() argument
351 struct sub_index_layout *sil = &layout->index; in define_sub_index_nonce()
352 u64 primary_nonce = layout->super.nonce; in define_sub_index_nonce()
365 static void setup_sub_index(struct index_layout *layout, u64 start_block, in setup_sub_index() argument
368 struct sub_index_layout *sil = &layout->index; in setup_sub_index()
399 define_sub_index_nonce(layout); in setup_sub_index()
402 static void initialize_layout(struct index_layout *layout, struct save_layout_sizes *sls) in initialize_layout() argument
404 u64 next_block = layout->offset / sls->block_size; in initialize_layout()
406 layout->total_blocks = sls->total_blocks; in initialize_layout()
407 generate_super_block_data(sls, &layout->super); in initialize_layout()
408 layout->header = (struct layout_region) { in initialize_layout()
415 layout->config = (struct layout_region) { in initialize_layout()
422 setup_sub_index(layout, next_block, sls); in initialize_layout()
425 layout->seal = (struct layout_region) { in initialize_layout()
464 "layout region table for ISL", &table); in make_index_save_region_table()
549 static int write_index_save_layout(struct index_layout *layout, in write_index_save_layout() argument
560 result = open_region_writer(layout, &isl->header, &writer); in write_index_save_layout()
606 static int __must_check invalidate_old_save(struct index_layout *layout, in invalidate_old_save() argument
609 reset_index_save_layout(isl, layout->super.page_map_blocks); in invalidate_old_save()
610 return write_index_save_layout(layout, isl); in invalidate_old_save()
613 static int discard_index_state_data(struct index_layout *layout) in discard_index_state_data() argument
619 for (i = 0; i < layout->super.max_saves; i++) { in discard_index_state_data()
620 result = invalidate_old_save(layout, &layout->index.saves[i]); in discard_index_state_data()
634 static int __must_check make_layout_region_table(struct index_layout *layout, in make_layout_region_table() argument
640 u16 region_count = 5 + layout->super.max_saves; in make_layout_region_table()
646 struct layout_region, "layout region table", in make_layout_region_table()
652 *lr++ = layout->header; in make_layout_region_table()
653 *lr++ = layout->config; in make_layout_region_table()
654 *lr++ = layout->index.sub_index; in make_layout_region_table()
655 *lr++ = layout->index.volume; in make_layout_region_table()
657 for (i = 0; i < layout->super.max_saves; i++) in make_layout_region_table()
658 *lr++ = layout->index.saves[i].index_save; in make_layout_region_table()
660 *lr++ = layout->seal; in make_layout_region_table()
662 if (is_converted_super_block(&layout->super)) { in make_layout_region_table()
666 sizeof(layout->super.volume_offset) - in make_layout_region_table()
667 sizeof(layout->super.start_offset)); in make_layout_region_table()
672 .region_blocks = layout->total_blocks, in make_layout_region_table()
685 static int __must_check write_layout_header(struct index_layout *layout, in write_layout_header() argument
693 result = vdo_allocate(table->encoded_size, u8, "layout data", &buffer); in write_layout_header()
698 memcpy(buffer + offset, &layout->super.magic_label, MAGIC_SIZE); in write_layout_header()
700 memcpy(buffer + offset, &layout->super.nonce_info, NONCE_INFO_SIZE); in write_layout_header()
702 encode_u64_le(buffer, &offset, layout->super.nonce); in write_layout_header()
703 encode_u32_le(buffer, &offset, layout->super.version); in write_layout_header()
704 encode_u32_le(buffer, &offset, layout->super.block_size); in write_layout_header()
705 encode_u16_le(buffer, &offset, layout->super.index_count); in write_layout_header()
706 encode_u16_le(buffer, &offset, layout->super.max_saves); in write_layout_header()
708 encode_u64_le(buffer, &offset, layout->super.open_chapter_blocks); in write_layout_header()
709 encode_u64_le(buffer, &offset, layout->super.page_map_blocks); in write_layout_header()
711 if (is_converted_super_block(&layout->super)) { in write_layout_header()
712 encode_u64_le(buffer, &offset, layout->super.volume_offset); in write_layout_header()
713 encode_u64_le(buffer, &offset, layout->super.start_offset); in write_layout_header()
724 static int __must_check write_uds_index_config(struct index_layout *layout, in write_uds_index_config() argument
731 result = open_layout_writer(layout, &layout->config, offset, &writer); in write_uds_index_config()
735 result = uds_write_config_contents(writer, config, layout->super.version); in write_uds_index_config()
751 static int __must_check save_layout(struct index_layout *layout, off_t offset) in save_layout() argument
757 result = make_layout_region_table(layout, &table); in save_layout()
761 result = open_layout_writer(layout, &layout->header, offset, &writer); in save_layout()
767 result = write_layout_header(layout, table, writer); in save_layout()
774 static int create_index_layout(struct index_layout *layout, struct uds_configuration *config) in create_index_layout() argument
784 &layout->index.saves); in create_index_layout()
788 initialize_layout(layout, &sizes); in create_index_layout()
790 result = discard_index_state_data(layout); in create_index_layout()
794 result = write_uds_index_config(layout, config, 0); in create_index_layout()
798 return save_layout(layout, 0); in create_index_layout()
832 static int find_latest_uds_index_save_slot(struct index_layout *layout, in find_latest_uds_index_save_slot() argument
841 for (i = 0; i < layout->super.max_saves; i++) { in find_latest_uds_index_save_slot()
842 isl = &layout->index.saves[i]; in find_latest_uds_index_save_slot()
843 save_time = validate_index_save_layout(isl, layout->index.nonce); in find_latest_uds_index_save_slot()
859 int uds_discard_open_chapter(struct index_layout *layout) in uds_discard_open_chapter() argument
865 result = find_latest_uds_index_save_slot(layout, &isl); in uds_discard_open_chapter()
869 result = open_region_writer(layout, &isl->open_chapter, &writer); in uds_discard_open_chapter()
884 int uds_load_index_state(struct index_layout *layout, struct uds_index *index) in uds_load_index_state() argument
891 result = find_latest_uds_index_save_slot(layout, &isl); in uds_load_index_state()
899 result = open_region_reader(layout, &isl->open_chapter, &readers[0]); in uds_load_index_state()
909 result = open_region_reader(layout, &isl->volume_index_zones[zone], in uds_load_index_state()
925 result = open_region_reader(layout, &isl->index_page_map, &readers[0]); in uds_load_index_state()
935 static struct index_save_layout *select_oldest_index_save_layout(struct index_layout *layout) in select_oldest_index_save_layout() argument
943 for (i = 0; i < layout->super.max_saves; i++) { in select_oldest_index_save_layout()
944 isl = &layout->index.saves[i]; in select_oldest_index_save_layout()
945 save_time = validate_index_save_layout(isl, layout->index.nonce); in select_oldest_index_save_layout()
1019 static int setup_uds_index_save_slot(struct index_layout *layout, in setup_uds_index_save_slot() argument
1026 isl = select_oldest_index_save_layout(layout); in setup_uds_index_save_slot()
1027 result = invalidate_old_save(layout, isl); in setup_uds_index_save_slot()
1031 instantiate_index_save_layout(isl, &layout->super, layout->index.nonce, in setup_uds_index_save_slot()
1045 int uds_save_index_state(struct index_layout *layout, struct uds_index *index) in uds_save_index_state() argument
1052 result = setup_uds_index_save_slot(layout, index->zone_count, &isl); in uds_save_index_state()
1062 result = open_region_writer(layout, &isl->open_chapter, &writers[0]); in uds_save_index_state()
1076 result = open_region_writer(layout, &isl->volume_index_zones[zone], in uds_save_index_state()
1095 result = open_region_writer(layout, &isl->index_page_map, &writers[0]); in uds_save_index_state()
1108 return write_index_save_layout(layout, isl); in uds_save_index_state()
1143 "single file layout region table", &table); in load_region_table()
1172 struct index_layout *layout, in read_super_block_data() argument
1176 struct super_block_data *super = &layout->super; in read_super_block_data()
1232 /* Sub-indexes are no longer used but the layout retains this field. */ in read_super_block_data()
1252 "incorrect layout region offset"); in verify_region()
1256 "incorrect layout region kind"); in verify_region()
1260 "incorrect layout region instance"); in verify_region()
1266 static int __must_check verify_sub_index(struct index_layout *layout, u64 start_block, in verify_sub_index() argument
1271 struct sub_index_layout *sil = &layout->index; in verify_sub_index()
1279 define_sub_index_nonce(layout); in verify_sub_index()
1287 next_block += sil->volume.block_count + layout->super.volume_offset; in verify_sub_index()
1289 for (i = 0; i < layout->super.max_saves; i++) { in verify_sub_index()
1299 next_block -= layout->super.volume_offset; in verify_sub_index()
1308 static int __must_check reconstitute_layout(struct index_layout *layout, in reconstitute_layout() argument
1314 result = vdo_allocate(layout->super.max_saves, struct index_save_layout, in reconstitute_layout()
1315 __func__, &layout->index.saves); in reconstitute_layout()
1319 layout->total_blocks = table->header.region_blocks; in reconstitute_layout()
1321 layout->header = table->regions[0]; in reconstitute_layout()
1322 result = verify_region(&layout->header, next_block++, RL_KIND_HEADER, in reconstitute_layout()
1327 layout->config = table->regions[1]; in reconstitute_layout()
1328 result = verify_region(&layout->config, next_block++, RL_KIND_CONFIG, in reconstitute_layout()
1333 result = verify_sub_index(layout, next_block, table); in reconstitute_layout()
1337 next_block += layout->index.sub_index.block_count; in reconstitute_layout()
1339 layout->seal = table->regions[table->header.region_count - 1]; in reconstitute_layout()
1340 result = verify_region(&layout->seal, next_block + layout->super.volume_offset, in reconstitute_layout()
1345 if (++next_block != (first_block + layout->total_blocks)) { in reconstitute_layout()
1347 "layout table does not span total blocks"); in reconstitute_layout()
1353 static int __must_check load_super_block(struct index_layout *layout, size_t block_size, in load_super_block() argument
1358 struct super_block_data *super = &layout->super; in load_super_block()
1370 result = read_super_block_data(reader, layout, table->header.payload); in load_super_block()
1384 result = reconstitute_layout(layout, table, first_block); in load_super_block()
1502 "index save layout table incomplete"); in reconstruct_index_save()
1564 static int __must_check load_sub_index_regions(struct index_layout *layout) in load_sub_index_regions() argument
1571 for (j = 0; j < layout->super.max_saves; j++) { in load_sub_index_regions()
1572 isl = &layout->index.saves[j]; in load_sub_index_regions()
1573 result = open_region_reader(layout, &isl->index_save, &reader); in load_sub_index_regions()
1594 static int __must_check verify_uds_index_config(struct index_layout *layout, in verify_uds_index_config() argument
1601 offset = layout->super.volume_offset - layout->super.start_offset; in verify_uds_index_config()
1602 result = open_layout_reader(layout, &layout->config, offset, &reader); in verify_uds_index_config()
1616 static int load_index_layout(struct index_layout *layout, struct uds_configuration *config) in load_index_layout() argument
1621 result = uds_make_buffered_reader(layout->factory, in load_index_layout()
1622 layout->offset / UDS_BLOCK_SIZE, 1, &reader); in load_index_layout()
1626 result = load_super_block(layout, UDS_BLOCK_SIZE, in load_index_layout()
1627 layout->offset / UDS_BLOCK_SIZE, reader); in load_index_layout()
1632 result = verify_uds_index_config(layout, config); in load_index_layout()
1636 return load_sub_index_regions(layout); in load_index_layout()
1639 static int create_layout_factory(struct index_layout *layout, in create_layout_factory() argument
1658 layout->factory = factory; in create_layout_factory()
1659 layout->factory_size = (config->size > 0) ? config->size : writable_size; in create_layout_factory()
1660 layout->offset = config->offset; in create_layout_factory()
1668 struct index_layout *layout = NULL; in uds_make_index_layout() local
1675 result = vdo_allocate(1, struct index_layout, __func__, &layout); in uds_make_index_layout()
1679 result = create_layout_factory(layout, config); in uds_make_index_layout()
1681 uds_free_index_layout(layout); in uds_make_index_layout()
1685 if (layout->factory_size < sizes.total_size) { in uds_make_index_layout()
1687 layout->factory_size, in uds_make_index_layout()
1689 uds_free_index_layout(layout); in uds_make_index_layout()
1694 result = create_index_layout(layout, config); in uds_make_index_layout()
1696 result = load_index_layout(layout, config); in uds_make_index_layout()
1698 uds_free_index_layout(layout); in uds_make_index_layout()
1702 *layout_ptr = layout; in uds_make_index_layout()
1706 void uds_free_index_layout(struct index_layout *layout) in uds_free_index_layout() argument
1708 if (layout == NULL) in uds_free_index_layout()
1711 vdo_free(layout->index.saves); in uds_free_index_layout()
1712 if (layout->factory != NULL) in uds_free_index_layout()
1713 uds_put_io_factory(layout->factory); in uds_free_index_layout()
1715 vdo_free(layout); in uds_free_index_layout()
1718 int uds_replace_index_layout_storage(struct index_layout *layout, in uds_replace_index_layout_storage() argument
1721 return uds_replace_storage(layout->factory, bdev); in uds_replace_index_layout_storage()
1725 int uds_open_volume_bufio(struct index_layout *layout, size_t block_size, in uds_open_volume_bufio() argument
1729 off_t offset = (layout->index.volume.start_block + in uds_open_volume_bufio()
1730 layout->super.volume_offset - in uds_open_volume_bufio()
1731 layout->super.start_offset); in uds_open_volume_bufio()
1733 return uds_make_bufio(layout->factory, offset, block_size, reserved_buffers, in uds_open_volume_bufio()
1737 u64 uds_get_volume_nonce(struct index_layout *layout) in uds_get_volume_nonce() argument
1739 return layout->index.nonce; in uds_get_volume_nonce()