From e53af0ed745a7bec1795681c473ba54025814fd5 Mon Sep 17 00:00:00 2001
From: Dana Robinson <derobins@hdfgroup.org>
Date: Tue, 21 Aug 2012 06:47:54 -0500
Subject: [svn-r22703] Description:     Propagated Windows and POSIX
 correctness changes from SEC2 VFD to     the MPI-POSIX VFD.  Fixes
 HDFFV-8058.

Tested on:
    jam w/ parallel and fortran enabled
---
 src/H5FDmpiposix.c | 1088 ++++++++++++++++++++++++++--------------------------
 src/H5FDmpiposix.h |    9 +-
 2 files changed, 541 insertions(+), 556 deletions(-)

diff --git a/src/H5FDmpiposix.c b/src/H5FDmpiposix.c
index 4ed3a4d..261f427 100644
--- a/src/H5FDmpiposix.c
+++ b/src/H5FDmpiposix.c
@@ -37,15 +37,15 @@
 #define H5_INTERFACE_INIT_FUNC  H5FD_mpiposix_init_interface
 
 
-#include "H5private.h"    /* Generic Functions      */
-#include "H5ACprivate.h"  /* Metadata cache      */
-#include "H5Eprivate.h"    /* Error handling        */
-#include "H5Fprivate.h"    /* File access        */
-#include "H5FDprivate.h"  /* File drivers        */
-#include "H5FDmpi.h"            /* MPI-based file drivers    */
-#include "H5Iprivate.h"    /* IDs            */
-#include "H5MMprivate.h"  /* Memory management      */
-#include "H5Pprivate.h"         /* Property lists                       */
+#include "H5private.h"      /* Generic Functions            */
+#include "H5ACprivate.h"    /* Metadata cache               */
+#include "H5Eprivate.h"     /* Error handling               */
+#include "H5Fprivate.h"     /* File access                  */
+#include "H5FDprivate.h"    /* File drivers                 */
+#include "H5FDmpi.h"        /* MPI-based file drivers       */
+#include "H5Iprivate.h"     /* IDs                          */
+#include "H5MMprivate.h"    /* Memory management            */
+#include "H5Pprivate.h"     /* Property lists               */
 
 /* Features:
  *   H5_HAVE_GPFS   -- issue gpfs_fcntl() calls to hopefully improve
@@ -71,107 +71,101 @@
  */
 static hid_t H5FD_MPIPOSIX_g = 0;
 
-/* File operations */
-#define OP_UNKNOWN  0
-#define OP_READ    1
-#define OP_WRITE  2
+/* Since Windows doesn't follow the rest of the world when it comes
+ * to POSIX I/O types, some typedefs and constants are needed to avoid
+ * making the code messy with #ifdefs.
+ */
+#ifdef H5_HAVE_WIN32_API
+typedef unsigned int    h5_mpiposix_io_t;
+typedef int             h5_mpiposix_io_ret_t;
+static int H5_MPIPOSIX_MAX_IO_BYTES_g = INT_MAX;
+#else
+/* Unix, everyone else */
+typedef size_t          h5_mpiposix_io_t;
+typedef ssize_t         h5_mpiposix_io_ret_t;
+static size_t H5_MPIPOSIX_MAX_IO_BYTES_g = SSIZET_MAX;
+#endif /* H5_HAVE_WIN32_API */
 
 /*
  * The description of a file belonging to this driver.
- * The EOF value
- * is only used just after the file is opened in order for the library to
- * determine whether the file is empty, truncated, or okay. The MPIPOSIX driver
- * doesn't bother to keep it updated since it's an expensive operation.
+ * The EOF value is only used just after the file is opened in order for the
+ * library to determine whether the file is empty, truncated, or okay. The
+ * MPIPOSIX driver doesn't bother to keep it updated since it's an expensive
+ * operation.
  */
 typedef struct H5FD_mpiposix_t {
-    H5FD_t  pub;    /*public stuff, must be first    */
-    int    fd;    /*the unix file handle            */
-    MPI_Comm  comm;    /*communicator        */
-    int         mpi_rank;       /* This process's rank                  */
-    int         mpi_size;       /* Total number of processes            */
-    haddr_t	eof;		/*end-of-file marker			*/
-    haddr_t	eoa;		/*end-of-address marker			*/
-    haddr_t	last_eoa;	/* Last known end-of-address marker	*/
-    haddr_t	pos;		/* Current file I/O position	        */
-    int		op;		/* Last file I/O operation		*/
-    hsize_t	naccess;	/* Number of (write) accesses to file   */
+    H5FD_t          pub;            /* public stuff, must be first          */
+    int             fd;             /* the unix file handle                 */
+    MPI_Comm        comm;           /* communicator                         */
+    int             mpi_rank;       /* This process's rank                  */
+    int             mpi_size;       /* Total number of processes            */
+    haddr_t         eof;            /* end-of-file marker                   */
+    haddr_t         eoa;            /* end-of-address marker                */
+    haddr_t         last_eoa;       /* Last known end-of-address marker     */
+    haddr_t         pos;            /* Current file I/O position            */
+    H5FD_file_op_t  op;             /* Last file I/O operation              */
+    hsize_t         naccess;        /* Number of (write) accesses to file   */
 #ifdef H5_HAVE_GPFS
-    size_t      blksize;        /* Block size of file system            */
+    size_t          blksize;        /* Block size of file system            */
 #endif
-    hbool_t     use_gpfs;       /* Use GPFS to write things             */
+    hbool_t         use_gpfs;       /* Use GPFS to write things             */
 #ifndef H5_HAVE_WIN32_API
-    /*
-     * On most systems the combination of device and i-node number uniquely
-     * identify a file.
+    /* On most systems the combination of device and i-node number uniquely
+     * identify a file.  Note that Cygwin, MinGW and other Windows POSIX
+     * environments have the stat function (which fakes inodes)
+     * and will use the 'device + inodes' scheme as opposed to the
+     * Windows code further below.
      */
-    dev_t  device;    /*file device number    */
-    ino_t  inode;    /*file i-node number    */
+    dev_t           device;     /* file device number   */
+#ifdef H5_VMS
+    ino_t           inode[3];   /* file i-node number   */
 #else
-    /*
-     * On H5_HAVE_WIN32_API the low-order word of a unique identifier associated with the
-     * file and the volume serial number uniquely identify a file. This number
-     * (which, both? -rpm) may change when the system is restarted or when the
-     * file is opened. After a process opens a file, the identifier is
-     * constant until the file is closed. An application can use this
-     * identifier and the volume serial number to determine whether two
-     * handles refer to the same file.
+    ino_t           inode;      /* file i-node number   */
+#endif /* H5_VMS */
+#else
+    /* Files in windows are uniquely identified by the volume serial
+     * number and the file index (both low and high parts).
+     *
+     * There are caveats where these numbers can change, especially
+     * on FAT file systems.  On NTFS, however, a file should keep
+     * those numbers the same until renamed or deleted (though you
+     * can use ReplaceFile() on NTFS to keep the numbers the same
+     * while renaming).
+     *
+     * See the MSDN "BY_HANDLE_FILE_INFORMATION Structure" entry for
+     * more information.
+     *
+     * http://msdn.microsoft.com/en-us/library/aa363788(v=VS.85).aspx
      */
-    int fileindexlo;
-    int fileindexhi;
-#endif
+    DWORD           nFileIndexLow;
+    DWORD           nFileIndexHigh;
+    DWORD           dwVolumeSerialNumber;
+    
+    HANDLE          hFile;      /* Native windows file handle */
+#endif  /* H5_HAVE_WIN32_API */
 } H5FD_mpiposix_t;
 
 /*
- * This driver supports systems that have the lseek64() function by defining
- * some macros here so we don't have to have conditional compilations later
- * throughout the code.
- *
- * file_offset_t:  The datatype for file offsets, the second argument of
- *      the lseek() or lseek64() call.
- *
- * file_seek:    The function which adjusts the current file position,
- *      either lseek() or lseek64().
- */
-/* adding for windows NT file system support. */
-
-#ifdef H5_HAVE_LSEEK64
-#   define file_offset_t  off64_t
-#   define file_seek    lseek64
-#   define file_truncate  ftruncate64
-#elif defined (H5_HAVE_WIN32_API)
-# /*MSVC*/
-#   define file_offset_t __int64
-#   define file_seek _lseeki64
-#   define file_truncate  _ftruncatei64
-#else
-#   define file_offset_t  off_t
-#   define file_seek    HDlseek
-#   define file_truncate  HDftruncate
-#endif
-
-/*
  * These macros check for overflow of various quantities.  These macros
- * assume that file_offset_t is signed and haddr_t and size_t are unsigned.
+ * assume that HDoff_t is signed and haddr_t and size_t are unsigned.
  *
- * ADDR_OVERFLOW:  Checks whether a file address of type `haddr_t'
- *      is too large to be represented by the second argument
- *      of the file seek function.
+ * ADDR_OVERFLOW:   Checks whether a file address of type `haddr_t'
+ *                  is too large to be represented by the second argument
+ *                  of the file seek function.
  *
- * SIZE_OVERFLOW:  Checks whether a buffer size of type `hsize_t' is too
- *      large to be represented by the `size_t' type.
+ * SIZE_OVERFLOW:   Checks whether a buffer size of type `hsize_t' is too
+ *                  large to be represented by the `size_t' type.
  *
- * REGION_OVERFLOW:  Checks whether an address and size pair describe data
- *      which can be addressed entirely by the second
- *      argument of the file seek function.
+ * REGION_OVERFLOW: Checks whether an address and size pair describe data
+ *                  which can be addressed entirely by the second
+ *                  argument of the file seek function.
  */
-#define MAXADDR (((haddr_t)1<<(8*sizeof(file_offset_t)-1))-1)
-#define ADDR_OVERFLOW(A)  (HADDR_UNDEF==(A) ||            \
-         ((A) & ~(haddr_t)MAXADDR))
-#define SIZE_OVERFLOW(Z)  ((Z) & ~(hsize_t)MAXADDR)
-#define REGION_OVERFLOW(A,Z)  (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) ||      \
-         sizeof(file_offset_t)<sizeof(size_t) ||      \
-                                 HADDR_UNDEF==(A)+(Z) ||          \
-         (file_offset_t)((A)+(Z))<(file_offset_t)(A))
+#define MAXADDR                 (((haddr_t)1 << (8*sizeof(HDoff_t) - 1)) - 1)
+#define ADDR_OVERFLOW(A)        (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MAXADDR))
+#define SIZE_OVERFLOW(Z)        ((Z) & ~(hsize_t)MAXADDR)
+#define REGION_OVERFLOW(A,Z)    (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) ||    \
+                                    HADDR_UNDEF == (A) + (Z) ||             \
+                                    (HDoff_t)((A) + (Z)) < (HDoff_t)(A))
 
 /* Callbacks */
 static herr_t H5FD_mpiposix_term(void);
@@ -198,49 +192,49 @@ static MPI_Comm H5FD_mpiposix_communicator(const H5FD_t *_file);
 
 /* MPIPOSIX-specific file access properties */
 typedef struct H5FD_mpiposix_fapl_t {
-    hbool_t             use_gpfs;       /*use GPFS hints                */
-    MPI_Comm    comm;    /*communicator      */
+    hbool_t     use_gpfs;   /* use GPFS hints       */
+    MPI_Comm    comm;       /* communicator         */
 } H5FD_mpiposix_fapl_t;
 
 /* The MPIPOSIX file driver information */
 static const H5FD_class_mpi_t H5FD_mpiposix_g = {
     {   /* Start of superclass information */
-    "mpiposix",          /*name      */
-    MAXADDR,          /*maxaddr    */
-    H5F_CLOSE_SEMI,        /* fc_degree    */
-    H5FD_mpiposix_term,                         /*terminate             */
-    NULL,          /*sb_size    */
-    NULL,          /*sb_encode    */
-    NULL,          /*sb_decode    */
-    sizeof(H5FD_mpiposix_fapl_t),    /*fapl_size    */
-    H5FD_mpiposix_fapl_get,      /*fapl_get    */
-    H5FD_mpiposix_fapl_copy,      /*fapl_copy    */
-    H5FD_mpiposix_fapl_free,       /*fapl_free    */
-    0,            /*dxpl_size    */
-    NULL,          /*dxpl_copy    */
-    NULL,          /*dxpl_free    */
-    H5FD_mpiposix_open,        /*open      */
-    H5FD_mpiposix_close,      /*close      */
-    H5FD_mpiposix_cmp,              /*cmp      */
-    H5FD_mpiposix_query,            /*query      */
-    NULL,          /*get_type_map    */
-    NULL,          /*alloc      */
-    NULL,          /*free      */
-    H5FD_mpiposix_get_eoa,      /*get_eoa    */
-    H5FD_mpiposix_set_eoa,       /*set_eoa    */
-    H5FD_mpiposix_get_eof,      /*get_eof    */
-    H5FD_mpiposix_get_handle,                   /*get_handle            */
-    H5FD_mpiposix_read,				/*read			*/
-    H5FD_mpiposix_write,			/*write			*/
-    NULL,          /*flush      */
-    H5FD_mpiposix_truncate,			/*truncate		*/
-    NULL,                                       /*lock                  */
-    NULL,                                       /*unlock                */
-    H5FD_FLMAP_DICHOTOMY                        /*fl_map                */
+    "mpiposix",                     /* name             */
+    MAXADDR,                        /* maxaddr          */
+    H5F_CLOSE_SEMI,                 /* fc_degree        */
+    H5FD_mpiposix_term,             /* terminate        */
+    NULL,                           /* sb_size          */
+    NULL,                           /* sb_encode        */
+    NULL,                           /* sb_decode        */
+    sizeof(H5FD_mpiposix_fapl_t),   /* fapl_size        */
+    H5FD_mpiposix_fapl_get,         /* fapl_get         */
+    H5FD_mpiposix_fapl_copy,        /* fapl_copy        */
+    H5FD_mpiposix_fapl_free,        /* fapl_free        */
+    0,                              /* dxpl_size        */
+    NULL,                           /* dxpl_copy        */
+    NULL,                           /* dxpl_free        */
+    H5FD_mpiposix_open,             /* open             */
+    H5FD_mpiposix_close,            /* close            */
+    H5FD_mpiposix_cmp,              /* cmp              */
+    H5FD_mpiposix_query,            /* query            */
+    NULL,                           /* get_type_map     */
+    NULL,                           /* alloc            */
+    NULL,                           /* free             */
+    H5FD_mpiposix_get_eoa,          /* get_eoa          */
+    H5FD_mpiposix_set_eoa,          /* set_eoa          */
+    H5FD_mpiposix_get_eof,          /* get_eof          */
+    H5FD_mpiposix_get_handle,       /* get_handle       */
+    H5FD_mpiposix_read,             /* read             */
+    H5FD_mpiposix_write,            /* write            */
+    NULL,                           /* flush            */
+    H5FD_mpiposix_truncate,         /* truncate         */
+    NULL,                           /* lock             */
+    NULL,                           /* unlock           */
+    H5FD_FLMAP_SINGLE               /* fl_map           */
     },  /* End of superclass information */
-    H5FD_mpiposix_mpi_rank,                     /*get_rank              */
-    H5FD_mpiposix_mpi_size,                     /*get_size              */
-    H5FD_mpiposix_communicator                  /*get_comm              */
+    H5FD_mpiposix_mpi_rank,         /* get_rank         */
+    H5FD_mpiposix_mpi_size,         /* get_size         */
+    H5FD_mpiposix_communicator      /* get_comm         */
 };
 
 
@@ -267,34 +261,31 @@ H5FD_mpiposix_init_interface(void)
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_init
- *
- * Purpose:  Initialize this driver by registering the driver with the
- *    library.
+ * Function:    H5FD_mpiposix_init
  *
- * Return:  Success:  The driver ID for the mpiposix driver.
+ * Purpose:     Initialize this driver by registering the driver with the
+ *              library.
  *
- *    Failure:  Negative.
+ * Return:      Success:    The driver ID for the mpiposix driver.
+ *              Failure:    Negative.
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 hid_t
 H5FD_mpiposix_init(void)
 {
-    hid_t ret_value=H5FD_MPIPOSIX_g;    /* Return value */
+    hid_t ret_value = H5FD_MPIPOSIX_g;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    if (H5I_VFL!=H5Iget_type(H5FD_MPIPOSIX_g))
+    if (H5I_VFL != H5Iget_type(H5FD_MPIPOSIX_g))
         H5FD_MPIPOSIX_g = H5FD_register((const H5FD_class_t *)&H5FD_mpiposix_g,sizeof(H5FD_class_mpi_t),FALSE);
 
     /* Set return value */
-    ret_value=H5FD_MPIPOSIX_g;
+    ret_value = H5FD_MPIPOSIX_g;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -302,11 +293,11 @@ done:
 
 
 /*---------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_term
+ * Function:    H5FD_mpiposix_term
  *
- * Purpose:  Shut down the VFD
+ * Purpose:     Shut down the VFD
  *
- * Returns:     Non-negative on success or negative on failure
+ * Returns:     SUCCEED (can't fail)
  *
  * Programmer:  Quincey Koziol
  *              Friday, Jan 30, 2004
@@ -319,52 +310,41 @@ H5FD_mpiposix_term(void)
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     /* Reset VFL ID */
-    H5FD_MPIPOSIX_g=0;
+    H5FD_MPIPOSIX_g = 0;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5FD_mpiposix_term() */
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5Pset_fapl_mpiposix
+ * Function:    H5Pset_fapl_mpiposix
  *
- * Purpose:  Store the user supplied MPI communicator COMM in
- *    the file access property list FAPL_ID which can then be used
- *    to create and/or open the file.  This function is available
- *    only in the parallel HDF5 library and is not collective.
+ * Purpose:     Store the user supplied MPI communicator COMM in
+ *              the file access property list FAPL_ID which can then be used
+ *              to create and/or open the file.  This function is available
+ *              only in the parallel HDF5 library and is not collective.
  *
- *    comm is the MPI communicator to be used for file open as
- *    defined in MPI_FILE_OPEN of MPI-2. This function makes a
- *    duplicate of comm. Any modification to comm after this function
- *    call returns has no effect on the access property list.
+ *              comm is the MPI communicator to be used for file open as
+ *              defined in MPI_FILE_OPEN of MPI-2. This function makes a
+ *              duplicate of comm. Any modification to comm after this function
+ *              call returns has no effect on the access property list.
  *
  *              If fapl_id has previously set comm value, it will be replaced
  *              and the old communicator is freed.
  *
- * Return:  Success:  Non-negative
- *     Failure:  Negative
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:  Quincey Koziol
- *    Thursday, July 11, 2002
- *
- * Modifications:
- *    Albert Cheng, 2003-04-24
- *    Modified the description of the function that it now stores
- *    a duplicate of the communicator.  Free the old duplicate if
- *    previously set.  (Work is actually done by H5P_set_driver.)
- *
- *    Bill Wendling, 2003-05-01
- *    Modified to take an extra flag indicating that we should
- *    use the GPFS hints (if available) for this file.
+ *              Thursday, July 11, 2002
  *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5Pset_fapl_mpiposix(hid_t fapl_id, MPI_Comm comm, hbool_t use_gpfs)
 {
-    H5FD_mpiposix_fapl_t  fa;
-    H5P_genplist_t *plist;      /* Property list pointer */
-    herr_t ret_value;
+    H5FD_mpiposix_fapl_t    fa;
+    H5P_genplist_t          *plist;      /* Property list pointer */
+    herr_t                  ret_value;
 
     FUNC_ENTER_API(FAIL)
     H5TRACE3("e", "iMcb", fapl_id, comm, use_gpfs);
@@ -373,14 +353,14 @@ H5Pset_fapl_mpiposix(hid_t fapl_id, MPI_Comm comm, hbool_t use_gpfs)
     if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
         HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access list")
     if (MPI_COMM_NULL == comm)
-  HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a valid communicator")
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a valid communicator")
 
     /* Initialize driver specific properties */
     fa.comm = comm;
     fa.use_gpfs = use_gpfs;
 
     /* duplication is done during driver setting. */
-    ret_value= H5P_set_driver(plist, H5FD_MPIPOSIX, &fa);
+    ret_value = H5P_set_driver(plist, H5FD_MPIPOSIX, &fa);
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -388,57 +368,49 @@ done:
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5Pget_fapl_mpiposix
- *
- * Purpose:  If the file access property list is set to the H5FD_MPIPOSIX
- *    driver then this function returns a duplicate of the MPI
- *    communicator through the comm pointer. It is the responsibility
- *    of the application to free the returned communicator.
- *
- * Return:  Success:  Non-negative with the communicator and
- *        information returned through the COMM
- *        argument if non-null.  Since it is a duplicate
- *        of the stored object, future modifications to
- *        the access property list do not affect it and
- *        it is the responsibility of the application to
- *        free it.
- *
- *     Failure:  Negative
+ * Function:    H5Pget_fapl_mpiposix
+ *
+ * Purpose:     If the file access property list is set to the H5FD_MPIPOSIX
+ *              driver then this function returns a duplicate of the MPI
+ *              communicator through the comm pointer. It is the responsibility
+ *              of the application to free the returned communicator.
+ *
+ * Return:      Success:    Non-negative with the communicator and
+ *                          information returned through the COMM
+ *                          argument if non-null.  Since it is a duplicate
+ *                          of the stored object, future modifications to
+ *                          the access property list do not affect it and
+ *                          it is the responsibility of the application to
+ *                          free it.
+ *              Failure:    Negative
  *
  * Programmer:  Quincey Koziol
- *    Thursday, July 11, 2002
- *
- * Modifications:
- *    Albert Cheng, 2003-04-24
- *    Return duplicate of the stored communicator.
- *
- *              Bill Wendling, 2003-05-01
- *              Return the USE_GPFS flag.
+ *              Thursday, July 11, 2002
  *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5Pget_fapl_mpiposix(hid_t fapl_id, MPI_Comm *comm/*out*/, hbool_t *use_gpfs/*out*/)
 {
-    H5FD_mpiposix_fapl_t  *fa;
-    H5P_genplist_t *plist;      /* Property list pointer */
-    int    mpi_code;    /* mpi return code */
-    herr_t      ret_value=SUCCEED;      /* Return value */
+    H5FD_mpiposix_fapl_t    *fa;
+    H5P_genplist_t          *plist;                 /* Property list pointer    */
+    int                     mpi_code;               /* mpi return code          */
+    herr_t                  ret_value = SUCCEED;    /* Return value             */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE3("e", "ixx", fapl_id, comm, use_gpfs);
 
     if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
         HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access list")
-    if (H5FD_MPIPOSIX!=H5P_get_driver(plist))
+    if (H5FD_MPIPOSIX != H5P_get_driver(plist))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "incorrect VFL driver")
-    if (NULL==(fa=H5P_get_driver_info(plist)))
+    if (NULL == (fa = H5P_get_driver_info(plist)))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad VFL driver info")
 
     /* Get MPI Communicator */
     if (comm){
-  if (MPI_SUCCESS != (mpi_code=MPI_Comm_dup(fa->comm, comm)))
-      HMPI_GOTO_ERROR(FAIL, "MPI_Comm_dup failed", mpi_code)
+        if (MPI_SUCCESS != (mpi_code = MPI_Comm_dup(fa->comm, comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Comm_dup failed", mpi_code)
     }
 
     if (use_gpfs)
@@ -450,45 +422,39 @@ done:
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_fapl_get
- *
- * Purpose:  Returns a file access property list which could be used to
- *    create another file the same as this one.
+ * Function:    H5FD_mpiposix_fapl_get
  *
- * Return:  Success:  Ptr to new file access property list with all
- *        fields copied from the file pointer.
+ * Purpose:     Returns a file access property list which could be used to
+ *              create another file the same as this one.
  *
- *    Failure:  NULL
+ * Return:      Success:    Ptr to new file access property list with all
+ *                          fields copied from the file pointer.
+ *              Failure:    NULL
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *     Albert Cheng, 2003-04-24
- *     Duplicate the communicator object so that the new
- *     property list is insulated from the old one.
- *
  *-------------------------------------------------------------------------
  */
 static void *
 H5FD_mpiposix_fapl_get(H5FD_t *_file)
 {
-    H5FD_mpiposix_t  *file = (H5FD_mpiposix_t*)_file;
-    H5FD_mpiposix_fapl_t *fa = NULL;
-    int    mpi_code;  /* MPI return code */
-    void        *ret_value;     /* Return value */
+    H5FD_mpiposix_t         *file = (H5FD_mpiposix_t*)_file;
+    H5FD_mpiposix_fapl_t    *fa = NULL;
+    int                     mpi_code;       /* MPI return code */
+    void                    *ret_value;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
-    assert(file);
-    assert(H5FD_MPIPOSIX==file->pub.driver_id);
+    HDassert(file);
+    HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
 
-    if (NULL==(fa=H5MM_calloc(sizeof(H5FD_mpiposix_fapl_t))))
+    if (NULL == (fa = H5MM_calloc(sizeof(H5FD_mpiposix_fapl_t))))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
     /* Duplicate the communicator. */
     if (MPI_SUCCESS != (mpi_code=MPI_Comm_dup(file->comm, &fa->comm)))
-  HMPI_GOTO_ERROR(NULL, "MPI_Comm_dup failed", mpi_code)
+        HMPI_GOTO_ERROR(NULL, "MPI_Comm_dup failed", mpi_code)
 
     fa->use_gpfs = file->use_gpfs;
 
@@ -501,19 +467,16 @@ done:
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_fapl_copy
+ * Function:    H5FD_mpiposix_fapl_copy
  *
- * Purpose:  Copies the mpiposix-specific file access properties.
+ * Purpose:     Copies the mpiposix-specific file access properties.
  *
- * Return:  Success:  Ptr to a new property list
- *
- *    Failure:  NULL
+ * Return:      Success:    Ptr to a new property list
+ *              Failure:    NULL
  *
  * Programmer:  Albert Cheng
  *              Apr 24, 2003
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static void *
@@ -526,24 +489,24 @@ H5FD_mpiposix_fapl_copy(const void *_old_fa)
 
     FUNC_ENTER_NOAPI_NOINIT
 
-    if (NULL==(new_fa=H5MM_malloc(sizeof(H5FD_mpiposix_fapl_t))))
+    if (NULL == (new_fa = H5MM_malloc(sizeof(H5FD_mpiposix_fapl_t))))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
     /* Copy the general information */
     HDmemcpy(new_fa, old_fa, sizeof(H5FD_mpiposix_fapl_t));
 
     /* Duplicate communicator. */
-    if (MPI_SUCCESS != (mpi_code=MPI_Comm_dup(old_fa->comm, &new_fa->comm)))
-  HMPI_GOTO_ERROR(NULL, "MPI_Comm_dup failed", mpi_code)
+    if (MPI_SUCCESS != (mpi_code = MPI_Comm_dup(old_fa->comm, &new_fa->comm)))
+        HMPI_GOTO_ERROR(NULL, "MPI_Comm_dup failed", mpi_code)
 
     new_fa->use_gpfs = old_fa->use_gpfs;
     ret_value = new_fa;
 
 done:
     if (NULL == ret_value){
-  /* cleanup */
-  if (new_fa)
-      H5MM_xfree(new_fa);
+        /* cleanup */
+        if (new_fa)
+            H5MM_xfree(new_fa);
     }
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -551,19 +514,15 @@ done:
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_fapl_free
+ * Function:    H5FD_mpiposix_fapl_free
  *
- * Purpose:  Frees the mpiposix-specific file access properties.
+ * Purpose:     Frees the mpiposix-specific file access properties.
  *
- * Return:  Success:  0
- *
- *    Failure:  -1
+ * Return:      SUCCEED (can't fail)
  *
  * Programmer:  Albert Cheng
  *              Apr 24, 2003
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -573,10 +532,10 @@ H5FD_mpiposix_fapl_free(void *_fa)
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    assert(fa);
+    HDassert(fa);
 
     /* Free the internal communicator */
-    assert(MPI_COMM_NULL!=fa->comm);
+    HDassert(MPI_COMM_NULL != fa->comm);
     MPI_Comm_free(&fa->comm);
     H5MM_xfree(fa);
 
@@ -588,53 +547,46 @@ H5FD_mpiposix_fapl_free(void *_fa)
  * Function:    H5FD_mpiposix_open
  *
  * Purpose:     Opens a file with name NAME.  The FLAGS are a bit field with
- *    purpose similar to the second argument of open(2) and which
- *    are defined in H5Fpublic.h. The file access property list
- *    FAPL_ID contains the properties driver properties and MAXADDR
- *    is the largest address which this file will be expected to
- *    access.  This is collective.
+ *              purpose similar to the second argument of open(2) and which
+ *              are defined in H5Fpublic.h. The file access property list
+ *              FAPL_ID contains the properties driver properties and MAXADDR
+ *              is the largest address which this file will be expected to
+ *              access.  This is collective.
  *
- * Return:      Success:        A new file pointer.
- *              Failure:        NULL
+ * Return:      Success:    A new file pointer.
+ *              Failure:    NULL
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *     Albert Cheng, 2003-04-24
- *     Duplicate the communicator so that file is insulated from the
- *     old one.
- *
  *-------------------------------------------------------------------------
  */
 static H5FD_t *
 H5FD_mpiposix_open(const char *name, unsigned flags, hid_t fapl_id,
          haddr_t maxaddr)
 {
-    H5FD_mpiposix_t    *file=NULL;     /* New MPIPOSIX file struct */
-    int                         o_flags;        /* Flags for file open call */
-    int              fd=(-1);        /* File handle for file opened */
-    int        mpi_rank;       /* MPI rank of this process */
-    int        mpi_size;       /* Total number of MPI processes */
-    int        mpi_code;  /* mpi return code */
-    const H5FD_mpiposix_fapl_t  *fa=NULL;       /* MPIPOSIX file access property list information */
-    H5FD_mpiposix_fapl_t  _fa;            /* Private copy of default file access property list information */
-    H5P_genplist_t              *plist;         /* Property list pointer */
-    h5_stat_t                   sb;             /* Portable 'stat' struct */
+    H5FD_mpiposix_t *file = NULL;   /* New MPIPOSIX file struct         */
+    int             o_flags;        /* Flags for file open call         */
+    int             fd = -1;        /* File handle for file opened      */
+    int             mpi_rank;       /* MPI rank of this process         */
+    int             mpi_size;       /* Total number of MPI processes    */
+    int             mpi_code;       /* mpi return code                  */
+    const H5FD_mpiposix_fapl_t  *fa = NULL;     /* MPIPOSIX file access property list information                   */
+    H5FD_mpiposix_fapl_t        _fa;            /* Private copy of default file access property list information    */
+    H5P_genplist_t  *plist;         /* Property list pointer            */
+    h5_stat_t       sb;             /* Portable 'stat' struct           */
 #ifdef H5_HAVE_WIN32_API
-    HFILE filehandle;
     struct _BY_HANDLE_FILE_INFORMATION fileinfo;
-    int results;
 #endif
-    H5FD_t                     *ret_value=NULL; /* Return value */
-    MPI_Comm                    comm_dup=MPI_COMM_NULL;
+    H5FD_t          *ret_value = NULL; /* Return value */
+    MPI_Comm        comm_dup = MPI_COMM_NULL;
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Check arguments */
     if (!name || !*name)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name")
-    if (0==maxaddr || HADDR_UNDEF==maxaddr)
+    if (0 == maxaddr || HADDR_UNDEF == maxaddr)
         HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr")
     if (ADDR_OVERFLOW(maxaddr))
         HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr")
@@ -642,31 +594,31 @@ H5FD_mpiposix_open(const char *name, unsigned flags, hid_t fapl_id,
     /* Obtain a pointer to mpiposix-specific file access properties */
     if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
-    if (H5P_FILE_ACCESS_DEFAULT==fapl_id || H5FD_MPIPOSIX!=H5P_get_driver(plist)) {
-  _fa.comm = MPI_COMM_SELF; /*default*/
+    if (H5P_FILE_ACCESS_DEFAULT == fapl_id || H5FD_MPIPOSIX != H5P_get_driver(plist)) {
+        _fa.comm = MPI_COMM_SELF; /*default*/
         _fa.use_gpfs = FALSE;
-  fa = &_fa;
+        fa = &_fa;
     } /* end if */
     else {
-  fa = H5P_get_driver_info(plist);
-  assert(fa);
+        fa = H5P_get_driver_info(plist);
+        HDassert(fa);
     } /* end else */
 
     /* Duplicate the communicator for use by this file. */
-    if (MPI_SUCCESS != (mpi_code=MPI_Comm_dup(fa->comm, &comm_dup)))
-  HMPI_GOTO_ERROR(NULL, "MPI_Comm_dup failed", mpi_code)
+    if (MPI_SUCCESS != (mpi_code = MPI_Comm_dup(fa->comm, &comm_dup)))
+        HMPI_GOTO_ERROR(NULL, "MPI_Comm_dup failed", mpi_code)
 
     /* Get the MPI rank of this process and the total number of processes */
-    if (MPI_SUCCESS != (mpi_code=MPI_Comm_rank (comm_dup, &mpi_rank)))
+    if (MPI_SUCCESS != (mpi_code = MPI_Comm_rank (comm_dup, &mpi_rank)))
         HMPI_GOTO_ERROR(NULL, "MPI_Comm_rank failed", mpi_code)
-    if (MPI_SUCCESS != (mpi_code=MPI_Comm_size (comm_dup, &mpi_size)))
+    if (MPI_SUCCESS != (mpi_code = MPI_Comm_size (comm_dup, &mpi_size)))
         HMPI_GOTO_ERROR(NULL, "MPI_Comm_size failed", mpi_code)
 
     /* Build the open flags */
     o_flags = (H5F_ACC_RDWR & flags) ? O_RDWR : O_RDONLY;
 
     /* Only set the creation flag(s) for process 0 */
-    if(mpi_rank==0) {
+    if(0 == mpi_rank) {
         if (H5F_ACC_TRUNC & flags)
             o_flags |= O_TRUNC;
         if (H5F_ACC_CREAT & flags)
@@ -680,13 +632,14 @@ H5FD_mpiposix_open(const char *name, unsigned flags, hid_t fapl_id,
      * open (never create) the file and all processes proceed.
      */
     /* Process 0 opens (or creates) file and broadcasts result to other processes */
-    if(mpi_rank==0) {
+    if(0 == mpi_rank) {
         /* Open the file */
-        fd=HDopen(name, o_flags, 0666);
+        fd = HDopen(name, o_flags, 0666);
     } /* end if */
 
-    /* Broadcast the results of the open() from process 0 */
-    /* This is necessary because of the "tentative open" code in H5F_open()
+    /* Broadcast the results of the open() from process 0
+     *
+     * This is necessary because of the "tentative open" code in H5F_open()
      * where the file is attempted to be opened with different flags from the
      * user's, in order to check for the file's existence, etc.  Here, process 0
      * gets different flags from the other processes (since it is in charge of
@@ -698,34 +651,36 @@ H5FD_mpiposix_open(const char *name, unsigned flags, hid_t fapl_id,
         HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code)
 
     /* If the file open on process 0 failed, bail out on all processes now */
-    if(fd<0)
+    if(fd < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file")
 
     /* Other processes (non 0) wait for broadcast result from process 0 and then open file */
-    if(mpi_rank!=0) {
+    if(mpi_rank != 0) {
         /* Open the file */
-        if ((fd=HDopen(name, o_flags, 0666))<0)
+        if ((fd = HDopen(name, o_flags, 0666)) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file")
     } /* end if */
 
     /* Process 0 fstat()s the file and broadcasts the results to the other processes */
-    if(mpi_rank==0) {
+    if(0 == mpi_rank) {
         /* Get the stat information */
-        if (HDfstat(fd, &sb)<0)
+        if (HDfstat(fd, &sb) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_BADFILE, NULL, "unable to fstat file")
     } /* end if */
 
     /* Broadcast the results of the fstat() from process 0 */
-    if (MPI_SUCCESS != (mpi_code= MPI_Bcast(&sb, sizeof(h5_stat_t), MPI_BYTE, 0, comm_dup)))
+    if (MPI_SUCCESS != (mpi_code = MPI_Bcast(&sb, sizeof(h5_stat_t), MPI_BYTE, 0, comm_dup)))
         HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code)
 
 #ifdef H5_HAVE_GPFS
     if (fa->use_gpfs) {
         /*
-         * Free all byte range tokens. This is a good thing to do if raw data is aligned on 256kB boundaries (a GPFS page is
-         * 256kB). Care should be taken that there aren't too many sub-page writes, or the mmfsd may become overwhelmed.  This
-         * should probably eventually be passed down here as a property. The gpfs_fcntl() will most likely fail if `fd' isn't
-         * on a GPFS file system. */
+         * Free all byte range tokens. This is a good thing to do if raw data
+         * is aligned on 256kB boundaries (a GPFS page is 256kB). Care should
+         * be taken that there aren't too many sub-page writes, or the mmfsd
+         * may become overwhelmed.  This should probably eventually be passed
+         * down here as a property. The gpfs_fcntl() will most likely fail if
+         * 'fd' isn't on a GPFS file system. */
         struct {
             gpfsFcntlHeader_t   hdr;
             gpfsFreeRange_t     fr;
@@ -738,13 +693,13 @@ H5FD_mpiposix_open(const char *name, unsigned flags, hid_t fapl_id,
         hint.fr.start = 0;
         hint.fr.length = 0;
 
-        if (gpfs_fcntl(fd, &hint)<0)
+        if (gpfs_fcntl(fd, &hint) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_FCNTL, NULL, "failed to send hints to GPFS")
     }
 #endif  /* H5_HAVE_GPFS */
 
     /* Build the file struct and initialize it */
-    if (NULL==(file=H5MM_calloc(sizeof(H5FD_mpiposix_t))))
+    if (NULL == (file=H5MM_calloc(sizeof(H5FD_mpiposix_t))))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
 #ifdef REPORT_IO
@@ -755,8 +710,9 @@ H5FD_mpiposix_open(const char *name, unsigned flags, hid_t fapl_id,
     file->fd = fd;
     file->eof = sb.st_size;
 
-    /* for H5_HAVE_WIN32_API support. H5_HAVE_WIN32_API 'stat' does not have st_blksize and st_blksize
-       is only used for the H5_HAVE_GPFS case */
+    /* for H5_HAVE_WIN32_API support. H5_HAVE_WIN32_API 'stat' does not have
+     * st_blksize and st_blksize is only used for the H5_HAVE_GPFS case.
+     */
 #ifdef H5_HAVE_GPFS
     file->blksize = sb.st_blksize;
 #endif
@@ -775,26 +731,38 @@ H5FD_mpiposix_open(const char *name, unsigned flags, hid_t fapl_id,
 
     /* Set the information for the file's device and inode */
 #ifdef H5_HAVE_WIN32_API
-    filehandle = _get_osfhandle(fd);
-    results = GetFileInformationByHandle((HANDLE)filehandle, &fileinfo);
-    file->fileindexhi = fileinfo.nFileIndexHigh;
-    file->fileindexlo = fileinfo.nFileIndexLow;
-#else
+    file->hFile = (HANDLE)_get_osfhandle(fd);
+    if(INVALID_HANDLE_VALUE == file->hFile)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to get Windows file handle")
+
+    if(!GetFileInformationByHandle((HANDLE)file->hFile, &fileinfo))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to get Windows file information")
+
+    file->nFileIndexHigh = fileinfo.nFileIndexHigh;
+    file->nFileIndexLow = fileinfo.nFileIndexLow;
+    file->dwVolumeSerialNumber = fileinfo.dwVolumeSerialNumber;
+#else /* H5_HAVE_WIN32_API */
     file->device = sb.st_dev;
+#ifdef H5_VMS
+    file->inode[0] = sb.st_ino[0];
+    file->inode[1] = sb.st_ino[1];
+    file->inode[2] = sb.st_ino[2];
+#else /* H5_VMS */
     file->inode = sb.st_ino;
-#endif
+#endif /* H5_VMS */
+#endif /* H5_HAVE_WIN32_API */
 
     /* Indicate success */
-    ret_value=(H5FD_t *)file;
+    ret_value = (H5FD_t *)file;
 
 done:
     /* Error cleanup */
-    if(ret_value==NULL) {
+    if(NULL == ret_value) {
         /* Close the file if it was left open */
-        if(fd!=(-1))
+        if(fd != -1)
             HDclose(fd);
-  if (MPI_COMM_NULL != comm_dup)
-      MPI_Comm_free(&comm_dup);
+        if (MPI_COMM_NULL != comm_dup)
+            MPI_Comm_free(&comm_dup);
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -806,30 +774,26 @@ done:
  *
  * Purpose:     Closes a file.
  *
- * Return:      Success:  Non-negative
- *     Failure:  Negative
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *     Albert Cheng, 2003-04-24
- *    Free the communicator stored.
  *-------------------------------------------------------------------------
  */
 static herr_t
 H5FD_mpiposix_close(H5FD_t *_file)
 {
-    H5FD_mpiposix_t  *file = (H5FD_mpiposix_t*)_file;
-    herr_t      ret_value=SUCCEED;       /* Return value */
+    H5FD_mpiposix_t     *file = (H5FD_mpiposix_t*)_file;
+    herr_t              ret_value = SUCCEED;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
-    assert(file);
-    assert(H5FD_MPIPOSIX==file->pub.driver_id);
+    HDassert(file);
+    HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
 
     /* Close the unix file */
-    if (HDclose(file->fd)<0)
+    if(HDclose(file->fd) < 0)
         HGOTO_ERROR(H5E_IO, H5E_CANTCLOSEFILE, FAIL, "unable to close file")
 
     /* make sure all processes have closed the file before returning. */
@@ -844,20 +808,17 @@ done:
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_cmp
+ * Function:    H5FD_mpiposix_cmp
  *
- * Purpose:  Compares two files belonging to this driver using an
- *    arbitrary (but consistent) ordering.
+ * Purpose:     Compares two files belonging to this driver using an
+ *              arbitrary (but consistent) ordering.
  *
- * Return:  Success:  A value like strcmp()
- *    Failure:  never fails (arguments were checked by the
- *        caller).
+ * Return:      Success:    A value like strcmp()
+ *              Failure:    never fails (arguments were checked by the caller).
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static int
@@ -865,33 +826,39 @@ H5FD_mpiposix_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
 {
     const H5FD_mpiposix_t  *f1 = (const H5FD_mpiposix_t*)_f1;
     const H5FD_mpiposix_t  *f2 = (const H5FD_mpiposix_t*)_f2;
-    int ret_value=0;
+    int ret_value = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
 #ifdef H5_HAVE_WIN32_API
-    if (f1->fileindexhi < f2->fileindexhi) HGOTO_DONE(-1)
-    if (f1->fileindexhi > f2->fileindexhi) HGOTO_DONE(1)
+    if(f1->dwVolumeSerialNumber < f2->dwVolumeSerialNumber) HGOTO_DONE(-1)
+    if(f1->dwVolumeSerialNumber > f2->dwVolumeSerialNumber) HGOTO_DONE(1)
 
-    if (f1->fileindexlo < f2->fileindexlo) HGOTO_DONE(-1)
-    if (f1->fileindexlo > f2->fileindexlo) HGOTO_DONE(1)
+    if(f1->nFileIndexHigh < f2->nFileIndexHigh) HGOTO_DONE(-1)
+    if(f1->nFileIndexHigh > f2->nFileIndexHigh) HGOTO_DONE(1)
 
-#else
+    if(f1->nFileIndexLow < f2->nFileIndexLow) HGOTO_DONE(-1)
+    if(f1->nFileIndexLow > f2->nFileIndexLow) HGOTO_DONE(1)
+#else /* H5_HAVE_WIN32_API */
 #ifdef H5_DEV_T_IS_SCALAR
-    if (f1->device < f2->device) HGOTO_DONE(-1)
-    if (f1->device > f2->device) HGOTO_DONE(1)
+    if(f1->device < f2->device) HGOTO_DONE(-1)
+    if(f1->device > f2->device) HGOTO_DONE(1)
 #else /* H5_DEV_T_IS_SCALAR */
     /* If dev_t isn't a scalar value on this system, just use memcmp to
      * determine if the values are the same or not.  The actual return value
      * shouldn't really matter...
      */
-    if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t))<0) HGOTO_DONE(-1)
-    if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t))>0) HGOTO_DONE(1)
+    if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t)) < 0) HGOTO_DONE(-1)
+    if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t)) > 0) HGOTO_DONE(1)
 #endif /* H5_DEV_T_IS_SCALAR */
-
-    if (f1->inode < f2->inode) HGOTO_DONE(-1)
-    if (f1->inode > f2->inode) HGOTO_DONE(1)
-#endif
+#ifdef H5_VMS
+    if(HDmemcmp(&(f1->inode), &(f2->inode), 3 * sizeof(ino_t)) < 0) HGOTO_DONE(-1)
+    if(HDmemcmp(&(f1->inode), &(f2->inode), 3 * sizeof(ino_t)) > 0) HGOTO_DONE(1)
+#else /* H5_VMS */
+    if(f1->inode < f2->inode) HGOTO_DONE(-1)
+    if(f1->inode > f2->inode) HGOTO_DONE(1)
+#endif /* H5_VMS */
+#endif /* H5_HAVE_WIN32_API */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -899,25 +866,16 @@ done:
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_query
+ * Function:    H5FD_mpiposix_query
  *
- * Purpose:  Set the flags that this VFL driver is capable of supporting.
+ * Purpose:     Set the flags that this VFL driver is capable of supporting.
  *              (listed in H5FDpublic.h)
  *
- * Return:  Success:  non-negative
- *    Failure:  negative
+ * Return:      SUCCEED (can't fail)
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *
- *              John Mainzer -- 9/21/05
- *              Modified code to turn off the
- *              H5FD_FEAT_ACCUMULATE_METADATA_WRITE flag.
- *    With the movement of all cache writes to process 0,
- *    this flag has become problematic in PHDF5.
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -928,10 +886,10 @@ H5FD_mpiposix_query(const H5FD_t UNUSED *_file, unsigned long *flags /* out */)
     /* Set the VFL feature flags that this driver supports */
     if(flags) {
         *flags=0;
-        *flags|=H5FD_FEAT_AGGREGATE_METADATA;  /* OK to aggregate metadata allocations */
-        *flags|=H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
-        *flags|=H5FD_FEAT_HAS_MPI;             /* This driver uses MPI */
-        *flags|=H5FD_FEAT_ALLOCATE_EARLY;      /* Allocate space early instead of late */
+        *flags |= H5FD_FEAT_AGGREGATE_METADATA;  /* OK to aggregate metadata allocations */
+        *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
+        *flags |= H5FD_FEAT_HAS_MPI;             /* This driver uses MPI */
+        *flags |= H5FD_FEAT_ALLOCATE_EARLY;      /* Allocate space early instead of late */
     } /* end if */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
@@ -939,23 +897,18 @@ H5FD_mpiposix_query(const H5FD_t UNUSED *_file, unsigned long *flags /* out */)
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_get_eoa
+ * Function:    H5FD_mpiposix_get_eoa
  *
- * Purpose:  Gets the end-of-address marker for the file. The EOA marker
- *    is the first address past the last byte allocated in the
- *    format address space.
+ * Purpose:     Gets the end-of-address marker for the file. The EOA marker
+ *              is the first address past the last byte allocated in the
+ *              format address space.
  *
- * Return:  Success:  The end-of-address marker.
- *    Failure:  HADDR_UNDEF
+ * Return:      Success:    The end-of-address marker.
+ *              Failure:    HADDR_UNDEF
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *              Raymond Lu
- *              21 Dec. 2006
- *              Added the parameter TYPE.  It's only used for MULTI driver.
- *
  *-------------------------------------------------------------------------
  */
 static haddr_t
@@ -965,31 +918,25 @@ H5FD_mpiposix_get_eoa(const H5FD_t *_file, H5FD_mem_t UNUSED type)
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    assert(file);
-    assert(H5FD_MPIPOSIX==file->pub.driver_id);
+    HDassert(file);
+    HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
 
     FUNC_LEAVE_NOAPI(file->eoa)
 } /* end H5FD_mpiposix_get_eoa() */
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_set_eoa
+ * Function:    H5FD_mpiposix_set_eoa
  *
- * Purpose:  Set the end-of-address marker for the file. This function is
- *    called shortly after an existing HDF5 file is opened in order
- *    to tell the driver where the end of the HDF5 data is located.
+ * Purpose:     Set the end-of-address marker for the file. This function is
+ *              called shortly after an existing HDF5 file is opened in order
+ *              to tell the driver where the end of the HDF5 data is located.
  *
- * Return:  Success:  non-negative
- *    Failure:  negative
+ * Return:      SUCCEED (can't fail)
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *              Raymond Lu
- *              21 Dec. 2006
- *              Added the parameter TYPE.  It's only used for MULTI driver.
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -999,8 +946,8 @@ H5FD_mpiposix_set_eoa(H5FD_t *_file, H5FD_mem_t UNUSED type, haddr_t addr)
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    assert(file);
-    assert(H5FD_MPIPOSIX==file->pub.driver_id);
+    HDassert(file);
+    HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
 
     file->eoa = addr;
 
@@ -1009,25 +956,23 @@ H5FD_mpiposix_set_eoa(H5FD_t *_file, H5FD_mem_t UNUSED type, haddr_t addr)
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_get_eof
+ * Function:    H5FD_mpiposix_get_eof
  *
- * Purpose:  Gets the end-of-file marker for the file. The EOF marker
- *    is the real size of the file.
+ * Purpose:     Gets the end-of-file marker for the file. The EOF marker
+ *              is the real size of the file.
  *
- *    The MPIPOSIX driver doesn't bother keeping this field updated
- *    since that's a relatively expensive operation. Fortunately
- *    the library only needs the EOF just after the file is opened
- *    in order to determine whether the file is empty, truncated,
- *    or okay.
+ *              The MPIPOSIX driver doesn't bother keeping this field updated
+ *              since that's a relatively expensive operation. Fortunately
+ *              the library only needs the EOF just after the file is opened
+ *              in order to determine whether the file is empty, truncated,
+ *              or okay.
  *
- * Return:  Success:  The end-of-address marker.
- *    Failure:  HADDR_UNDEF
+ * Return:      Success:    The end-of-address marker.
+ *              Failure:    HADDR_UNDEF
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static haddr_t
@@ -1037,10 +982,10 @@ H5FD_mpiposix_get_eof(const H5FD_t *_file)
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    assert(file);
-    assert(H5FD_MPIPOSIX==file->pub.driver_id);
+    HDassert(file);
+    HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
 
-    FUNC_LEAVE_NOAPI(MAX(file->eof,file->eoa))
+    FUNC_LEAVE_NOAPI(MAX(file->eof, file->eoa))
 } /* end H5FD_mpiposix_get_eof() */
 
 
@@ -1049,13 +994,11 @@ H5FD_mpiposix_get_eof(const H5FD_t *_file)
  *
  * Purpose:        Returns the file handle of MPI-POSIX file driver.
  *
- * Returns:        Non-negative if succeed or negative if fails.
+ * Returns:        SUCCEED/FAIL
  *
  * Programmer:     Raymond Lu
  *                 Sept. 16, 2002
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1077,43 +1020,41 @@ done:
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_read
+ * Function:    H5FD_mpiposix_read
  *
- * Purpose:  Reads SIZE bytes of data from FILE beginning at address ADDR
- *    into buffer BUF according to data transfer properties in
- *    DXPL_ID using potentially complex file and buffer types to
- *    effect the transfer.
+ * Purpose:     Reads SIZE bytes of data from FILE beginning at address ADDR
+ *              into buffer BUF according to data transfer properties in
+ *              DXPL_ID using potentially complex file and buffer types to
+ *              effect the transfer.
  *
- *    Reading past the end of the file returns zeros instead of
- *    failing.
+ *              Reading past the end of the file returns zeros instead of
+ *              failing.
  *
- * Return:  Success:  Non-negative. Result is stored in caller-supplied
- *        buffer BUF.
- *    Failure:  Negative, Contents of buffer BUF are undefined.
+ * Return:      Success:    Non-negative. Result is stored in caller-supplied
+ *                          buffer BUF.
+ *              Failure:    Negative, Contents of buffer BUF are undefined.
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_mpiposix_read(H5FD_t *_file, H5FD_mem_t UNUSED type, hid_t UNUSED dxpl_id, haddr_t addr, size_t size,
-         void *buf/*out*/)
+H5FD_mpiposix_read(H5FD_t *_file, H5FD_mem_t UNUSED type, hid_t UNUSED dxpl_id,
+        haddr_t addr, size_t size, void *buf/*out*/)
 {
-    H5FD_mpiposix_t  *file = (H5FD_mpiposix_t*)_file;
-    ssize_t          nbytes;         /* Number of bytes read each I/O call */
-    herr_t               ret_value=SUCCEED;
+    H5FD_mpiposix_t *file = (H5FD_mpiposix_t*)_file;
+    ssize_t         nbytes;         /* Number of bytes read each I/O call */
+    herr_t          ret_value = SUCCEED;
 
     FUNC_ENTER_NOAPI_NOINIT
 
-    assert(file);
-    assert(H5FD_MPIPOSIX==file->pub.driver_id);
-    assert(buf);
+    HDassert(file);
+    HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
+    HDassert(buf);
 
     /* Check for overflow conditions */
-    if (HADDR_UNDEF==addr)
+    if (HADDR_UNDEF == addr)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined")
     if (REGION_OVERFLOW(addr, size))
         HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow")
@@ -1130,31 +1071,52 @@ H5FD_mpiposix_read(H5FD_t *_file, H5FD_mem_t UNUSED type, hid_t UNUSED dxpl_id,
 #endif
 
     /* Seek to the correct location */
-    if ((addr!=file->pos || OP_READ!=file->op) &&
-            file_seek(file->fd, (file_offset_t)addr, SEEK_SET)<0)
-        HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+    if(addr != file->pos || OP_READ != file->op) {
+        if(HDlseek(file->fd, (HDoff_t)addr, SEEK_SET) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+    } /* end if */
 
-    /*
-     * Read data, being careful of interrupted system calls, partial results,
+    /* Read data, being careful of interrupted system calls, partial results,
      * and the end of the file.
      */
-    while (size>0) {
+    while(size > 0) {
+
+        h5_mpiposix_io_t        bytes_in    = 0;    /* # of bytes to read       */
+        h5_mpiposix_io_ret_t    bytes_read  = -1;   /* # of bytes actually read */ 
+
+        /* Trying to read more bytes than the return type can handle is
+         * undefined behavior in POSIX.
+         */
+        if(size > H5_MPIPOSIX_MAX_IO_BYTES_g)
+            bytes_in = H5_MPIPOSIX_MAX_IO_BYTES_g;
+        else
+            bytes_in = (h5_mpiposix_io_t)size;
+
         do {
-            nbytes = HDread(file->fd, buf, size);
-        } while (-1==nbytes && EINTR==errno);
-        if (-1==nbytes)
-            HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed")
-        if (0==nbytes) {
+            bytes_read = HDread(file->fd, buf, bytes_in);
+        } while(-1 == bytes_read && EINTR == errno);
+        
+        if(-1 == bytes_read) { /* error */
+            int myerrno = errno;
+            time_t mytime = HDtime(NULL);
+            HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
+
+            HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed: time = %s, file descriptor = %d, errno = %d, error message = '%s', buf = %p, size = %lu, offset = %llu", HDctime(&mytime), file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long)size, (unsigned long long)myoffset);
+        } /* end if */
+        
+        if(0 == bytes_read) {
             /* end of file but not end of format address space */
             HDmemset(buf, 0, size);
             break;
         } /* end if */
-        assert(nbytes>=0);
-        assert((size_t)nbytes<=size);
-        size -= nbytes;
-        addr += (haddr_t)nbytes;
-        buf = (char*)buf + nbytes;
-    }
+        
+        HDassert(bytes_read >= 0);
+        HDassert((size_t)bytes_read <= size);
+        
+        size -= (size_t)bytes_read;
+        addr += (haddr_t)bytes_read;
+        buf = (char *)buf + bytes_read;
+    } /* end while */
 
     /* Update current position */
     file->pos = addr;
@@ -1162,7 +1124,7 @@ H5FD_mpiposix_read(H5FD_t *_file, H5FD_mem_t UNUSED type, hid_t UNUSED dxpl_id,
 
 done:
     /* Check for error */
-    if(ret_value<0) {
+    if(ret_value < 0) {
         /* Reset last file I/O information */
         file->pos = HADDR_UNDEF;
         file->op = OP_UNKNOWN;
@@ -1173,55 +1135,46 @@ done:
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_write
+ * Function:    H5FD_mpiposix_write
  *
- * Purpose:  Writes SIZE bytes of data to FILE beginning at address ADDR
- *    from buffer BUF according to data transfer properties in
- *    DXPL_ID using potentially complex file and buffer types to
- *    effect the transfer.
+ * Purpose:     Writes SIZE bytes of data to FILE beginning at address ADDR
+ *              from buffer BUF according to data transfer properties in
+ *              DXPL_ID using potentially complex file and buffer types to
+ *              effect the transfer.
  *
- * Return:  Success:  non-negative
- *    Failure:  negative
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *
- *              Quincey Koziol - 2002/07/18
- *              Added "block_before_meta_write" dataset transfer flag, which
- *              is set during writes from a metadata cache flush and indicates
- *              that all the processes must sync up before (one of them)
- *              writing metadata.
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
 H5FD_mpiposix_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
     size_t size, const void *buf)
 {
-    H5FD_mpiposix_t  *file = (H5FD_mpiposix_t*)_file;
+    H5FD_mpiposix_t *file = (H5FD_mpiposix_t*)_file;
 #if 0 /* JRM */
     int      mpi_code;  /* MPI return code */
 #endif /* JRM */
-    ssize_t          nbytes;         /* Number of bytes written each I/O call */
-    H5P_genplist_t      *plist;         /* Property list pointer */
-    herr_t               ret_value=SUCCEED;      /* Return value */
+    ssize_t         nbytes;                 /* Number of bytes written each I/O call    */
+    H5P_genplist_t  *plist;                 /* Property list pointer                    */
+    herr_t          ret_value = SUCCEED;    /* Return value                             */
 
     FUNC_ENTER_NOAPI_NOINIT
 
-    assert(file);
-    assert(H5FD_MPIPOSIX==file->pub.driver_id);
-    assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id));
-    assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER));
-    assert(buf);
+    HDassert(file);
+    HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
+    HDassert(H5I_GENPROP_LST == H5I_get_type(dxpl_id));
+    HDassert(TRUE == H5P_isa_class(dxpl_id,H5P_DATASET_XFER));
+    HDassert(buf);
 
     /* Check for overflow conditions */
-    if (HADDR_UNDEF==addr)
+    if (HADDR_UNDEF == addr)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined")
     if (REGION_OVERFLOW(addr, size))
         HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow")
-    if (addr+size>file->eoa)
+    if ((addr + size) > file->eoa)
         HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow")
 
     /* Obtain the data transfer properties */
@@ -1237,26 +1190,26 @@ H5FD_mpiposix_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
      * metadata.
      *             -- JRM 9/1/05
      */
-    if(type!=H5FD_MEM_DRAW) {
-        unsigned    block_before_meta_write=0;      /* Whether to block before a metadata write */
-
-        /* Check if we need to syncronize all processes before attempting metadata write
-         * (Prevents race condition where the process writing the metadata goes ahead
-         * and writes the metadata to the file before all the processes have
-         * read the data, "transmitting" data from the "future" to the reading
-         * process. -QAK )
+    if(type != H5FD_MEM_DRAW) {
+        unsigned    block_before_meta_write = 0;    /* Whether to block before a metadata write */
+
+        /* Check if we need to synchronize all processes before attempting
+         * metadata write (Prevents race condition where the process writing
+         * the metadata goes ahead and writes the metadata to the file before
+         * all the processes have read the data, "transmitting" data from the
+         * "future" to the reading process. -QAK )
          *
          * The only time we don't want to block before a metadata write is when
          * we are flushing out a bunch of metadata.  Then, we block before the
          * first write and don't block for further writes in the sequence.
          */
-        if(H5P_exist_plist(plist,H5AC_BLOCK_BEFORE_META_WRITE_NAME)>0)
-            if(H5P_get(plist,H5AC_BLOCK_BEFORE_META_WRITE_NAME,&block_before_meta_write)<0)
+        if(H5P_exist_plist(plist,H5AC_BLOCK_BEFORE_META_WRITE_NAME) > 0)
+            if(H5P_get(plist,H5AC_BLOCK_BEFORE_META_WRITE_NAME,&block_before_meta_write) < 0)
                 HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get H5AC property")
 
 #if 0 /* JRM */
         if(block_before_meta_write)
-            if (MPI_SUCCESS!= (mpi_code=MPI_Barrier(file->comm)))
+            if (MPI_SUCCESS != (mpi_code = MPI_Barrier(file->comm)))
                 HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code)
 #endif /* JRM */
 
@@ -1273,11 +1226,11 @@ H5FD_mpiposix_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
         MPI_Comm_rank(MPI_COMM_WORLD, &commrank);
         HDfprintf(stderr, "write: rank=%d file=0x%08lx type=%d, addr=%a size=%Zu %s\n",
                 commrank, (unsigned long)file, (int)type, addr, size,
-                0==file->naccess?"(FIRST ACCESS)":"");
+                0 == file->naccess ? "(FIRST ACCESS)" : "");
     }
 #endif
 
-    if (0==file->naccess++) {
+    if (0 == file->naccess++) {
         /* First write access to this file */
 #ifdef H5_HAVE_GPFS
         if (file->use_gpfs) {
@@ -1302,50 +1255,76 @@ H5FD_mpiposix_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
     }
 
     /* Seek to the correct location */
-    if ((addr!=file->pos || OP_WRITE!=file->op) &&
-            file_seek(file->fd, (file_offset_t)addr, SEEK_SET)<0)
-        HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+    if(addr != file->pos || OP_WRITE != file->op) {
+        if(HDlseek(file->fd, (HDoff_t)addr, SEEK_SET) < 0)
+            HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+    } /* end if */
 
-    /*
-     * Write the data, being careful of interrupted system calls and partial
-     * results
+    /* Write data, being careful of interrupted system calls, partial results,
+     * and the end of the file.
      */
-    while (size>0) {
+    while(size > 0) {
+
+        h5_mpiposix_io_t        bytes_in    = 0;    /* # of bytes to write          */
+        h5_mpiposix_io_ret_t    bytes_wrote = -1;   /* # of bytes actually written  */ 
+
+        /* Trying to write more bytes than the return type can handle is
+         * undefined behavior in POSIX.
+         */
+        if(size > H5_MPIPOSIX_MAX_IO_BYTES_g)
+            bytes_in = H5_MPIPOSIX_MAX_IO_BYTES_g;
+        else
+            bytes_in = (h5_mpiposix_io_t)size;
+
         do {
-            nbytes = HDwrite(file->fd, buf, size);
-        } while (-1==nbytes && EINTR==errno);
-        if (-1==nbytes)
-            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
-        assert(nbytes>0);
-        assert((size_t)nbytes<=size);
-        size -= nbytes;
-        addr += (haddr_t)nbytes;
-        buf = (const char*)buf + nbytes;
+            bytes_wrote = HDwrite(file->fd, buf, bytes_in);
+        } while(-1 == bytes_wrote && EINTR == errno);
+        
+        if(-1 == bytes_wrote) { /* error */
+            int myerrno = errno;
+            time_t mytime = HDtime(NULL);
+            HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
+
+            HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file write failed: time = %s, file descriptor = %d, errno = %d, error message = '%s', buf = %p, size = %lu, offset = %llu", HDctime(&mytime), file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long)size, (unsigned long long)myoffset);
+        } /* end if */
+        
+        if(0 == bytes_wrote) {
+            /* end of file but not end of format address space */
+            HDmemset(buf, 0, size);
+            break;
+        } /* end if */
+        
+        HDassert(bytes_wrote >= 0);
+        HDassert((size_t)bytes_wrote <= size);
+        
+        size -= (size_t)bytes_wrote;
+        addr += (haddr_t)bytes_wrote;
+        buf = (char *)buf + bytes_wrote;
     } /* end while */
 
-    /* Update current last file I/O information */
+    /* Update current position */
     file->pos = addr;
     file->op = OP_WRITE;
 
 done:
     /* Check for error */
-    if(ret_value<0) {
+    if(ret_value < 0) {
         /* Reset last file I/O information */
         file->pos = HADDR_UNDEF;
         file->op = OP_UNKNOWN;
     } /* end if */
 #if 0 /* JRM */
-        /* Since metadata writes are now done by process 0 only, this broadcast
-   * is no longer needed.  I leave it in and commented out to remind us
-   * that we need to re-work this function to reflect this reallity.
-   *
-   *                                          -- JRM 9/1/05
-   */
+    /* Since metadata writes are now done by process 0 only, this broadcast
+     * is no longer needed.  I leave it in and commented out to remind us
+     * that we need to re-work this function to reflect this reallity.
+     *
+     *                                          -- JRM 9/1/05
+     */
 
     /* Guard against getting into metadata broadcast in failure cases */
     else {
         /* when only one process writes, need to broadcast the ret_value to other processes */
-        if (type!=H5FD_MEM_DRAW) {
+        if (type != H5FD_MEM_DRAW) {
             if (MPI_SUCCESS != (mpi_code= MPI_Bcast(&ret_value, sizeof(ret_value), MPI_BYTE, H5_PAR_META_WRITE, file->comm)))
                 HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mpi_code)
         } /* end if */
@@ -1359,11 +1338,10 @@ done:
 /*-------------------------------------------------------------------------
  * Function:    H5FD_mpiposix_truncate
  *
- * Purpose:  Makes sure that the true file size is the same (or larger)
- *    than the end-of-address.
+ * Purpose:     Makes sure that the true file size is the same (or larger)
+ *              than the end-of-address.
  *
- * Return:      Success:  Non-negative
- *     Failure:  Negative
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
@@ -1374,12 +1352,8 @@ static herr_t
 H5FD_mpiposix_truncate(H5FD_t *_file, hid_t UNUSED dxpl_id, hbool_t UNUSED closing)
 {
     H5FD_mpiposix_t  *file = (H5FD_mpiposix_t*)_file;
-#ifdef H5_HAVE_WIN32_API
-    HFILE filehandle;   /* Windows file handle */
-    LARGE_INTEGER li;   /* 64-bit integer for SetFilePointer() call */
-#endif /* H5_HAVE_WIN32_API */
-    int      mpi_code;  /* MPI return code */
-    herr_t              ret_value = SUCCEED;
+    herr_t          ret_value = SUCCEED;                /* Return value     */
+    int             mpi_code;                           /* MPI return code  */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1390,19 +1364,42 @@ H5FD_mpiposix_truncate(H5FD_t *_file, hid_t UNUSED dxpl_id, hbool_t UNUSED closi
     if(file->eoa > file->last_eoa) {
         /* Use the round-robin process to truncate (extend) the file */
         if(file->mpi_rank == H5_PAR_META_WRITE) {
+
 #ifdef H5_HAVE_WIN32_API
-            /* Map the posix file handle to a Windows file handle */
-            filehandle = _get_osfhandle(file->fd);
-
-            /* Translate 64-bit integers into form Windows wants */
-            /* [This algorithm is from the Windows documentation for SetFilePointer()] */
-            li.QuadPart = file->eoa;
-            SetFilePointer((HANDLE)filehandle, li.LowPart, &li.HighPart, FILE_BEGIN);
-            if(SetEndOfFile((HANDLE)filehandle) == 0)
+            LARGE_INTEGER   li;         /* 64-bit (union) integer for SetFilePointer() call */
+            DWORD           dwPtrLow;   /* Low-order pointer bits from SetFilePointer()
+                                         * Only used as an error code here.
+                                         */
+            DWORD           dwError;    /* DWORD error code from GetLastError() */
+            BOOL            bError;     /* Boolean error flag */
+
+            /* Windows uses this odd QuadPart union for 32/64-bit portability */
+            li.QuadPart = (__int64)file->eoa;
+
+            /* Extend the file to make sure it's large enough.
+             *
+             * Since INVALID_SET_FILE_POINTER can technically be a valid return value
+             * from SetFilePointer(), we also need to check GetLastError().
+             */
+            dwPtrLow = SetFilePointer(file->hFile, li.LowPart, &li.HighPart, FILE_BEGIN);
+            if(INVALID_SET_FILE_POINTER == dwPtrLow) {
+                dwError = GetLastError();
+                if(dwError != NO_ERROR )
+                    HGOTO_ERROR(H5E_FILE, H5E_FILEOPEN, FAIL, "unable to set file pointer")
+            }
+
+            bError = SetEndOfFile(file->hFile);
+            if(0 == bError)
                 HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
 #else /* H5_HAVE_WIN32_API */
-            if(-1==file_truncate(file->fd, (file_offset_t)file->eoa))
-                HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
+#ifdef H5_VMS
+            /* Reset seek offset to the beginning of the file, so that the file isn't
+             * re-extended later.  This may happen on Open VMS. */
+            if(-1 == HDlseek(file->fd, (HDoff_t)0, SEEK_SET))
+                HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
+#endif /* H5_VMS */
+            if(-1 == HDftruncate(file->fd, (HDoff_t)file->eoa))
+                HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
 #endif /* H5_HAVE_WIN32_API */
         } /* end if */
 
@@ -1430,18 +1427,15 @@ done:
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_mpi_rank
+ * Function:    H5FD_mpiposix_mpi_rank
  *
- * Purpose:  Returns the MPI rank for a process
+ * Purpose:     Returns the MPI rank for a process
  *
- * Return:  Success: non-negative
- *    Failure: negative
+ * Return:      MPI rank.  Cannot report failure.
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static int
@@ -1451,26 +1445,23 @@ H5FD_mpiposix_mpi_rank(const H5FD_t *_file)
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    assert(file);
-    assert(H5FD_MPIPOSIX==file->pub.driver_id);
+    HDassert(file);
+    HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
 
     FUNC_LEAVE_NOAPI(file->mpi_rank)
 } /* end H5FD_mpiposix_mpi_rank() */
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_mpi_size
+ * Function:    H5FD_mpiposix_mpi_size
  *
- * Purpose:  Returns the number of MPI processes
+ * Purpose:     Returns the number of MPI processes
  *
- * Return:  Success: non-negative
- *    Failure: negative
+ * Return:      The number of MPI processes.  Cannot report failure.
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static int
@@ -1480,27 +1471,23 @@ H5FD_mpiposix_mpi_size(const H5FD_t *_file)
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    assert(file);
-    assert(H5FD_MPIPOSIX==file->pub.driver_id);
+    HDassert(file);
+    HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
 
     FUNC_LEAVE_NOAPI(file->mpi_size)
 } /* end H5FD_mpiposix_mpi_size() */
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpiposix_communicator
- *
- * Purpose:  Returns the MPI communicator for the file.
+ * Function:    H5FD_mpiposix_communicator
  *
- * Return:  Success:  The communicator
+ * Purpose:     Returns the MPI communicator for the file.
  *
- *    Failure:  NULL
+ * Return:      The MPI communicator.  Cannot report failure.
  *
  * Programmer:  Quincey Koziol
  *              Thursday, July 11, 2002
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static MPI_Comm
@@ -1510,11 +1497,10 @@ H5FD_mpiposix_communicator(const H5FD_t *_file)
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    assert(file);
-    assert(H5FD_MPIPOSIX==file->pub.driver_id);
+    HDassert(file);
+    HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
 
     FUNC_LEAVE_NOAPI(file->comm)
 } /* end H5FD_mpi_posix_communicator() */
 
 #endif /*H5_HAVE_PARALLEL*/
-
diff --git a/src/H5FDmpiposix.h b/src/H5FDmpiposix.h
index af13fad..e3764e1 100644
--- a/src/H5FDmpiposix.h
+++ b/src/H5FDmpiposix.h
@@ -14,7 +14,7 @@
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
- * Programmer:  Quincey Koziol <koziol@ncsa.uiuc.edu>
+ * Programmer:  Quincey Koziol <koziol@hdfgroup.org>
  *              Thursday, July 11, 2002
  *
  * Purpose:	The public header file for the mpiposix driver.
@@ -24,14 +24,14 @@
 #define __H5FDmpiposix_H
 
 #ifdef H5_HAVE_PARALLEL
-#   define H5FD_MPIPOSIX	(H5FD_mpiposix_init())
+#   define H5FD_MPIPOSIX    (H5FD_mpiposix_init())
 #else
-#   define H5FD_MPIPOSIX	(-1)
+#   define H5FD_MPIPOSIX    (-1)
 #endif
 
 /* Macros */
 
-#define IS_H5FD_MPIPOSIX(f)	/* (H5F_t *f) */				    \
+#define IS_H5FD_MPIPOSIX(f) /* (H5F_t *f) */                                \
     (H5FD_MPIPOSIX==H5F_DRIVER_ID(f))
 
 #ifdef H5_HAVE_PARALLEL
@@ -52,4 +52,3 @@ H5_DLL herr_t H5Pget_fapl_mpiposix(hid_t fapl_id, MPI_Comm *comm/*out*/, hbool_t
 #endif /*H5_HAVE_PARALLEL*/
 
 #endif /* __H5FDmpiposix_H */
-
-- 
cgit v0.12