summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2002-06-01 03:10:40 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2002-06-01 03:10:40 (GMT)
commit8249ec87a2170c52baf8c33c51c1743a4ead5ec7 (patch)
tree95b04bbffd7c827035e7cb381d1556f6a42f99e2
parent3d8696ae55cbefed0ed1a39747ec37752628da16 (diff)
downloadhdf5-8249ec87a2170c52baf8c33c51c1743a4ead5ec7.zip
hdf5-8249ec87a2170c52baf8c33c51c1743a4ead5ec7.tar.gz
hdf5-8249ec87a2170c52baf8c33c51c1743a4ead5ec7.tar.bz2
[svn-r5501] Purpose:
Code Bug Fix Description: Under certain [obscure] circumstances, an object header would get paged out of the metadata cache, and when it was accessed again and brought back into the cache, and immediately had additional metadata added to it (an attribute, usually, or perhaps adding an object to a group), and needed to be extended with a continuation message, but there was no room in any existing object header chunks for the continuation message and an existing object header message needed to be moved to the new object header chunk (I told you it was obscure :-), the object header message moved to the new chunk (not the new metadata being added) would get corrupted. *whew* :-) Solution: Actually copy the "raw" object header message information of the object header message being moved to the new chunk, instead of relying on the "native" object header message information being re-encoded when the object header is flushed. This is because when an object header is paged out of the metadata cache and subsequently brought back in, the "native" information pointer in memory is reset to NULL and only the "raw" information exists. Platforms tested: Solaris 2.7 (arabica) & FreeBSD 4.5 (sleipnir)
-rw-r--r--src/H5O.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/H5O.c b/src/H5O.c
index c9e76f6..7081048 100644
--- a/src/H5O.c
+++ b/src/H5O.c
@@ -1903,6 +1903,8 @@ H5O_alloc_new_chunk(H5F_t *f, H5O_t *oh, size_t size)
oh->mesg[u].chunkno = oh->mesg[found_other].chunkno;
oh->mesg[found_other].dirty = TRUE;
+ /* Copy the message to the new location */
+ HDmemcpy(p+H5O_SIZEOF_MSGHDR(f),oh->mesg[found_other].raw,oh->mesg[found_other].raw_size);
oh->mesg[found_other].raw = p + H5O_SIZEOF_MSGHDR(f);
oh->mesg[found_other].chunkno = chunkno;
p += H5O_SIZEOF_MSGHDR(f) + oh->mesg[found_other].raw_size;