mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-03-13 16:47:58 +08:00
[svn-r27077] Description:
Clean up H5FD interface, to align w/v3 metadata cache changes Tested on: MacOSX/64 10.10.3 (amazon) w/serial & parallel Linux/32 2.6.* (jam) w/serial & parallel
This commit is contained in:
parent
71bc00a0b5
commit
cd1620238c
53
src/H5FD.c
53
src/H5FD.c
@ -540,11 +540,11 @@ H5FD_sb_encode(H5FD_t *file, char *name/*out*/, uint8_t *buf)
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
}
|
||||
} /* end H5FD_sb_encode() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5FD_sb_decode
|
||||
* Function: H5FD__sb_decode
|
||||
*
|
||||
* Purpose: Decodes the driver information block.
|
||||
*
|
||||
@ -556,20 +556,61 @@ done:
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
H5FD__sb_decode(H5FD_t *file, const char *name, const uint8_t *buf)
|
||||
{
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_STATIC
|
||||
|
||||
HDassert(file && file->cls);
|
||||
|
||||
/* Decode driver information */
|
||||
if(file->cls->sb_decode && (file->cls->sb_decode)(file, name, buf) < 0)
|
||||
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver sb_decode request failed")
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5FD__sb_decode() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5FD_sb_load
|
||||
*
|
||||
* Purpose: Validate and decode the driver information block.
|
||||
*
|
||||
* Return: Success: Non-negative
|
||||
* Failure: Negative
|
||||
*
|
||||
* Programmer: Quincey Koziol
|
||||
* Friday, July 19, 2013
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5FD_sb_decode(H5FD_t *file, const char *name, const uint8_t *buf)
|
||||
H5FD_sb_load(H5FD_t *file, const char *name, const uint8_t *buf)
|
||||
{
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_NOAPI(FAIL)
|
||||
|
||||
HDassert(file && file->cls);
|
||||
if(file->cls->sb_decode && (file->cls->sb_decode)(file, name, buf) < 0)
|
||||
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver sb_decode request failed")
|
||||
|
||||
/* Check if driver matches driver information saved. Unfortunately, we can't push this
|
||||
* function to each specific driver because we're checking if the driver is correct.
|
||||
*/
|
||||
if(!HDstrncmp(name, "NCSAfami", (size_t)8) && HDstrcmp(file->cls->name, "family"))
|
||||
HGOTO_ERROR(H5E_VFL, H5E_BADVALUE, FAIL, "family driver should be used")
|
||||
if(!HDstrncmp(name, "NCSAmult", (size_t)8) && HDstrcmp(file->cls->name, "multi"))
|
||||
HGOTO_ERROR(H5E_VFL, H5E_BADVALUE, FAIL, "multi driver should be used")
|
||||
|
||||
/* Decode driver information */
|
||||
if(H5FD__sb_decode(file, name, buf) < 0)
|
||||
HGOTO_ERROR(H5E_VFL, H5E_CANTDECODE, FAIL, "unable to decode driver information")
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5FD_sb_decode() */
|
||||
} /* end H5FD_sb_load() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
|
@ -587,26 +587,25 @@ H5FD_family_sb_decode(H5FD_t *_file, const char UNUSED *name, const unsigned cha
|
||||
* h5repart is being used to change member file size. h5repart will open
|
||||
* files for read and write. When the files are closed, metadata will be
|
||||
* flushed to the files and updated to this new size */
|
||||
if(file->mem_newsize) {
|
||||
if(file->mem_newsize)
|
||||
file->memb_size = file->pmem_size = file->mem_newsize;
|
||||
HGOTO_DONE(ret_value)
|
||||
} /* end if */
|
||||
else {
|
||||
/* Default - use the saved member size */
|
||||
if(file->pmem_size == H5F_FAMILY_DEFAULT)
|
||||
file->pmem_size = msize;
|
||||
|
||||
/* Default - use the saved member size */
|
||||
if(file->pmem_size == H5F_FAMILY_DEFAULT)
|
||||
file->pmem_size = msize;
|
||||
/* Check if member size from file access property is correct */
|
||||
if(msize != file->pmem_size) {
|
||||
char err_msg[128];
|
||||
|
||||
/* Check if member size from file access property is correct */
|
||||
if(msize != file->pmem_size) {
|
||||
char err_msg[128];
|
||||
HDsnprintf(err_msg, sizeof(err_msg), "Family member size should be %lu. But the size from file access property is %lu", (unsigned long)msize, (unsigned long)file->pmem_size);
|
||||
HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, err_msg)
|
||||
} /* end if */
|
||||
|
||||
HDsnprintf(err_msg, sizeof(err_msg), "Family member size should be %lu. But the size from file access property is %lu", (unsigned long)msize, (unsigned long)file->pmem_size);
|
||||
HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, err_msg)
|
||||
} /* end if */
|
||||
|
||||
/* Update member file size to the size saved in the superblock.
|
||||
* That's the size intended to be. */
|
||||
file->memb_size = msize;
|
||||
/* Update member file size to the size saved in the superblock.
|
||||
* That's the size intended to be. */
|
||||
file->memb_size = msize;
|
||||
} /* end else */
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
@ -686,14 +685,11 @@ H5FD_family_open(const char *name, unsigned flags, hid_t fapl_id,
|
||||
|
||||
/* Check for new family file size. It's used by h5repart only. */
|
||||
if(H5P_exist_plist(plist, H5F_ACS_FAMILY_NEWSIZE_NAME) > 0) {
|
||||
hsize_t fam_newsize = 0; /* New member size, when repartitioning */
|
||||
|
||||
/* Get the new family file size */
|
||||
if(H5P_get(plist, H5F_ACS_FAMILY_NEWSIZE_NAME, &fam_newsize) < 0)
|
||||
if(H5P_get(plist, H5F_ACS_FAMILY_NEWSIZE_NAME, &file->mem_newsize) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get new family member size")
|
||||
|
||||
/* Store information for later */
|
||||
file->mem_newsize = fam_newsize; /* New member size passed in through property */
|
||||
/* Set flag for later */
|
||||
file->repart_members = TRUE;
|
||||
} /* end if */
|
||||
|
||||
|
@ -109,7 +109,7 @@ H5_DLL herr_t H5FD_locate_signature(H5FD_t *file, const H5P_genplist_t *dxpl, ha
|
||||
H5_DLL H5FD_class_t *H5FD_get_class(hid_t id);
|
||||
H5_DLL hsize_t H5FD_sb_size(H5FD_t *file);
|
||||
H5_DLL herr_t H5FD_sb_encode(H5FD_t *file, char *name/*out*/, uint8_t *buf);
|
||||
H5_DLL herr_t H5FD_sb_decode(H5FD_t *file, const char *name, const uint8_t *buf);
|
||||
H5_DLL herr_t H5FD_sb_load(H5FD_t *file, const char *name, const uint8_t *buf);
|
||||
H5_DLL void *H5FD_fapl_get(H5FD_t *file);
|
||||
H5_DLL herr_t H5FD_fapl_open(struct H5P_genplist_t *plist, hid_t driver_id, const void *driver_info);
|
||||
H5_DLL herr_t H5FD_fapl_close(hid_t driver_id, void *fapl);
|
||||
|
@ -382,14 +382,6 @@ H5F_sblock_load(H5F_t *f, hid_t dxpl_id, haddr_t UNUSED addr, void *_udata)
|
||||
drv_name[8] = '\0';
|
||||
p += 8; /* advance past name/version */
|
||||
|
||||
/* Check if driver matches driver information saved. Unfortunately, we can't push this
|
||||
* function to each specific driver because we're checking if the driver is correct.
|
||||
*/
|
||||
if(!HDstrncmp(drv_name, "NCSAfami", (size_t)8) && HDstrcmp(lf->cls->name, "family"))
|
||||
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "family driver should be used")
|
||||
if(!HDstrncmp(drv_name, "NCSAmult", (size_t)8) && HDstrcmp(lf->cls->name, "multi"))
|
||||
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "multi driver should be used")
|
||||
|
||||
/* Read in variable-sized portion of driver info block */
|
||||
if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, sblock->driver_addr + H5F_DRVINFOBLOCK_HDR_SIZE + drv_variable_size) < 0)
|
||||
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "set end of space allocation request failed")
|
||||
@ -397,7 +389,7 @@ H5F_sblock_load(H5F_t *f, hid_t dxpl_id, haddr_t UNUSED addr, void *_udata)
|
||||
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read file driver information")
|
||||
|
||||
/* Decode driver information */
|
||||
if(H5FD_sb_decode(lf, drv_name, p) < 0)
|
||||
if(H5FD_sb_load(lf, drv_name, p) < 0)
|
||||
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to decode driver information")
|
||||
} /* end if */
|
||||
} /* end if */
|
||||
@ -546,16 +538,8 @@ H5F_sblock_load(H5F_t *f, hid_t dxpl_id, haddr_t UNUSED addr, void *_udata)
|
||||
if(NULL == H5O_msg_read(&ext_loc, H5O_DRVINFO_ID, &drvinfo, dxpl_id))
|
||||
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "driver info message not present")
|
||||
|
||||
/* Check if driver matches driver information saved. Unfortunately, we can't push this
|
||||
* function to each specific driver because we're checking if the driver is correct.
|
||||
*/
|
||||
if(!HDstrncmp(drvinfo.name, "NCSAfami", (size_t)8) && HDstrcmp(lf->cls->name, "family"))
|
||||
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "family driver should be used")
|
||||
if(!HDstrncmp(drvinfo.name, "NCSAmult", (size_t)8) && HDstrcmp(lf->cls->name, "multi"))
|
||||
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "multi driver should be used")
|
||||
|
||||
/* Decode driver information */
|
||||
if(H5FD_sb_decode(lf, drvinfo.name, drvinfo.buf) < 0)
|
||||
if(H5FD_sb_load(lf, drvinfo.name, drvinfo.buf) < 0)
|
||||
HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to decode driver information")
|
||||
|
||||
/* Reset driver info message */
|
||||
|
Loading…
x
Reference in New Issue
Block a user