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))
* 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.
*/
offset, header_size);
goto err;
}
- return 1;
+ return table_version;
err:
FOR_EACH_COLUMN(i, desc, cd)
free(cd->name);
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;
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;
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;
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 */