summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2003-07-16 14:56:58 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2003-07-16 14:56:58 (GMT)
commite9cc951e034865fb1f2e9dc0385ed34072675bba (patch)
treecac0264cea02f3a795d27189dfd6570b2184f119 /src
parent046a2e6c0a78ece5ad464af8c506c6ba776eec1d (diff)
downloadhdf5-e9cc951e034865fb1f2e9dc0385ed34072675bba.zip
hdf5-e9cc951e034865fb1f2e9dc0385ed34072675bba.tar.gz
hdf5-e9cc951e034865fb1f2e9dc0385ed34072675bba.tar.bz2
[svn-r7232] Purpose:
Bug fix Description: When a non-default indexed storage B-tree internal 'K' value is set by the user, the chunked datasets created in that file (until it is closed) use the user's 'K' value and the data can be accessed correctly, but the 'K' value is not stored in the file. However, once the file is closed and re-opened, the non-default 'K' value is lost and the data in the chunked datasets will not be able to be accessed correctly. Solution: Store the indexed storage B-tree internal 'K' value in the superblock. Platforms tested: FreeBSD 4.8 (sleipnir) h5committest
Diffstat (limited to 'src')
-rw-r--r--src/H5Bpublic.h3
-rw-r--r--src/H5F.c160
-rw-r--r--src/H5Fdbg.c4
-rw-r--r--src/H5Fpkg.h11
-rw-r--r--src/H5Fprivate.h12
-rw-r--r--src/H5Pfcpl.c12
-rw-r--r--src/H5private.h12
7 files changed, 131 insertions, 83 deletions
diff --git a/src/H5Bpublic.h b/src/H5Bpublic.h
index 8d2ec6c..26bac99 100644
--- a/src/H5Bpublic.h
+++ b/src/H5Bpublic.h
@@ -32,6 +32,9 @@
/* B-tree IDs for various internal things. */
/* Not really a "public" symbol, but that should be OK -QAK */
+/* Note - if more of these are added, any 'K' values (for internal or leaf
+ * nodes) they use will need to be stored in the file somewhere. -QAK
+ */
typedef enum H5B_subid_t {
H5B_SNODE_ID = 0, /*B-tree is for symbol table nodes */
H5B_ISTORE_ID = 1, /*B-tree is for indexed object storage */
diff --git a/src/H5F.c b/src/H5F.c
index 20c9dec..4ec90a9 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -177,7 +177,7 @@ H5F_init_interface(void)
* - Default value for 1/2 rank for btree internal nodes
* - Default value for byte number in an address
* - Default value for byte number for object size
- * - Default value for version number of bootblock
+ * - Default value for version number of superblock
* - Default value for free-space version number
* - Default value for object directory version number
* - Default value for share-header format version
@@ -188,7 +188,7 @@ H5F_init_interface(void)
unsigned btree_k[H5B_NUM_BTREE_ID] = H5F_CRT_BTREE_RANK_DEF;
size_t sizeof_addr = H5F_CRT_ADDR_BYTE_NUM_DEF;
size_t sizeof_size = H5F_CRT_OBJ_BYTE_NUM_DEF;
- int bootblock_ver = H5F_CRT_BOOT_VERS_DEF;
+ int superblock_ver = H5F_CRT_SUPER_VERS_DEF;
int freespace_ver = H5F_CRT_FREESPACE_VERS_DEF;
int objectdir_ver = H5F_CRT_OBJ_DIR_VERS_DEF;
int sharedheader_ver = H5F_CRT_SHARE_HEAD_VERS_DEF;
@@ -287,8 +287,8 @@ H5F_init_interface(void)
if(H5P_register(crt_pclass,H5F_CRT_OBJ_BYTE_NUM_NAME, H5F_CRT_OBJ_BYTE_NUM_SIZE,&sizeof_size,NULL,NULL,NULL,NULL,NULL, NULL)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
- /* Register the bootblock version number */
- if(H5P_register(crt_pclass,H5F_CRT_BOOT_VERS_NAME,H5F_CRT_BOOT_VERS_SIZE, &bootblock_ver,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+ /* Register the superblock version number */
+ if(H5P_register(crt_pclass,H5F_CRT_SUPER_VERS_NAME,H5F_CRT_SUPER_VERS_SIZE, &superblock_ver,NULL,NULL,NULL,NULL,NULL,NULL)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class");
/* Register the free-space version number */
@@ -1348,7 +1348,7 @@ H5F_equal(void *_haystack, hid_t UNUSED id, void *_needle)
/*-------------------------------------------------------------------------
* Function: H5F_locate_signature
*
- * Purpose: Finds the HDF5 boot block signature in a file. The signature
+ * Purpose: Finds the HDF5 super block signature in a file. The signature
* can appear at address 0, or any power of two beginning with
* 512.
*
@@ -1507,7 +1507,7 @@ H5F_new(H5F_file_t *shared, hid_t fcpl_id, hid_t fapl_id)
f->shared = shared;
} else {
f->shared = H5FL_CALLOC(H5F_file_t);
- f->shared->boot_addr = HADDR_UNDEF;
+ f->shared->super_addr = HADDR_UNDEF;
f->shared->base_addr = HADDR_UNDEF;
f->shared->freespace_addr = HADDR_UNDEF;
f->shared->driver_addr = HADDR_UNDEF;
@@ -1528,6 +1528,22 @@ H5F_new(H5F_file_t *shared, hid_t fcpl_id, hid_t fapl_id)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get byte number for object size");
if(H5P_get(plist, H5F_CRT_SYM_LEAF_NAME, &f->shared->sym_leaf_k)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get byte number for object size");
+ if(H5P_get(plist, H5F_CRT_BTREE_RANK_NAME, &f->shared->btree_k[0])<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "unable to get rank for btree internal nodes");
+
+ /* Check for non-default indexed storage B-tree internal 'K' value
+ * and increment the version # of the superblock if it is a non-default
+ * value.
+ */
+ if(f->shared->btree_k[H5B_ISTORE_ID]!=HDF5_BTREE_ISTORE_IK_DEF) {
+ int super_vers=HDF5_SUPERBLOCK_VERSION_MAX; /* Super block version */
+ H5P_genplist_t *c_plist; /* Property list */
+
+ if(NULL == (c_plist = H5I_object(f->shared->fcpl_id)))
+ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not property list");
+ if(H5P_set(c_plist, H5F_CRT_SUPER_VERS_NAME, &super_vers) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set superblock version");
+ } /* end if */
if(NULL == (plist = H5I_object(fapl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not file access property list");
@@ -1798,17 +1814,17 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d
char driver_name[9]; /*file driver name/version */
hbool_t driver_has_cmp; /*`cmp' callback defined? */
hsize_t userblock_size = 0;
- int boot_vers;
- int freespace_vers;
+ int super_vers; /* Superblock version # */
+ int freespace_vers; /* File freespace version # */
int obj_dir_vers;
int share_head_vers;
size_t sizeof_addr = 0;
size_t sizeof_size = 0;
unsigned sym_leaf_k = 0;
- unsigned btree_k[H5B_NUM_BTREE_ID];
- H5P_genplist_t *c_plist;
- H5P_genplist_t *a_plist; /* Property list */
- H5F_close_degree_t fc_degree;
+ unsigned btree_k[H5B_NUM_BTREE_ID]; /* B-tree internal node 'K' values */
+ H5P_genplist_t *c_plist; /* File creation property list */
+ H5P_genplist_t *a_plist; /* File access property list */
+ H5F_close_degree_t fc_degree; /* File close degree */
unsigned chksum; /* Checksum temporary variable */
unsigned i; /* Index variable */
@@ -1954,16 +1970,6 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d
}
#endif /* H5_HAVE_FPHDF5 */
- /* Get values to cache from the FCPL */
- if(H5P_get(c_plist, H5F_CRT_ADDR_BYTE_NUM_NAME,&shared->sizeof_addr)<0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set byte number in an address");
- if(H5P_get(c_plist, H5F_CRT_OBJ_BYTE_NUM_NAME, &shared->sizeof_size)<0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set byte number for object size");
- if(H5P_get(c_plist, H5F_CRT_SYM_LEAF_NAME, &shared->sym_leaf_k)<0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set rank for symbol table leaf nodes");
- if(H5P_get(c_plist, H5F_CRT_BTREE_RANK_NAME, &shared->btree_k[0])<0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "unable to get rank for btree internal nodes");
-
/*
* The superblock starts immediately after the user-defined header,
* which we have already insured is a proper size. The base address
@@ -1971,8 +1977,8 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d
*/
if(H5P_get(c_plist, H5F_CRT_USER_BLOCK_NAME, &userblock_size) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "unable to get user block size");
- shared->boot_addr = userblock_size;
- shared->base_addr = shared->boot_addr;
+ shared->super_addr = userblock_size;
+ shared->base_addr = shared->super_addr;
shared->consist_flags = 0x03;
if (H5F_flush(file, dxpl_id, H5F_SCOPE_LOCAL, H5F_FLUSH_ALLOC_ONLY) < 0)
@@ -2001,21 +2007,21 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d
#endif /* H5_HAVE_FPHDF5 */
} else if (1==shared->nrefs) {
/* Read the superblock if it hasn't been read before. */
- if (HADDR_UNDEF==(shared->boot_addr=H5F_locate_signature(lf,dxpl_id)))
+ if (HADDR_UNDEF==(shared->super_addr=H5F_locate_signature(lf,dxpl_id)))
HGOTO_ERROR(H5E_FILE, H5E_NOTHDF5, NULL, "unable to find file signature");
- if (H5FD_set_eoa(lf, shared->boot_addr+fixed_size)<0 ||
- H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, shared->boot_addr, fixed_size, buf)<0)
+ if (H5FD_set_eoa(lf, shared->super_addr+fixed_size)<0 ||
+ H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, shared->super_addr, fixed_size, buf)<0)
HGOTO_ERROR(H5E_FILE, H5E_READERROR, NULL, "unable to read superblock");
/* Signature, already checked */
p = buf + H5F_SIGNATURE_LEN;
/* Superblock version */
- boot_vers = *p++;
- if(HDF5_BOOTBLOCK_VERSION != boot_vers)
+ super_vers = *p++;
+ if(super_vers>HDF5_SUPERBLOCK_VERSION_MAX)
HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad superblock version number");
- if(H5P_set(c_plist, H5F_CRT_BOOT_VERS_NAME, &boot_vers) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set boot version");
+ if(H5P_set(c_plist, H5F_CRT_SUPER_VERS_NAME, &super_vers) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set superblock version");
/* Freespace version */
freespace_vers = *p++;
@@ -2031,7 +2037,7 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d
if(H5P_set(c_plist, H5F_CRT_OBJ_DIR_VERS_NAME, &obj_dir_vers) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set object directory version");
- /* reserved */
+ /* Skip over reserved byte */
p++;
/* Shared header version number */
@@ -2059,7 +2065,7 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set byte number for object size");
shared->sizeof_size=sizeof_size; /* Keep a local copy also */
- /* Reserved byte */
+ /* Skip over reserved byte */
p++;
/* Various B-tree sizes */
@@ -2076,24 +2082,41 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d
UINT16DECODE(p, btree_k[H5B_SNODE_ID]);
if(btree_k[H5B_SNODE_ID] < 1)
HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, NULL, "bad 1/2 rank for btree internal nodes");
- if(H5P_set(c_plist, H5F_CRT_BTREE_RANK_NAME, btree_k)<0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set rank for btree internal nodes");
- HDmemcpy(shared->btree_k,btree_k,sizeof(unsigned)*H5B_NUM_BTREE_ID); /* Keep a local copy also */
+ /* Delay setting the value in the property list until we've checked for
+ * the indexed storage B-tree internal 'K' value later.
+ */
/* File consistency flags. Not really used yet */
UINT32DECODE(p, shared->consist_flags);
assert((hsize_t)(p-buf) == fixed_size);
/* Decode the variable-length part of the superblock... */
- variable_size = H5F_SIZEOF_ADDR(file) + /*base addr*/
+ variable_size = (super_vers>0 ? 4 : 0) + /* Potential indexed storage B-tree internal 'K' value */
+ H5F_SIZEOF_ADDR(file) + /*base addr*/
H5F_SIZEOF_ADDR(file) + /*global free list*/
H5F_SIZEOF_ADDR(file) + /*end-of-address*/
H5F_SIZEOF_ADDR(file) + /*reserved address*/
H5G_SIZEOF_ENTRY(file); /*root group ptr*/
- assert(variable_size<=sizeof(buf));
- if (H5FD_set_eoa(lf, shared->boot_addr+fixed_size+variable_size)<0 ||
- H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, shared->boot_addr+fixed_size, variable_size, &buf[fixed_size])<0)
+ assert((fixed_size+variable_size)<=sizeof(buf));
+ if (H5FD_set_eoa(lf, shared->super_addr+fixed_size+variable_size)<0 ||
+ H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, shared->super_addr+fixed_size, variable_size, &buf[fixed_size])<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read superblock");
+
+ /* If the superblock version # is greater than 0, read in the indexed storage B-tree internal 'K' value */
+ if(super_vers>0) {
+ UINT16DECODE(p, btree_k[H5B_ISTORE_ID]);
+
+ /* Skip over reserved bytes */
+ p+=2;
+ } /* end if */
+ else
+ btree_k[H5B_ISTORE_ID]=HDF5_BTREE_ISTORE_IK_DEF;
+
+ /* Set the B-tree internal node values, etc */
+ if(H5P_set(c_plist, H5F_CRT_BTREE_RANK_NAME, btree_k)<0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set rank for btree internal nodes");
+ HDmemcpy(shared->btree_k,btree_k,sizeof(unsigned)*H5B_NUM_BTREE_ID); /* Keep a local copy also */
+
H5F_addr_decode(file, &p, &(shared->base_addr)/*out*/);
H5F_addr_decode(file, &p, &(shared->freespace_addr)/*out*/);
H5F_addr_decode(file, &p, &stored_eoa/*out*/);
@@ -2101,17 +2124,18 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d
if (H5G_ent_decode(file, &p, &root_ent/*out*/)<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read root symbol entry");
- /* Compute boot block checksum */
- assert(sizeof(chksum)==sizeof(shared->boot_chksum));
+ /* Compute super block checksum */
+ assert(sizeof(chksum)==sizeof(shared->super_chksum));
for(q=(uint8_t *)&chksum, chksum=0, i=0; i<(fixed_size+variable_size); i++)
- q[i%sizeof(shared->boot_chksum)] ^= buf[i];
+ q[i%sizeof(shared->super_chksum)] ^= buf[i];
- /* Set the boot block checksum */
- shared->boot_chksum=chksum;
+ /* Set the super block checksum */
+ shared->super_chksum=chksum;
/* Decode the optional driver information block */
if (H5F_addr_defined(shared->driver_addr)) {
haddr_t drv_addr = shared->base_addr + shared->driver_addr;
+
if (H5FD_set_eoa(lf, drv_addr+16)<0 ||
H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, drv_addr, 16, buf)<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read driver information block");
@@ -2132,6 +2156,7 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d
driver_name[8] = '\0';
/* Read driver information and decode */
+ assert((driver_size+16)<=sizeof(buf));
if (H5FD_set_eoa(lf, drv_addr+16+driver_size)<0 ||
H5FD_read(lf, H5FD_MEM_SUPER, dxpl_id, drv_addr+16, driver_size, &buf[16])<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read file driver information");
@@ -2489,8 +2514,8 @@ done:
* Function: H5F_flush
*
* Purpose: Flushes (and optionally invalidates) cached data plus the
- * file boot block. If the logical file size field is zero
- * then it is updated to be the length of the boot block.
+ * file super block. If the logical file size field is zero
+ * then it is updated to be the length of the super block.
*
* Return: Non-negative on success/Negative on failure
*
@@ -2542,8 +2567,8 @@ done:
static herr_t
H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags)
{
- uint8_t sbuf[1024]; /* Superblock encoding buffer */
- uint8_t dbuf[1024]; /* Driver info block encoding buffer */
+ uint8_t sbuf[H5F_SUPERBLOCK_SIZE]; /* Superblock encoding buffer */
+ uint8_t dbuf[H5F_DRVINFOBLOCK_SIZE]; /* Driver info block encoding buffer */
uint8_t *p=NULL; /* Temporary pointer into encoding buffers */
unsigned nerrors=0; /* Errors from nested flushes */
unsigned i; /* Index variable */
@@ -2551,7 +2576,7 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags)
size_t superblock_size;/* Size of superblock, in bytes */
size_t driver_size; /* Size of driver info block, in bytes */
char driver_name[9]; /* Name of driver, for driver info block */
- int boot_vers; /* Boot block version */
+ int super_vers; /* Super block version */
int freespace_vers; /* Freespace info version */
int obj_dir_vers; /* Object header info version */
int share_head_vers;/* Shared header info version */
@@ -2678,8 +2703,8 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags)
if(NULL == (plist = H5I_object(f->shared->fcpl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
- if(H5P_get(plist, H5F_CRT_BOOT_VERS_NAME, &boot_vers) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get boot block version");
+ if(H5P_get(plist, H5F_CRT_SUPER_VERS_NAME, &super_vers) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get super block version");
if(H5P_get(plist, H5F_CRT_FREESPACE_VERS_NAME, &freespace_vers) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get free space version");
if(H5P_get(plist, H5F_CRT_OBJ_DIR_VERS_NAME, &obj_dir_vers) < 0)
@@ -2687,11 +2712,11 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags)
if(H5P_get(plist, H5F_CRT_SHARE_HEAD_VERS_NAME, &share_head_vers) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get shared-header format version");
- /* encode the file boot block */
+ /* encode the file super block */
p = sbuf;
HDmemcpy(p, H5F_SIGNATURE, H5F_SIGNATURE_LEN);
p += H5F_SIGNATURE_LEN;
- *p++ = boot_vers;
+ *p++ = super_vers;
*p++ = freespace_vers;
*p++ = obj_dir_vers;
*p++ = 0; /*reserved*/
@@ -2704,6 +2729,14 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags)
UINT16ENCODE(p, f->shared->sym_leaf_k);
UINT16ENCODE(p, f->shared->btree_k[H5B_SNODE_ID]);
UINT32ENCODE(p, f->shared->consist_flags);
+
+ /* Versions of the superblock >0 have the indexed storage B-tree internal 'K' value stored */
+ if(super_vers>0) {
+ UINT16ENCODE(p, f->shared->btree_k[H5B_ISTORE_ID]);
+ *p++ = 0; /*reserved */
+ *p++ = 0; /*reserved */
+ } /* end if */
+
H5F_addr_encode(f, &p, f->shared->base_addr);
H5F_addr_encode(f, &p, f->shared->freespace_addr);
H5F_addr_encode(f, &p, H5FD_get_eoa(f->shared->lf));
@@ -2721,7 +2754,11 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags)
if (driver_size > 0) {
driver_size += 16; /*driver block header */
+
+ /* Double check we didn't overrun the block (unlikely) */
assert(driver_size<=sizeof(dbuf));
+
+ /* Encode the driver information block */
p = dbuf;
/* Version */
@@ -2739,9 +2776,6 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags)
/* Driver name */
HDmemcpy(dbuf+8, driver_name, 8);
-
- /* Double check we didn't overrun the block (unlikely) */
- assert(driver_size<=sizeof(dbuf));
} /* end if */
if (flags & H5F_FLUSH_ALLOC_ONLY) {
@@ -2779,21 +2813,21 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags)
if (driver_size > 0)
f->shared->driver_addr = superblock_size;
} else {
- /* Compute boot block checksum */
- assert(sizeof(chksum)==sizeof(f->shared->boot_chksum));
+ /* Compute super block checksum */
+ assert(sizeof(chksum)==sizeof(f->shared->super_chksum));
for (p=(uint8_t *)&chksum, chksum=0, i=0; i<superblock_size; i++)
- p[i%sizeof(f->shared->boot_chksum)] ^= sbuf[i];
+ p[i%sizeof(f->shared->super_chksum)] ^= sbuf[i];
/* Compare with current checksums */
- if (chksum!=f->shared->boot_chksum) {
+ if (chksum!=f->shared->super_chksum) {
/* Write superblock */
if (H5FD_write(f->shared->lf, H5FD_MEM_SUPER, dxpl_id,
- f->shared->boot_addr, superblock_size, sbuf) < 0)
+ f->shared->super_addr, superblock_size, sbuf) < 0)
HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to write superblock");
/* Update checksum information if different */
- f->shared->boot_chksum=chksum;
+ f->shared->super_chksum=chksum;
} /* end if */
/* Check for driver info block */
diff --git a/src/H5Fdbg.c b/src/H5Fdbg.c
index 00a545c..b262087 100644
--- a/src/H5Fdbg.c
+++ b/src/H5Fdbg.c
@@ -81,7 +81,7 @@ H5F_debug(H5F_t *f, hid_t dxpl_id, FILE * stream, int indent, int fwidth)
if(H5P_get(plist, H5F_CRT_USER_BLOCK_NAME, &userblock_size)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get user block size");
- if(H5P_get(plist, H5F_CRT_BOOT_VERS_NAME, &super_vers)<0)
+ if(H5P_get(plist, H5F_CRT_SUPER_VERS_NAME, &super_vers)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get super block version");
if(H5P_get(plist, H5F_CRT_FREESPACE_VERS_NAME, &freespace_vers)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get super block version");
@@ -103,7 +103,7 @@ H5F_debug(H5F_t *f, hid_t dxpl_id, FILE * stream, int indent, int fwidth)
"File open reference count:",
(unsigned) (f->shared->nrefs));
HDfprintf(stream, "%*s%-*s %a (abs)\n", indent, "", fwidth,
- "Address of super block:", f->shared->boot_addr);
+ "Address of super block:", f->shared->super_addr);
HDfprintf(stream, "%*s%-*s %lu bytes\n", indent, "", fwidth,
"Size of user block:", (unsigned long) userblock_size);
diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h
index 131cde8..c14ac18 100644
--- a/src/H5Fpkg.h
+++ b/src/H5Fpkg.h
@@ -56,8 +56,9 @@
# undef H5F_DEBUG
#endif
-/* Maximum size of boot-block buffer */
-#define H5F_BOOTBLOCK_SIZE 1024
+/* Maximum size of super-block buffer */
+#define H5F_SUPERBLOCK_SIZE 256
+#define H5F_DRVINFOBLOCK_SIZE 1024
/* Define the HDF5 file signature */
#define H5F_SIGNATURE "\211HDF\r\n\032\n"
@@ -118,11 +119,11 @@ typedef struct H5F_file_t {
unsigned sym_leaf_k; /* Size of leaves in symbol tables */
unsigned btree_k[H5B_NUM_BTREE_ID]; /* B-tree key values for each type */
- haddr_t boot_addr; /* Absolute address of boot block */
+ haddr_t super_addr; /* Absolute address of super block */
haddr_t base_addr; /* Absolute base address for rel.addrs. */
haddr_t freespace_addr; /* Relative address of free-space info */
haddr_t driver_addr; /* File driver information block address*/
- unsigned boot_chksum; /* Boot block checksum */
+ unsigned super_chksum; /* Superblock checksum */
unsigned drvr_chksum; /* Driver info block checksum */
struct H5AC_t *cache; /* The object cache */
hid_t fcpl_id; /* File creation property list ID */
@@ -217,7 +218,7 @@ H5_DLL herr_t H5F_istore_stats (H5F_t *f, hbool_t headers);
H5_DLL herr_t H5F_istore_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream,
int indent, int fwidth, int ndims);
-/* Functions that operate on contiguous storage wrt boot block */
+/* Functions that operate on contiguous storage wrt superblock */
H5_DLL ssize_t H5F_contig_readvv(H5F_t *f, hsize_t _max_data, haddr_t _addr,
size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_offset_arr[],
size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[],
diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h
index da6c4f3..078af1d 100644
--- a/src/H5Fprivate.h
+++ b/src/H5Fprivate.h
@@ -257,7 +257,7 @@ typedef struct H5F_t H5F_t;
/* Definitions for the 1/2 rank for btree internal nodes */
#define H5F_CRT_BTREE_RANK_NAME "btree_rank"
#define H5F_CRT_BTREE_RANK_SIZE sizeof(unsigned[H5B_NUM_BTREE_ID])
-#define H5F_CRT_BTREE_RANK_DEF {16,32}
+#define H5F_CRT_BTREE_RANK_DEF {HDF5_BTREE_SNODE_IK_DEF,HDF5_BTREE_ISTORE_IK_DEF}
/* Definitions for byte number in an address */
#define H5F_CRT_ADDR_BYTE_NUM_NAME "addr_byte_num"
#define H5F_CRT_ADDR_BYTE_NUM_SIZE sizeof(size_t)
@@ -266,10 +266,10 @@ typedef struct H5F_t H5F_t;
#define H5F_CRT_OBJ_BYTE_NUM_NAME "obj_byte_num"
#define H5F_CRT_OBJ_BYTE_NUM_SIZE sizeof(size_t)
#define H5F_CRT_OBJ_BYTE_NUM_DEF sizeof(hsize_t)
-/* Definitions for version number of the bootblock */
-#define H5F_CRT_BOOT_VERS_NAME "boot_version"
-#define H5F_CRT_BOOT_VERS_SIZE sizeof(int)
-#define H5F_CRT_BOOT_VERS_DEF HDF5_BOOTBLOCK_VERSION
+/* Definitions for version number of the superblock */
+#define H5F_CRT_SUPER_VERS_NAME "super_version"
+#define H5F_CRT_SUPER_VERS_SIZE sizeof(int)
+#define H5F_CRT_SUPER_VERS_DEF HDF5_SUPERBLOCK_VERSION_DEF
/* Definitions for free-space version number */
#define H5F_CRT_FREESPACE_VERS_NAME "free_space_version"
#define H5F_CRT_FREESPACE_VERS_SIZE sizeof(int)
@@ -400,7 +400,7 @@ H5_DLL size_t H5F_sizeof_size(const H5F_t *f);
H5_DLL unsigned H5F_sym_leaf_k(const H5F_t *f);
H5_DLL unsigned H5F_Kvalue(const H5F_t *f, const struct H5B_class_t *type);
-/* Functions that operate on blocks of bytes wrt boot block */
+/* Functions that operate on blocks of bytes wrt super block */
H5_DLL herr_t H5F_block_read(H5F_t *f, H5FD_mem_t type, haddr_t addr,
size_t size, hid_t dxpl_id, void *buf/*out*/);
H5_DLL herr_t H5F_block_write(H5F_t *f, H5FD_mem_t type, haddr_t addr,
diff --git a/src/H5Pfcpl.c b/src/H5Pfcpl.c
index f13e79c..35f3e77 100644
--- a/src/H5Pfcpl.c
+++ b/src/H5Pfcpl.c
@@ -40,7 +40,7 @@ static int interface_initialize_g = 0;
*
* Purpose: Retrieves version information for various parts of a file.
*
- * BOOT: The file boot block.
+ * SUPER: The file super block.
* HEAP: The global heap.
* FREELIST: The global free list.
* STAB: The root symbol table entry.
@@ -65,23 +65,23 @@ static int interface_initialize_g = 0;
*-------------------------------------------------------------------------
*/
herr_t
-H5Pget_version(hid_t plist_id, int *boot/*out*/, int *freelist/*out*/,
+H5Pget_version(hid_t plist_id, int *super/*out*/, int *freelist/*out*/,
int *stab/*out*/, int *shhdr/*out*/)
{
H5P_genplist_t *plist; /* Property list pointer */
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_API(H5Pget_version, FAIL);
- H5TRACE5("e","ixxxx",plist_id,boot,freelist,stab,shhdr);
+ H5TRACE5("e","ixxxx",plist_id,super,freelist,stab,shhdr);
/* Get the plist structure */
if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID");
/* Get values */
- if (boot)
- if(H5P_get(plist, H5F_CRT_BOOT_VERS_NAME, boot) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get boot version");
+ if (super)
+ if(H5P_get(plist, H5F_CRT_SUPER_VERS_NAME, super) < 0)
+ HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get superblock version");
if (freelist)
if(H5P_get(plist, H5F_CRT_FREESPACE_VERS_NAME, freelist) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get free-space version");
diff --git a/src/H5private.h b/src/H5private.h
index 365c9d2..5832054 100644
--- a/src/H5private.h
+++ b/src/H5private.h
@@ -219,12 +219,22 @@
#endif
/* Version #'s of the major components of the file format */
-#define HDF5_BOOTBLOCK_VERSION 0 /* of the boot block format */
+#define HDF5_SUPERBLOCK_VERSION_DEF 0 /* The default super block format */
+#define HDF5_SUPERBLOCK_VERSION_MAX 1 /* The maximum super block format */
#define HDF5_FREESPACE_VERSION 0 /* of the Free-Space Info */
#define HDF5_OBJECTDIR_VERSION 0 /* of the Object Directory format */
#define HDF5_SHAREDHEADER_VERSION 0 /* of the Shared-Header Info */
#define HDF5_DRIVERINFO_VERSION 0 /* of the Driver Information Block*/
+/* B-tree internal 'K' values */
+#define HDF5_BTREE_SNODE_IK_DEF 16
+#define HDF5_BTREE_ISTORE_IK_DEF 32 /* Note! this value is assumed
+ to be 32 for older versions
+ of the superblock (<1) and
+ if it is changed, the code
+ must compensate. -QAK
+ */
+
/*
* Status return values for the `herr_t' type.
* Since some unix/c routines use 0 and -1 (or more precisely, non-negative