diff --git a/ompi/mca/io/ompio/io_ompio_file_open.c b/ompi/mca/io/ompio/io_ompio_file_open.c index 6c9a0c8771..234fd0bf1e 100644 --- a/ompi/mca/io/ompio/io_ompio_file_open.c +++ b/ompi/mca/io/ompio/io_ompio_file_open.c @@ -431,16 +431,29 @@ mca_io_ompio_file_preallocate (ompi_file_t *fh, tmp = diskspace; - data->ompio_fh.f_comm->c_coll.coll_bcast (&tmp, - 1, - OMPI_OFFSET_DATATYPE, - OMPIO_ROOT, - data->ompio_fh.f_comm, - data->ompio_fh.f_comm->c_coll.coll_bcast_module); + ret = data->ompio_fh.f_comm->c_coll.coll_bcast (&tmp, + 1, + OMPI_OFFSET_DATATYPE, + OMPIO_ROOT, + data->ompio_fh.f_comm, + data->ompio_fh.f_comm->c_coll.coll_bcast_module); + if ( OMPI_SUCCESS != ret ) { + return OMPI_ERROR; + } if (tmp != diskspace) { return OMPI_ERROR; } + ret = data->ompio_fh.f_fs->fs_file_get_size (&data->ompio_fh, + ¤t_size); + if ( OMPI_SUCCESS != ret ) { + return OMPI_ERROR; + } + + if ( current_size > diskspace ) { + return OMPI_SUCCESS; + } + /* ROMIO explanation On file systems with no preallocation function, we have to @@ -450,8 +463,8 @@ mca_io_ompio_file_preallocate (ompi_file_t *fh, preallocation is needed. */ if (OMPIO_ROOT == data->ompio_fh.f_rank) { - ret = data->ompio_fh.f_fs->fs_file_get_size (&data->ompio_fh, - ¤t_size); + OMPI_MPI_OFFSET_TYPE prev_offset; + ompio_io_ompio_file_get_position (&data->ompio_fh, &prev_offset ); size = diskspace; if (size > current_size) { @@ -463,7 +476,8 @@ mca_io_ompio_file_preallocate (ompi_file_t *fh, buf = (char *) malloc (OMPIO_PREALLOC_MAX_BUF_SIZE); if (NULL == buf) { opal_output(1, "OUT OF MEMORY\n"); - return OMPI_ERR_OUT_OF_RESOURCE; + ret = OMPI_ERR_OUT_OF_RESOURCE; + goto exit; } written = 0; @@ -474,11 +488,11 @@ mca_io_ompio_file_preallocate (ompi_file_t *fh, } ret = mca_io_ompio_file_read (fh, buf, len, MPI_BYTE, status); if (ret != OMPI_SUCCESS) { - return OMPI_ERROR; + goto exit; } ret = mca_io_ompio_file_write (fh, buf, len, MPI_BYTE, status); if (ret != OMPI_SUCCESS) { - return OMPI_ERROR; + goto exit; } written += len; } @@ -495,20 +509,25 @@ mca_io_ompio_file_preallocate (ompi_file_t *fh, } ret = mca_io_ompio_file_write (fh, buf, len, MPI_BYTE, status); if (ret != OMPI_SUCCESS) { - return OMPI_ERROR; + goto exit; } written += len; } } - if (NULL != buf) { - free (buf); - buf = NULL; - } - } - ret = data->ompio_fh.f_fs->fs_file_set_size (&data->ompio_fh, diskspace); - fh->f_comm->c_coll.coll_barrier (fh->f_comm, - fh->f_comm->c_coll.coll_barrier_module); + // This operation should not affect file pointer position. + ompi_io_ompio_set_explicit_offset ( &data->ompio_fh, prev_offset); + } + +exit: + free ( buf ); + fh->f_comm->c_coll.coll_bcast ( &ret, 1, MPI_INT, OMPIO_ROOT, fh->f_comm, + fh->f_comm->c_coll.coll_bcast_module); + + if ( diskspace > current_size ) { + data->ompio_fh.f_fs->fs_file_set_size (&data->ompio_fh, diskspace); + } + return ret; }