From 53ef87d70bcddd1678edaeeeb5f4e0b0cb55c843 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Wed, 19 Apr 2017 15:05:53 +0200 Subject: [PATCH 1/1] Store table version in struct osl_table. This modifies read_table_desc() to return the table version read from the index header. The returned version number is stored in the newly added field of struct osl_table. This will allow us to choose a hash function based on the version. --- fsck.c | 6 ++++-- osl.c | 10 ++++++---- osl_core.h | 7 +++++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/fsck.c b/fsck.c index f96f77c..8a32aba 100644 --- a/fsck.c +++ b/fsck.c @@ -872,21 +872,23 @@ static void set_dummy_contents(struct osl_table_description *desc) static int fsck_init(struct osl_table_description *desc, struct osl_table **t) { struct osl_object map; - int ret = map_index(desc, &map); + int version, ret = map_index(desc, &map); if (ret < 0) goto out; - ret = read_table_desc(&map, desc); + ret = read_table_desc(&map, desc); /* checks table version */ if (ret < 0) { osl_munmap(map.data, map.size); goto out; } + version = ret; set_dummy_contents(desc); ret = init_table_structure(desc, t); if (ret < 0) { osl_munmap(map.data, map.size); goto out; } + (*t)->version = version; DEBUG_LOG("unmapping index\n"); osl_munmap(map.data, map.size); if (OPT_GIVEN(FORCE)) diff --git a/osl.c b/osl.c index b9c2339..40b0a24 100644 --- a/osl.c +++ b/osl.c @@ -340,7 +340,7 @@ err: * Read the index header, check for the osl magic string and the table version * number. Read all information stored in the index header into \a desc. * - * \return Standard. + * \return The on-disk table version number on success, negative on errors. * * \sa struct osl_table_description, osl_create_table. */ @@ -406,7 +406,7 @@ int read_table_desc(struct osl_object *map, struct osl_table_description *desc) offset, header_size); goto err; } - return 1; + return table_version; err: FOR_EACH_COLUMN(i, desc, cd) free(cd->name); @@ -427,6 +427,7 @@ static int compare_table_descriptions(struct osl_table *t) ret = read_table_desc(&t->index_map, &desc); if (ret < 0) return ret; + t->version = ret; ret = -E_OSL_BAD_TABLE_FLAGS; if (desc.flags != t->desc->flags) goto out; @@ -496,7 +497,7 @@ static int create_table_index(struct osl_table *t) sprintf(buf + IDX_OSL_MAGIC, "%s", OSL_MAGIC); write_u8(buf + IDX_TABLE_FLAGS, t->desc->flags); write_u8(buf + IDX_DIRTY_FLAG, 0); - write_u8(buf + IDX_VERSION, CURRENT_TABLE_VERSION); + write_u8(buf + IDX_VERSION, t->version); write_u16(buf + IDX_NUM_COLUMNS, t->num_mapped_columns + t->num_disk_storage_columns); write_u16(buf + IDX_HEADER_SIZE, t->index_header_size); offset = IDX_COLUMN_DESCRIPTIONS; @@ -534,7 +535,8 @@ __export int osl_create_table(const struct osl_table_description *desc) if (ret < 0) return ret; - INFO_LOG("creating %s\n", desc->name); + t->version = CURRENT_TABLE_VERSION; + INFO_LOG("creating version %u table %s\n", t->version, desc->name); FOR_EACH_COLUMN(i, t->desc, cd) { if (cd->storage_type == OSL_NO_STORAGE) continue; diff --git a/osl_core.h b/osl_core.h index 9f31181..9879b1e 100644 --- a/osl_core.h +++ b/osl_core.h @@ -38,6 +38,13 @@ struct osl_column { struct osl_table { /** Pointer to the table description */ const struct osl_table_description *desc; + /** + * The CURRENT_TABLE_VERSION value of the library which created the + * table. This value is stored in the index header at table creation + * time. When the table is opened, the field is initialized from the + * on-disk value. + */ + uint8_t version; /** The size of the index header of this table. */ uint16_t index_header_size; /** Contains the mapping of the table's index file */ -- 2.39.2