Merge pull request #1782 from edgargabriel/getview-preallocate-fixes
io/ompio: fix the preallocate function
Этот коммит содержится в:
Коммит
2886d93fb8
@ -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,
|
||||
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;
|
||||
}
|
||||
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user