diff options
Diffstat (limited to 'src/H5Fsuper.c')
-rw-r--r-- | src/H5Fsuper.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/H5Fsuper.c b/src/H5Fsuper.c index 70e0954..8040554 100644 --- a/src/H5Fsuper.c +++ b/src/H5Fsuper.c @@ -560,7 +560,8 @@ H5F_super_read(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc) * Tell the file driver how much address space has already been * allocated so that it knows how to allocate additional memory. */ - if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, stored_eoa) < 0) + /* (Account for the stored EOA being absolute offset -NAF) */ + if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, stored_eoa - H5F_BASE_ADDR(f)) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to set end-of-address marker for file") /* Read the file's superblock extension, if there is one. */ @@ -934,7 +935,15 @@ H5F_super_write(H5F_t *f, hid_t dxpl_id) /* Encode the driver information block. */ H5_ASSIGN_OVERFLOW(driver_size, H5FD_sb_size(f->shared->lf), hsize_t, size_t); - if(driver_size > 0) { + + /* Checking whether driver block address is defined here is to handle backward + * compatibility. If the file was created with v1.6 library or earlier and no + * driver info block was written in the superblock, we don't write it either even + * though there's some driver info. Otherwise, the driver block extended will + * overwrite the (meta)data right after the superblock. This situation happens to + * the family driver particularly. SLU - 2009/3/24 + */ + if(driver_size > 0 && H5F_addr_defined(f->shared->driver_addr)) { char driver_name[9]; /* Name of driver, for driver info block */ uint8_t *dbuf = p; /* Pointer to beginning of driver info */ |