Store table version in struct osl_table.
authorAndre Noll <maan@tuebingen.mpg.de>
Wed, 19 Apr 2017 13:05:53 +0000 (15:05 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Wed, 17 Jun 2020 20:30:31 +0000 (22:30 +0200)
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
osl.c
osl_core.h

diff --git a/fsck.c b/fsck.c
index f96f77c..8a32aba 100644 (file)
--- 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 (file)
--- 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;
index 9f31181..9879b1e 100644 (file)
@@ -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 */