summaryrefslogtreecommitdiffstats
path: root/src/H5Ocopy.c
diff options
context:
space:
mode:
authorNeil Fortner <nfortne2@hdfgroup.org>2011-10-20 22:01:21 (GMT)
committerNeil Fortner <nfortne2@hdfgroup.org>2011-10-20 22:01:21 (GMT)
commit72702153d2e3fe35aa526173f93f5510eb4b65fd (patch)
tree70a4a866edab23ef0c5ec1c6adc57922653e0219 /src/H5Ocopy.c
parentcc6ce34d23ab42bcc0df38beb94ad5683f604aaa (diff)
downloadhdf5-72702153d2e3fe35aa526173f93f5510eb4b65fd.zip
hdf5-72702153d2e3fe35aa526173f93f5510eb4b65fd.tar.gz
hdf5-72702153d2e3fe35aa526173f93f5510eb4b65fd.tar.bz2
[svn-r21629] Purpose: Update fix committed in r21556
Description: An old patch was mistakenly committed in r21556. Replaced this fix with the latest. Tested: jam, koala, heiwa (h5committest)
Diffstat (limited to 'src/H5Ocopy.c')
-rw-r--r--src/H5Ocopy.c42
1 files changed, 15 insertions, 27 deletions
diff --git a/src/H5Ocopy.c b/src/H5Ocopy.c
index 0774acd..acb8d14 100644
--- a/src/H5Ocopy.c
+++ b/src/H5Ocopy.c
@@ -689,19 +689,6 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */,
if(H5SL_insert(cpy_info->map_list, addr_map, &(addr_map->src_obj_pos)) < 0)
HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't insert object into skip list")
- /* Set metadata tag for destination object's object header */
- H5_BEGIN_TAG(dxpl_id, oloc_dst->addr, FAIL);
-
- /* Insert destination object header in cache. Insert before post copy loop
- * so anything that references this object header can find it. Insert
- * pinned so we can continue using oh_dst. */
- if(H5AC_insert_entry(oloc_dst->file, dxpl_id, H5AC_OHDR, oloc_dst->addr, oh_dst, H5AC__PIN_ENTRY_FLAG) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header")
- inserted = TRUE;
-
- /* Reset metadata tag */
- H5_END_TAG(FAIL);
-
/* "post copy" loop over messages, to fix up any messages which require a complete
* object header for destination object
*/
@@ -752,10 +739,17 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */,
oh_dst->nlink += (unsigned)addr_map->inc_ref_count;
} /* end if */
- /* Unpin oh_dst */
- if(H5AC_unpin_entry(oh_dst) < 0)
- HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPIN, FAIL, "can't unpin object header")
+ /* Set metadata tag for destination object's object header */
+ H5_BEGIN_TAG(dxpl_id, oloc_dst->addr, FAIL);
+
+ /* Insert destination object header in cache */
+ if(H5AC_insert_entry(oloc_dst->file, dxpl_id, H5AC_OHDR, oloc_dst->addr, oh_dst, H5AC__NO_FLAGS_SET) < 0)
+ HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header")
oh_dst = NULL;
+ inserted = TRUE;
+
+ /* Reset metadat tag */
+ H5_END_TAG(FAIL);
/* Retag all copied metadata to apply the destination object's tag */
if(H5AC_retag_copied_metadata(oloc_dst->file, oloc_dst->addr) < 0)
@@ -778,17 +772,11 @@ done:
HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
/* Free destination object header on failure */
- if(ret_value < 0 && oh_dst) {
- if(inserted) {
- if(H5AC_unpin_entry(oh_dst) < 0)
- HDONE_ERROR(H5E_OHDR, H5E_CANTUNPIN, FAIL, "can't unpin object header")
- } /* end if */
- else {
- if(H5O_free(oh_dst) < 0)
- HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
- if(H5O_loc_reset(oloc_dst) < 0)
- HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
- } /* end else */
+ if(ret_value < 0 && oh_dst && !inserted) {
+ if(H5O_free(oh_dst) < 0)
+ HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
+ if(H5O_loc_reset(oloc_dst) < 0)
+ HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
} /* end if */
FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)