Description: Due to a bug in H5F_super_read, every time a file with a user block was opened it would grow by the size of the user block. The bug has been fixed, and comments have been added to clarify when an eoa address should be relative and when it should be absolute. Tested: jam, linew (h5committest)
313 lines
9.0 KiB
C
313 lines
9.0 KiB
C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||
* Copyright by The HDF Group. *
|
||
* Copyright by the Board of Trustees of the University of Illinois. *
|
||
* All rights reserved. *
|
||
* *
|
||
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
||
* terms governing use, modification, and redistribution, is contained in *
|
||
* the files COPYING and Copyright.html. COPYING can be found at the root *
|
||
* of the source code distribution tree; Copyright.html can be found at the *
|
||
* root level of an installed copy of the electronic HDF5 document set and *
|
||
* is linked from the top-level documents page. It can also be found at *
|
||
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
|
||
* access to either file, you may request a copy from help@hdfgroup.org. *
|
||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
||
/*-------------------------------------------------------------------------
|
||
*
|
||
* Created: H5FDint.c
|
||
* Jan 17 2008
|
||
* Quincey Koziol <koziol@hdfgroup.org>
|
||
*
|
||
* Purpose: Internal routine for VFD operations
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
|
||
/****************/
|
||
/* Module Setup */
|
||
/****************/
|
||
|
||
#define H5FD_PACKAGE /*suppress error about including H5FDpkg */
|
||
|
||
/* Interface initialization */
|
||
#define H5_INTERFACE_INIT_FUNC H5FD_int_init_interface
|
||
|
||
|
||
/***********/
|
||
/* Headers */
|
||
/***********/
|
||
#include "H5private.h" /* Generic Functions */
|
||
#include "H5Eprivate.h" /* Error handling */
|
||
#include "H5Fprivate.h" /* File access */
|
||
#include "H5FDpkg.h" /* File Drivers */
|
||
#include "H5Iprivate.h" /* IDs */
|
||
#include "H5Pprivate.h" /* Property lists */
|
||
|
||
|
||
/****************/
|
||
/* Local Macros */
|
||
/****************/
|
||
|
||
|
||
/******************/
|
||
/* Local Typedefs */
|
||
/******************/
|
||
|
||
|
||
/********************/
|
||
/* Package Typedefs */
|
||
/********************/
|
||
|
||
|
||
/********************/
|
||
/* Local Prototypes */
|
||
/********************/
|
||
|
||
|
||
/*********************/
|
||
/* Package Variables */
|
||
/*********************/
|
||
|
||
|
||
/*****************************/
|
||
/* Library Private Variables */
|
||
/*****************************/
|
||
|
||
|
||
/*******************/
|
||
/* Local Variables */
|
||
/*******************/
|
||
|
||
|
||
|
||
/*--------------------------------------------------------------------------
|
||
NAME
|
||
H5FD_int_init_interface -- Initialize interface-specific information
|
||
USAGE
|
||
herr_t H5FD_int_init_interface()
|
||
|
||
RETURNS
|
||
Non-negative on success/Negative on failure
|
||
DESCRIPTION
|
||
Initializes any interface-specific data or routines. (Just calls
|
||
H5FD_init_iterface currently).
|
||
|
||
--------------------------------------------------------------------------*/
|
||
static herr_t
|
||
H5FD_int_init_interface(void)
|
||
{
|
||
FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5FD_int_init_interface)
|
||
|
||
FUNC_LEAVE_NOAPI(H5FD_init())
|
||
} /* H5FD_int_init_interface() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: H5FD_read
|
||
*
|
||
* Purpose: Private version of H5FDread()
|
||
*
|
||
* Return: Success: Non-negative
|
||
* Failure: Negative
|
||
*
|
||
* Programmer: Robb Matzke
|
||
* Wednesday, August 4, 1999
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
herr_t
|
||
H5FD_read(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, haddr_t addr,
|
||
size_t size, void *buf/*out*/)
|
||
{
|
||
herr_t ret_value = SUCCEED; /* Return value */
|
||
|
||
FUNC_ENTER_NOAPI(H5FD_read, FAIL)
|
||
|
||
HDassert(file && file->cls);
|
||
HDassert(H5I_GENPROP_LST == H5I_get_type(dxpl_id));
|
||
HDassert(TRUE == H5P_isa_class(dxpl_id, H5P_DATASET_XFER));
|
||
HDassert(buf);
|
||
|
||
#ifndef H5_HAVE_PARALLEL
|
||
/* Do not return early for Parallel mode since the I/O could be a */
|
||
/* collective transfer. */
|
||
/* The no-op case */
|
||
if(0 == size)
|
||
HGOTO_DONE(SUCCEED)
|
||
#endif /* H5_HAVE_PARALLEL */
|
||
|
||
/* Dispatch to driver */
|
||
if((file->cls->read)(file, type, dxpl_id, addr + file->base_addr, size, buf) < 0)
|
||
HGOTO_ERROR(H5E_VFL, H5E_READERROR, FAIL, "driver read request failed")
|
||
|
||
done:
|
||
FUNC_LEAVE_NOAPI(ret_value)
|
||
} /* end H5FD_read() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: H5FD_write
|
||
*
|
||
* Purpose: Private version of H5FDwrite()
|
||
*
|
||
* Return: Success: Non-negative
|
||
* Failure: Negative
|
||
*
|
||
* Programmer: Robb Matzke
|
||
* Wednesday, August 4, 1999
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
herr_t
|
||
H5FD_write(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, haddr_t addr,
|
||
size_t size, const void *buf)
|
||
{
|
||
herr_t ret_value = SUCCEED; /* Return value */
|
||
|
||
FUNC_ENTER_NOAPI(H5FD_write, FAIL)
|
||
|
||
HDassert(file && file->cls);
|
||
HDassert(H5I_GENPROP_LST == H5I_get_type(dxpl_id));
|
||
HDassert(TRUE == H5P_isa_class(dxpl_id, H5P_DATASET_XFER));
|
||
HDassert(buf);
|
||
|
||
#ifndef H5_HAVE_PARALLEL
|
||
/* Do not return early for Parallel mode since the I/O could be a */
|
||
/* collective transfer. */
|
||
/* The no-op case */
|
||
if(0 == size)
|
||
HGOTO_DONE(SUCCEED)
|
||
#endif /* H5_HAVE_PARALLEL */
|
||
|
||
/* Dispatch to driver */
|
||
if((file->cls->write)(file, type, dxpl_id, addr + file->base_addr, size, buf) < 0)
|
||
HGOTO_ERROR(H5E_VFL, H5E_WRITEERROR, FAIL, "driver write request failed")
|
||
|
||
done:
|
||
FUNC_LEAVE_NOAPI(ret_value)
|
||
} /* end H5FD_write() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: H5FD_set_eoa
|
||
*
|
||
* Purpose: Private version of H5FDset_eoa()
|
||
*
|
||
* This function expects the EOA is a RELATIVE address, i.e.
|
||
* relative to the base address. This is NOT the same as the
|
||
* EOA stored in the superblock, which is an absolute
|
||
* address. Object addresses are relative.
|
||
*
|
||
* Return: Success: Non-negative
|
||
* Failure: Negative, no side effect
|
||
*
|
||
* Programmer: Robb Matzke
|
||
* Wednesday, August 4, 1999
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
herr_t
|
||
H5FD_set_eoa(H5FD_t *file, H5FD_mem_t type, haddr_t addr)
|
||
{
|
||
herr_t ret_value = SUCCEED; /* Return value */
|
||
|
||
FUNC_ENTER_NOAPI(H5FD_set_eoa, FAIL)
|
||
|
||
HDassert(file && file->cls);
|
||
HDassert(H5F_addr_defined(addr) && addr <= file->maxaddr);
|
||
|
||
/* Dispatch to driver, convert to absolute address */
|
||
if((file->cls->set_eoa)(file, type, addr + file->base_addr) < 0)
|
||
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver set_eoa request failed")
|
||
|
||
done:
|
||
FUNC_LEAVE_NOAPI(ret_value)
|
||
} /* end H5FD_set_eoa() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: H5FD_get_eoa
|
||
*
|
||
* Purpose: Private version of H5FDget_eoa()
|
||
*
|
||
* This function returns the EOA as a RELATIVE address, i.e.
|
||
* relative to the base address. This is NOT the same as the
|
||
* EOA stored in the superblock, which is an absolute
|
||
* address. Object addresses are relative.
|
||
*
|
||
* Return: Success: First byte after allocated memory.
|
||
* Failure: HADDR_UNDEF
|
||
*
|
||
* Programmer: Robb Matzke
|
||
* Wednesday, August 4, 1999
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
haddr_t
|
||
H5FD_get_eoa(const H5FD_t *file, H5FD_mem_t type)
|
||
{
|
||
haddr_t ret_value;
|
||
|
||
FUNC_ENTER_NOAPI(H5FD_get_eoa, HADDR_UNDEF)
|
||
|
||
HDassert(file && file->cls);
|
||
|
||
/* Dispatch to driver */
|
||
if(HADDR_UNDEF == (ret_value = (file->cls->get_eoa)(file, type)))
|
||
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, HADDR_UNDEF, "driver get_eoa request failed")
|
||
|
||
/* Adjust for base address in file (convert to relative address) */
|
||
ret_value -= file->base_addr;
|
||
|
||
done:
|
||
FUNC_LEAVE_NOAPI(ret_value)
|
||
} /* end H5FD_get_eoa() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: H5FD_get_eof
|
||
*
|
||
* Purpose: Private version of H5FDget_eof()
|
||
*
|
||
* This function returns the EOF as a RELATIVE address, i.e.
|
||
* relative to the base address. This will be different
|
||
* from the end of the physical file if there is a user
|
||
* block.
|
||
*
|
||
* Return: Success: The EOF address.
|
||
*
|
||
* Failure: HADDR_UNDEF
|
||
*
|
||
* Programmer: Robb Matzke
|
||
* Wednesday, August 4, 1999
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
haddr_t
|
||
H5FD_get_eof(const H5FD_t *file)
|
||
{
|
||
haddr_t ret_value;
|
||
|
||
FUNC_ENTER_NOAPI(H5FD_get_eof, HADDR_UNDEF)
|
||
|
||
HDassert(file && file->cls);
|
||
|
||
/* Dispatch to driver */
|
||
if(file->cls->get_eof) {
|
||
if(HADDR_UNDEF == (ret_value = (file->cls->get_eof)(file)))
|
||
HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, HADDR_UNDEF, "driver get_eof request failed")
|
||
} /* end if */
|
||
else
|
||
ret_value = file->maxaddr;
|
||
|
||
/* Adjust for base address in file (convert to relative address) */
|
||
ret_value -= file->base_addr;
|
||
|
||
done:
|
||
FUNC_LEAVE_NOAPI(ret_value)
|
||
} /* end H5FD_get_eof() */
|
||
|