summaryrefslogtreecommitdiffstats
path: root/src/H5Fmount.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2009-08-24 19:09:36 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2009-08-24 19:09:36 (GMT)
commitb6494f0fc9159fae1418e033126826cf61a3ff21 (patch)
treed69e857ee6484f6e716400d92f2b8dae61b0e627 /src/H5Fmount.c
parent81e3eef99a7c0363d10c4d8972163da25a0da662 (diff)
downloadhdf5-b6494f0fc9159fae1418e033126826cf61a3ff21.zip
hdf5-b6494f0fc9159fae1418e033126826cf61a3ff21.tar.gz
hdf5-b6494f0fc9159fae1418e033126826cf61a3ff21.tar.bz2
[svn-r17415] Description:
Bring r17408, 17411, 17412, 17413 & 17414 from trunk back to 1.8 branch: r17408: Move flush operation on mounted file hierarchy into H5Fmount module. r17411: Make H5AC_flush just flush the cache and make H5AC_dest perform the proper parallel synchronization before destroying the cache. Also, further discriminate between 'closing' and 'non-closing' actions in H5F_flush. r17412: Seperate 'flush' functionality from 'destroy' functionality at the H5F level also. r17413: Remove vestigial intermediate routine for flushing file and move it into API routine. Also, remove private, unused (now) 'H5F_FLUSH_DOWN' symbol from public header file. r17414: Flush the core VFD's buffer before closing the file, also flush the metadata accumulator before reseting it. Write the driver info message out in the superblock flush routine more directly, instead of using wrapper routine, since the wrapper routine won't work when the superblock is being shutdown. Tested on: FreeBSD/32 6.3 (duty) in debug mode (h5committest performed on trunk)
Diffstat (limited to 'src/H5Fmount.c')
-rw-r--r--src/H5Fmount.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/src/H5Fmount.c b/src/H5Fmount.c
index ff4b1eb..f70a7c6 100644
--- a/src/H5Fmount.c
+++ b/src/H5Fmount.c
@@ -627,3 +627,80 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5F_mount_count_ids() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_flush_mounts_recurse
+ *
+ * Purpose: Flush a mount hierarchy, recursively
+ *
+ * Return: SUCCEED/FAIL
+ *
+ * Programmer: Quincey Koziol
+ * Fri, August 21, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F_flush_mounts_recurse(H5F_t *f, hid_t dxpl_id)
+{
+ unsigned nerrors = 0; /* Errors from recursive flushes */
+ unsigned u; /* Index variable */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT(H5F_flush_mounts_recurse)
+
+ /* Sanity check */
+ HDassert(f);
+
+ /* Flush all child files, not stopping for errors */
+ for(u = 0; u < f->shared->mtab.nmounts; u++)
+ if(H5F_flush_mounts_recurse(f->shared->mtab.child[u].file, dxpl_id) < 0)
+ nerrors++;
+
+ /* Call the "real" flush routine, for this file */
+ if(H5F_flush(f, dxpl_id) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file's cached information")
+
+ /* Check flush errors for children - errors are already on the stack */
+ if(nerrors)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file's child mounts")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_flush_mounts_recurse() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: H5F_flush_mounts
+ *
+ * Purpose: Flush a mount hierarchy
+ *
+ * Return: SUCCEED/FAIL
+ *
+ * Programmer: Quincey Koziol
+ * Fri, August 21, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_flush_mounts(H5F_t *f, hid_t dxpl_id)
+{
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5F_flush_mounts, FAIL)
+
+ /* Sanity check */
+ HDassert(f);
+
+ /* Find the top file in the mount hierarchy */
+ while(f->parent)
+ f = f->parent;
+
+ /* Flush the mounted file hierarchy */
+ if(H5F_flush_mounts_recurse(f, dxpl_id) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush mounted file hierarchy")
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F_flush_mounts() */
+