diff --git a/ompi/mca/io/ompio/io_ompio.h b/ompi/mca/io/ompio/io_ompio.h index f77d74c057..dc1b88b824 100644 --- a/ompi/mca/io/ompio/io_ompio.h +++ b/ompi/mca/io/ompio/io_ompio.h @@ -328,6 +328,10 @@ OMPI_DECLSPEC int ompio_io_ompio_file_read_at_all_end (mca_io_ompio_file_t *ompi ompi_status_public_t * status); OMPI_DECLSPEC int ompio_io_ompio_file_get_size (mca_io_ompio_file_t *fh, OMPI_MPI_OFFSET_TYPE *size); + +OMPI_DECLSPEC int ompio_io_ompio_file_get_position (mca_io_ompio_file_t *fh, + OMPI_MPI_OFFSET_TYPE *offset); + /* * Function that takes in a datatype and buffer, and decodes that datatype * into an iovec using the convertor_raw function diff --git a/ompi/mca/io/ompio/io_ompio_file_open.c b/ompi/mca/io/ompio/io_ompio_file_open.c index 23871fbbad..97889f0ddb 100644 --- a/ompi/mca/io/ompio/io_ompio_file_open.c +++ b/ompi/mca/io/ompio/io_ompio_file_open.c @@ -637,20 +637,31 @@ int mca_io_ompio_file_get_position (ompi_file_t *fd, OMPI_MPI_OFFSET_TYPE *offset) { + int ret=OMPI_SUCCESS; mca_io_ompio_data_t *data=NULL; mca_io_ompio_file_t *fh=NULL; - OMPI_MPI_OFFSET_TYPE off; - + data = (mca_io_ompio_data_t *) fd->f_io_selected_data; fh = &data->ompio_fh; + + ret = ompio_io_ompio_file_get_position (fh, offset); + + return ret; +} - /* No of copies of the entire file view */ +int +ompio_io_ompio_file_get_position (mca_io_ompio_file_t *fh, + OMPI_MPI_OFFSET_TYPE *offset) +{ + OMPI_MPI_OFFSET_TYPE off; + + /* No. of copies of the entire file view */ off = (fh->f_offset - fh->f_disp)/fh->f_view_extent; - /* No of elements per view */ + /* No. of elements per view */ off *= (fh->f_view_size / fh->f_etype_size); - /* No of bytes used in the current copy of the view */ + /* No of elements used in the current copy of the view */ off += fh->f_total_bytes / fh->f_etype_size; *offset = off; diff --git a/ompi/mca/io/ompio/io_ompio_file_read.c b/ompi/mca/io/ompio/io_ompio_file_read.c index 24c54e8eb8..8546b3b73e 100644 --- a/ompi/mca/io/ompio/io_ompio_file_read.c +++ b/ompi/mca/io/ompio/io_ompio_file_read.c @@ -174,7 +174,7 @@ int ompio_io_ompio_file_read_at (mca_io_ompio_file_t *fh, int ret = OMPI_SUCCESS; OMPI_MPI_OFFSET_TYPE prev_offset; - mca_io_ompio_file_get_position (fh->f_fh, &prev_offset ); + ompio_io_ompio_file_get_position (fh, &prev_offset ); ompi_io_ompio_set_explicit_offset (fh, offset); ret = ompio_io_ompio_file_read (fh, @@ -308,8 +308,7 @@ int ompio_io_ompio_file_iread_at (mca_io_ompio_file_t *fh, { int ret = OMPI_SUCCESS; OMPI_MPI_OFFSET_TYPE prev_offset; - - mca_io_ompio_file_get_position (fh->f_fh, &prev_offset ); + ompio_io_ompio_file_get_position (fh, &prev_offset ); ompi_io_ompio_set_explicit_offset (fh, offset); ret = ompio_io_ompio_file_iread (fh, @@ -386,6 +385,8 @@ int ompio_io_ompio_file_read_at_all (mca_io_ompio_file_t *fh, ompi_status_public_t * status) { int ret = OMPI_SUCCESS; + OMPI_MPI_OFFSET_TYPE prev_offset; + ompio_io_ompio_file_get_position (fh, &prev_offset ); ompi_io_ompio_set_explicit_offset (fh, offset); ret = fh->f_fcoll->fcoll_file_read_all (fh, @@ -393,6 +394,8 @@ int ompio_io_ompio_file_read_at_all (mca_io_ompio_file_t *fh, count, datatype, status); + + ompi_io_ompio_set_explicit_offset (fh, prev_offset); return ret; } @@ -556,20 +559,28 @@ int mca_io_ompio_file_read_at_all_begin (ompi_file_t *fh, return ret; } -int ompio_io_ompio_file_read_at_all_begin (mca_io_ompio_file_t *ompio_fh, +int ompio_io_ompio_file_read_at_all_begin (mca_io_ompio_file_t *fh, OMPI_MPI_OFFSET_TYPE offset, void *buf, int count, struct ompi_datatype_t *datatype) { int ret = OMPI_SUCCESS; + OMPI_MPI_OFFSET_TYPE prev_offset; + ompio_io_ompio_file_get_position (fh, &prev_offset ); - ompi_io_ompio_set_explicit_offset (ompio_fh, offset); - ret = ompio_fh->f_fcoll->fcoll_file_read_all_begin (ompio_fh, - buf, - count, - datatype); - + ompi_io_ompio_set_explicit_offset (fh, offset); + ret = fh->f_fcoll->fcoll_file_read_all_begin (fh, + buf, + count, + datatype); + + /* It is OK to reset the position already here, althgouth + ** the operation might still be pending/ongoing, since + ** the entire array of have + ** already been constructed in the file_read_all_begin operation + */ + ompi_io_ompio_set_explicit_offset (fh, prev_offset); return ret; } diff --git a/ompi/mca/io/ompio/io_ompio_file_write.c b/ompi/mca/io/ompio/io_ompio_file_write.c index f7d8c96d79..e5bbe270e7 100644 --- a/ompi/mca/io/ompio/io_ompio_file_write.c +++ b/ompi/mca/io/ompio/io_ompio_file_write.c @@ -169,7 +169,7 @@ int ompio_io_ompio_file_write_at (mca_io_ompio_file_t *fh, { int ret = OMPI_SUCCESS; OMPI_MPI_OFFSET_TYPE prev_offset; - mca_io_ompio_file_get_position (fh->f_fh, &prev_offset ); + ompio_io_ompio_file_get_position (fh, &prev_offset ); ompi_io_ompio_set_explicit_offset (fh, offset); ret = ompio_io_ompio_file_write (fh, @@ -297,7 +297,7 @@ int ompio_io_ompio_file_iwrite_at (mca_io_ompio_file_t *fh, { int ret = OMPI_SUCCESS; OMPI_MPI_OFFSET_TYPE prev_offset; - mca_io_ompio_file_get_position (fh->f_fh, &prev_offset ); + ompio_io_ompio_file_get_position (fh, &prev_offset ); ompi_io_ompio_set_explicit_offset (fh, offset); ret = ompio_io_ompio_file_iwrite (fh, @@ -498,6 +498,8 @@ int ompio_io_ompio_file_write_at_all (mca_io_ompio_file_t *fh, ompi_status_public_t *status) { int ret = OMPI_SUCCESS; + OMPI_MPI_OFFSET_TYPE prev_offset; + ompio_io_ompio_file_get_position (fh, &prev_offset ); ompi_io_ompio_set_explicit_offset (fh, offset); ret = fh->f_fcoll->fcoll_file_write_all (fh, @@ -505,6 +507,8 @@ int ompio_io_ompio_file_write_at_all (mca_io_ompio_file_t *fh, count, datatype, status); + + ompi_io_ompio_set_explicit_offset (fh, prev_offset); return ret; } @@ -640,6 +644,8 @@ int ompio_io_ompio_file_write_at_all_begin (mca_io_ompio_file_t *fh, struct ompi_datatype_t *datatype) { int ret = OMPI_SUCCESS; + OMPI_MPI_OFFSET_TYPE prev_offset; + ompio_io_ompio_file_get_position (fh, &prev_offset ); ompi_io_ompio_set_explicit_offset (fh, offset); ret = fh->f_fcoll->fcoll_file_write_all_begin (fh, @@ -647,6 +653,12 @@ int ompio_io_ompio_file_write_at_all_begin (mca_io_ompio_file_t *fh, count, datatype); + /* It is OK to reset the position already here, althgouth + ** the operation might still be pending/ongoing, since + ** the entire array of have + ** already been constructed in the file_write_all_begin operation + */ + ompi_io_ompio_set_explicit_offset (fh, prev_offset); return ret; }