X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=osl.c;h=90601dc287e3b8ec3de7baf7b9d1c6f2862e1c72;hb=f3474d8b7d50ca0fd437521f6cbd1febdacb056f;hp=5a0dde80ea6eb623172caa2f538834cf12b0a01b;hpb=2dba3a38dcfe721842404f01e9b2adb59c302604;p=osl.git diff --git a/osl.c b/osl.c index 5a0dde8..90601dc 100644 --- a/osl.c +++ b/osl.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2008 Andre Noll + * Copyright (C) 2007-2009 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -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;