X-Git-Url: http://git.tuebingen.mpg.de/?p=osl.git;a=blobdiff_plain;f=osl.c;h=90601dc287e3b8ec3de7baf7b9d1c6f2862e1c72;hp=430d120fb3a286f61e1eb2a8ab3c2912d6652206;hb=ff1143ae3ce5886309483fae6ac5237ee2802fb0;hpb=c9d2589c6764a308142afd17e92cef630c7fe940 diff --git a/osl.c b/osl.c index 430d120..90601dc 100644 --- a/osl.c +++ b/osl.c @@ -341,7 +341,7 @@ err: int read_table_desc(struct osl_object *map, struct osl_table_description *desc) { char *buf = map->data; - uint8_t version; + uint8_t version, compat_version, create_version; uint16_t header_size; int ret, i; unsigned offset; @@ -352,7 +352,19 @@ int read_table_desc(struct osl_object *map, struct osl_table_description *desc) if (strncmp(buf + IDX_OSL_MAGIC, OSL_MAGIC, strlen(OSL_MAGIC))) return -E_OSL_NO_MAGIC; version = read_u8(buf + IDX_VERSION); - if (version < MIN_TABLE_VERSION || version > MAX_TABLE_VERSION) + /* + * The on-disk version consists of two version numbers: the + * create_version (low 4 bits) is the CURRENT_TABLE_VERSION version + * number of the library that created the table, and compat_version + * (high 4 bits) tells us the lowest version of the library that can + * still read this table. + */ + create_version = version & 0xf; + compat_version = version >> 4; + INFO_LOG("create_version: %u, compat_version: %u\n", create_version, + compat_version); + if (create_version < MIN_TABLE_VERSION /* table too old */ + || compat_version > CURRENT_TABLE_VERSION) /* libosl too old */ return -E_OSL_VERSION_MISMATCH; desc->flags = read_u8(buf + IDX_TABLE_FLAGS); desc->num_columns = read_u16(buf + IDX_NUM_COLUMNS); @@ -487,7 +499,8 @@ 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, CURRENT_TABLE_VERSION + + (COMPAT_TABLE_VERSION << 4)); 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;