<br><font size=2 face="sans-serif">What's the functional difference between
your new ADIOI_NOLOCK_WriteStrided and ADIOI_GEN_WriteStrided_naive? In
an earlier patch we enabled ADIOI_GEN_WriteStrided_naive when romio_ds_write
was disabled. Will using ADIOI_GEN_WriteStrided_naive in af_ufs
work well for you on pvfs?</font>
<br>
<br><font size=2 face="sans-serif">diff --git a/lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs.c
b/lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs.c</font>
<br><font size=2 face="sans-serif">index ce0f6a5..bc65198 100755</font>
<br><font size=2 face="sans-serif">--- a/lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs.c</font>
<br><font size=2 face="sans-serif">+++ b/lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs.c</font>
<br><font size=2 face="sans-serif">@@ -21,7 +21,7 @@ struct ADIOI_Fns_struct
ADIO_UFS_operations = {</font>
<br><font size=2 face="sans-serif"> ADIOI_GEN_Fcntl,
/* Fcntl */</font>
<br><font size=2 face="sans-serif"> ADIOI_BGL_SetInfo,
/* SetInfo */</font>
<br><font size=2 face="sans-serif"> ADIOI_GEN_ReadStrided,
/* ReadStrided */</font>
<br><font size=2 face="sans-serif">- ADIOI_NOLOCK_WriteStrided,
/* WriteStrided */</font>
<br><font size=2 face="sans-serif">+ ADIOI_GEN_WriteStrided_naive,
/*ADIOI_NOLOCK_WriteStrided, * WriteStrided */</font>
<br><font size=2 face="sans-serif"> ADIOI_BGL_Close,
/* Close */</font>
<br><font size=2 face="sans-serif"> #ifdef ROMIO_HAVE_WORKING_AIO</font>
<br><font size=2 face="sans-serif"> ADIOI_GEN_IreadContig,
/* IreadContig */</font>
<br>
<br><font size=2 face="sans-serif">The issue I'm having is romio noncontig
testcases fail on ufs:files on GPFS or NFS filesystems using ADIOI_NOLOCK_WriteStrided
but work using ADIOI_GEN_WriteStrided_naive. I'm wondering
if ADIOI_NOLOCK_WriteStrided works if pvfs is the underlying file system
but not for more generic af_ufs filesystems? I'm not comfortable
enabling af_ufs on bgl if it could be abused and cause failures on non-pvfs
filesystems. I suppose we could explicitly put in some checks to
disable it if the underlying file system wasn't pvfs... Thoughts?</font>
<br><font size=2 face="sans-serif"><br>
Bob Cernohous: (T/L 553) 507-253-6093<br>
<br>
BobC@us.ibm.com<br>
IBM Rochester, Building 030-2(C335), Department 61L<br>
3605 Hwy 52 North, Rochester, MN 55901-7829<br>
<br>
> Chaos reigns within.<br>
> Reflect, repent, and reboot.<br>
> Order shall return.<br>
</font>
<br>
<br><tt><font size=2>dcmf-bounces@lists.anl-external.org wrote on 02/12/2008
02:22:03 PM:<br>
<br>
> <br>
> Signed-off-by: Rob Latham <robl@mcs.anl.gov><br>
> ---<br>
> lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs.c |
2 +-<br>
> .../mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs_open.c |
3 +<br>
> .../mpich2/src/mpi/romio/adio/common/Makefile.in |
2 +-<br>
> .../mpich2/src/mpi/romio/adio/common/ad_fstype.c |
23 ++<br>
> .../src/mpi/romio/adio/common/ad_write_nolock.c |
331 <br>
> ++++++++++++++++++++<br>
> lib/mpi/mpich2/src/mpi/romio/adio/include/adioi.h |
4 +<br>
> 6 files changed, 363 insertions(+), 2 deletions(-)<br>
> create mode 100644 lib/mpi/mpich2/src/mpi/romio/adio/common/ad_write_nolock.c<br>
> <br>
> diff --git a/lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs.c <br>
> b/lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs.c<br>
> index 3e016ab..f311afc 100644<br>
> --- a/lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs.c<br>
> +++ b/lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs.c<br>
> @@ -20,7 +20,7 @@ struct ADIOI_Fns_struct ADIO_UFS_operations = {<br>
> ADIOI_GEN_Fcntl, /* Fcntl */<br>
> ADIOI_GEN_SetInfo, /* SetInfo */<br>
> ADIOI_GEN_ReadStrided, /* ReadStrided */<br>
> - ADIOI_GEN_WriteStrided, /* WriteStrided */<br>
> + ADIOI_NOLOCK_WriteStrided, /* WriteStrided */<br>
> ADIOI_GEN_Close, /* Close */<br>
> ADIOI_GEN_IreadContig, /* IreadContig */<br>
> ADIOI_GEN_IwriteContig, /* IwriteContig */<br>
> diff --git a/lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs_open.c
<br>
> b/lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs_open.c<br>
> index 4e91594..1a0dfb9 100644<br>
> --- a/lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs_open.c<br>
> +++ b/lib/mpi/mpich2/src/mpi/romio/adio/ad_ufs/ad_ufs_open.c<br>
> @@ -12,6 +12,9 @@ void ADIOI_UFS_Open(ADIO_File fd, int *error_code)<br>
> int perm, old_mask, amode;<br>
> static char myname[] = "ADIOI_UFS_OPEN";<br>
> <br>
> + /* set internal variables for tuning environment variables
*/<br>
> + ad_bgl_get_env_vars(); <br>
> +<br>
> if (fd->perm == ADIO_PERM_NULL) {<br>
> old_mask = umask(022);<br>
> umask(old_mask);<br>
> diff --git a/lib/mpi/mpich2/src/mpi/romio/adio/common/Makefile.in
<br>
> b/lib/mpi/mpich2/src/mpi/romio/adio/common/Makefile.in<br>
> index 627dc96..9e1d597 100644<br>
> --- a/lib/mpi/mpich2/src/mpi/romio/adio/common/Makefile.in<br>
> +++ b/lib/mpi/mpich2/src/mpi/romio/adio/common/Makefile.in<br>
> @@ -28,7 +28,7 @@ AD_OBJECTS = ad_close.o ad_init.o ad_end.o <br>
> ad_open.o flatten.o \<br>
> ad_write_str_naive.o ad_resize.o ad_read.o
ad_write.o ad_iread.o \<br>
> ad_iwrite.o ad_done.o ad_wait.o adi_close.o
ad_prealloc.o ad_fcntl.o \<br>
> ad_iread_fake.o ad_iwrite_fake.o ad_done_fake.o
ad_wait_fake.o \<br>
> - ad_subarray.o ad_darray.o strfns.o<br>
> + ad_subarray.o ad_darray.o strfns.o ad_write_nolock.o<br>
> <br>
> all: $(LIBNAME)<br>
> @if [ "@ENABLE_SHLIB@" != "none"
] ; then \<br>
> diff --git a/lib/mpi/mpich2/src/mpi/romio/adio/common/ad_fstype.c
<br>
> b/lib/mpi/mpich2/src/mpi/romio/adio/common/ad_fstype.c<br>
> index 452596f..e90332d 100644<br>
> --- a/lib/mpi/mpich2/src/mpi/romio/adio/common/ad_fstype.c<br>
> +++ b/lib/mpi/mpich2/src/mpi/romio/adio/common/ad_fstype.c<br>
> @@ -187,6 +187,28 @@ static void ADIO_FileSysType_parentdir(char <br>
> *filename, char **dirnamep)<br>
> }<br>
> #endif /* ROMIO_NTFS */<br>
> <br>
> +static void check_for_pvfs_exception(char *filename, int *fstype)<br>
> +{<br>
> + /* exception for lockless PVFS file system */<br>
> + int err;<br>
> + struct statfs fsbuf;<br>
> + char *dir;<br>
> +<br>
> + do {<br>
> + err = statfs(filename, &fsbuf);<br>
> + } while (err && (errno == ESTALE));<br>
> +<br>
> + if (err && (errno == ENOENT)) {<br>
> + ADIO_FileSysType_parentdir(filename, &dir);<br>
> + err = statfs(dir, &fsbuf);<br>
> + ADIOI_Free(dir);<br>
> + }<br>
> + /* 2030528: magic number for pvfs, but we might not
have pvfs <br>
> header files<br>
> + * in this environment */<br>
> + if (fsbuf.f_type == 20030528) <br>
> + *fstype = ADIO_UFS;<br>
> +}<br>
> +<br>
> /*<br>
> ADIO_FileSysType_fncall - determines the file system type for
a given file <br>
> using a system-dependent function call<br>
> @@ -212,6 +234,7 @@ static void ADIO_FileSysType_fncall(char <br>
> *filename, int *fstype, int *error_code<br>
> -------------------------------------------------------------*/<br>
> #ifdef ROMIO_BGL<br>
> *fstype = ADIO_BGL;<br>
> + check_for_pvfs_exception(filename, fstype);<br>
> *error_code = MPI_SUCCESS;<br>
> return;<br>
> #endif /* ROMIO_BGL */<br>
> diff --git <br>
> a/lib/mpi/mpich2/src/mpi/romio/adio/common/ad_write_nolock.c <br>
> b/lib/mpi/mpich2/src/mpi/romio/adio/common/ad_write_nolock.c<br>
> new file mode 100644<br>
> index 0000000..79b11a7<br>
> --- /dev/null<br>
> +++ b/lib/mpi/mpich2/src/mpi/romio/adio/common/ad_write_nolock.c<br>
> @@ -0,0 +1,331 @@<br>
> +/* -*- Mode: C; c-basic-offset:4 ; -*- */<br>
> +/* <br>
> + *<br>
> + * Copyright (C) 1997 University of Chicago. <br>
> + * See COPYRIGHT notice in top-level directory.<br>
> + */<br>
> +<br>
> +#include "adio.h"<br>
> +#include "adio_extern.h"<br>
> +<br>
> +#ifdef HAVE_UNISTD_H<br>
> +#include <unistd.h><br>
> +#endif<br>
> +<br>
> +void ADIOI_NOLOCK_WriteStrided(ADIO_File fd, void *buf, int count,<br>
> + MPI_Datatype datatype,
int file_ptr_type,<br>
> + ADIO_Offset offset,
ADIO_Status *status, int<br>
> + *error_code)<br>
> +{<br>
> +/* borrowed from old-school PVFS (v1) code. A driver for file systems
that<br>
> + * cannot or do not support client-side buffering<br>
> + * Does not do data sieving optimization<br>
> + * Does contain write-combining optimization for noncontig in <br>
> memory, contig in<br>
> + * file <br>
> + */<br>
> +<br>
> +/* offset is in units of etype relative to the filetype. */<br>
> +<br>
> + ADIOI_Flatlist_node *flat_buf, *flat_file;<br>
> + int i, j, k, err=-1, bwr_size, fwr_size=0, st_index=0;<br>
> + int bufsize, num, size, sum, n_etypes_in_filetype,
size_in_filetype;<br>
> + int n_filetypes, etype_in_filetype;<br>
> + ADIO_Offset abs_off_in_filetype=0;<br>
> + int filetype_size, etype_size, buftype_size;<br>
> + MPI_Aint filetype_extent, buftype_extent, indx;<br>
> + int buf_count, buftype_is_contig, filetype_is_contig;<br>
> + ADIO_Offset off, disp;<br>
> + int flag, new_bwr_size, new_fwr_size, err_flag=0;<br>
> + static char myname[] = "ADIOI_PVFS_WRITESTRIDED";<br>
> +<br>
> + /* --BEGIN ERROR HANDLING-- */<br>
> + if (fd->atomicity) {<br>
> + *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,<br>
> + myname,
__LINE__,<br>
> + MPI_ERR_INTERN,<br>
> + "Atomic
mode set in I/O function", 0);<br>
> + return;<br>
> + }<br>
> + /* --END ERROR HANDLING-- */<br>
> +<br>
> + ADIOI_Datatype_iscontig(datatype, &buftype_is_contig);<br>
> + ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig);<br>
> +<br>
> + MPI_Type_size(fd->filetype, &filetype_size);<br>
> + if ( ! filetype_size ) {<br>
> + *error_code = MPI_SUCCESS; <br>
> + return;<br>
> + }<br>
> +<br>
> + MPI_Type_extent(fd->filetype, &filetype_extent);<br>
> + MPI_Type_size(datatype, &buftype_size);<br>
> + MPI_Type_extent(datatype, &buftype_extent);<br>
> + etype_size = fd->etype_size;<br>
> + <br>
> + bufsize = buftype_size * count;<br>
> +<br>
> + if (!buftype_is_contig && filetype_is_contig)
{<br>
> + char *combine_buf, *combine_buf_ptr;<br>
> + ADIO_Offset combine_buf_remain;<br>
> +/* noncontiguous in memory, contiguous in file. use writev */<br>
> +<br>
> + ADIOI_Flatten_datatype(datatype);<br>
> + flat_buf = ADIOI_Flatlist;<br>
> + while (flat_buf->type != datatype) flat_buf = flat_buf->next;<br>
> +<br>
> + /* allocate our "combine buffer" to pack data into
before writing */<br>
> + combine_buf = (char *) ADIOI_Malloc(fd->hints->ind_wr_buffer_size);<br>
> + combine_buf_ptr = combine_buf;<br>
> + combine_buf_remain = fd->hints->ind_wr_buffer_size;<br>
> +<br>
> + /* seek to the right spot in the file */<br>
> + if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {<br>
> + off = fd->disp + etype_size * offset;<br>
> + lseek64(fd->fd_sys, off, SEEK_SET);<br>
> + }<br>
> + else off = lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);<br>
> +<br>
> + /* loop through all the flattened pieces. combine into
buffer until<br>
> + * no more will fit, then write.<br>
> + *<br>
> + * special case of a given piece being bigger than the
combine buffer<br>
> + * is also handled.<br>
> + */<br>
> + for (j=0; j<count; j++) {<br>
> + for (i=0; i<flat_buf->count; i++) {<br>
> + if (flat_buf->blocklens[i] > combine_buf_remain
&& <br>
> combine_buf != combine_buf_ptr) {<br>
> + /* there is data in the buffer;
write out the buffer so far */<br>
> + err = write(fd->fd_sys,<br>
> + combine_buf,<br>
> + fd->hints->ind_wr_buffer_size
- combine_buf_remain);<br>
> + if (err == -1) err_flag = 1;<br>
> +<br>
> + /* reset our buffer info */<br>
> + combine_buf_ptr = combine_buf;<br>
> + combine_buf_remain = fd->hints->ind_wr_buffer_size;<br>
> + }<br>
> +<br>
> + /* TODO: heuristic for when to not bother to
use combine buffer? */<br>
> + if (flat_buf->blocklens[i] >= combine_buf_remain)
{<br>
> + /* special case: blocklen is as
big as or bigger than the<br>
> combine buf;<br>
> + * write directly<br>
> + */<br>
> + err = write(fd->fd_sys,<br>
> + ((char *)
buf) + j*buftype_extent + flat_buf->indices[i],<br>
> + flat_buf->blocklens[i]);<br>
> + if (err == -1) err_flag = 1;<br>
> + off += flat_buf->blocklens[i];
/* keep up with the final <br>
> file offset too */<br>
> + }<br>
> + else {<br>
> + /* copy more data into combine
buffer */<br>
> + memcpy(combine_buf_ptr,<br>
> + ((char *) buf) + j*buftype_extent
+ flat_buf->indices[i],<br>
> + flat_buf->blocklens[i]);<br>
> + combine_buf_ptr += flat_buf->blocklens[i];<br>
> + combine_buf_remain -= flat_buf->blocklens[i];<br>
> + off += flat_buf->blocklens[i];
/* keep up with the final <br>
> file offset too */<br>
> + }<br>
> + }<br>
> + }<br>
> +<br>
> + if (combine_buf_ptr != combine_buf) {<br>
> + /* data left in buffer to write */<br>
> + err = write(fd->fd_sys,<br>
> + combine_buf,<br>
> + fd->hints->ind_wr_buffer_size
- combine_buf_remain);<br>
> + if (err == -1) err_flag = 1;<br>
> + }<br>
> +<br>
> + if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off;<br>
> +<br>
> + ADIOI_Free(combine_buf);<br>
> +<br>
> + if (err_flag) {<br>
> + *error_code = MPIO_Err_create_code(MPI_SUCCESS,<br>
> +
MPIR_ERR_RECOVERABLE, myname,<br>
> +
__LINE__, MPI_ERR_IO, "**io",<br>
> +
"**io %s", strerror(errno));<br>
> + }<br>
> + else *error_code = MPI_SUCCESS;<br>
> + } /* if (!buftype_is_contig && filetype_is_contig)
... */<br>
> +<br>
> + else { /* noncontiguous in file */<br>
> +<br>
> +/* split up into several contiguous writes */<br>
> +<br>
> +/* find starting location in the file */<br>
> +<br>
> +/* filetype already flattened in ADIO_Open */<br>
> + flat_file = ADIOI_Flatlist;<br>
> + while (flat_file->type != fd->filetype) flat_file =
flat_file->next;<br>
> + disp = fd->disp;<br>
> +<br>
> + if (file_ptr_type == ADIO_INDIVIDUAL) {<br>
> + offset = fd->fp_ind; /* in bytes */<br>
> + n_filetypes = -1;<br>
> + flag = 0;<br>
> + while (!flag) {<br>
> + n_filetypes++;<br>
> + for (i=0;
i<flat_file->count; i++) {<br>
> + if
(disp + flat_file->indices[i] + <br>
> +
(ADIO_Offset) n_filetypes*filetype_extent +<br>
> flat_file->blocklens[i] <br>
> +
>= offset) {<br>
> +
st_index = i;<br>
> +
fwr_size = disp + flat_file->indices[i] + <br>
> +
(ADIO_Offset) n_filetypes*filetype_extent<br>
> +
+ flat_file->blocklens[i]
- offset;<br>
> +
flag = 1;<br>
> +
break;<br>
> + }<br>
> + }<br>
> + }<br>
> + }<br>
> + else {<br>
> + n_etypes_in_filetype = filetype_size/etype_size;<br>
> + n_filetypes = (int) (offset / n_etypes_in_filetype);<br>
> + etype_in_filetype = (int) (offset % n_etypes_in_filetype);<br>
> + size_in_filetype = etype_in_filetype * etype_size;<br>
> + <br>
> + sum = 0;<br>
> + for (i=0; i<flat_file->count; i++) {<br>
> + sum += flat_file->blocklens[i];<br>
> + if (sum > size_in_filetype) {<br>
> + st_index = i;<br>
> + fwr_size = sum - size_in_filetype;<br>
> + abs_off_in_filetype = flat_file->indices[i]
+<br>
> + size_in_filetype - (sum - flat_file->blocklens[i]);<br>
> + break;<br>
> + }<br>
> + }<br>
> +<br>
> + /* abs. offset in bytes in the file */<br>
> + offset = disp + (ADIO_Offset)
<br>
> n_filetypes*filetype_extent + abs_off_in_filetype;<br>
> + }<br>
> +<br>
> + if (buftype_is_contig && !filetype_is_contig) {<br>
> +<br>
> +/* contiguous in memory, noncontiguous in file. should be the most<br>
> + common case. */<br>
> +<br>
> + i = 0;<br>
> + j = st_index;<br>
> + off = offset;<br>
> + fwr_size = ADIOI_MIN(fwr_size, bufsize);<br>
> + while (i < bufsize) {<br>
> + if (fwr_size)
{ <br>
> + /*
TYPE_UB and TYPE_LB can result in <br>
> +
fwr_size = 0. save system call in such cases */ <br>
> +#ifdef PROFILE<br>
> + MPE_Log_event(5, 0, "start
write");<br>
> +#endif<br>
> + err = pwrite(fd->fd_sys, ((char
*) buf) + i, fwr_size, off);<br>
> +#ifdef PROFILE<br>
> + MPE_Log_event(6, 0, "end
write");<br>
> +#endif<br>
> + if (err == -1) err_flag = 1;<br>
> + }<br>
> + i += fwr_size;<br>
> +<br>
> + if (off +
fwr_size < disp + flat_file->indices[j] +<br>
> + flat_file->blocklens[j]
+ (ADIO_Offset) <br>
> n_filetypes*filetype_extent)<br>
> +
off += fwr_size;<br>
> + /* did not
reach end of contiguous block in filetype.<br>
> + no
more I/O needed. off is incremented by fwr_size. */<br>
> + else {<br>
> + if (j < (flat_file->count
- 1)) j++;<br>
> + else {<br>
> + j = 0;<br>
> + n_filetypes++;<br>
> + }<br>
> + off = disp + flat_file->indices[j]
+ <br>
> +
(ADIO_Offset)
<br>
> n_filetypes*filetype_extent;<br>
> + fwr_size = ADIOI_MIN(flat_file->blocklens[j],
bufsize-i);<br>
> + }<br>
> + }<br>
> + }<br>
> + else {<br>
> +/* noncontiguous in memory as well as in file */<br>
> +<br>
> + ADIOI_Flatten_datatype(datatype);<br>
> + flat_buf = ADIOI_Flatlist;<br>
> + while (flat_buf->type != datatype) flat_buf
= flat_buf->next;<br>
> +<br>
> + k = num = buf_count = 0;<br>
> + indx = flat_buf->indices[0];<br>
> + j = st_index;<br>
> + off = offset;<br>
> + bwr_size = flat_buf->blocklens[0];<br>
> +<br>
> + while (num < bufsize) {<br>
> + size = ADIOI_MIN(fwr_size, bwr_size);<br>
> + if (size) {<br>
> +#ifdef PROFILE<br>
> + MPE_Log_event(5, 0, "start
write");<br>
> +#endif<br>
> + err = pwrite(fd->fd_sys, ((char
*) buf) + indx, size, off);<br>
> +#ifdef PROFILE<br>
> + MPE_Log_event(6, 0, "end
write");<br>
> +#endif<br>
> + if (err == -1) err_flag = 1;<br>
> + }<br>
> +<br>
> + new_fwr_size = fwr_size;<br>
> + new_bwr_size = bwr_size;<br>
> +<br>
> + if (size == fwr_size) {<br>
> +/* reached end of contiguous block in file */<br>
> + if
(j < (flat_file->count - 1)) j++;<br>
> + else
{<br>
> +
j = 0;<br>
> +
n_filetypes++;<br>
> + }<br>
> +<br>
> + off
= disp + flat_file->indices[j] + <br>
> +
(ADIO_Offset) n_filetypes*filetype_extent;<br>
> +<br>
> + new_fwr_size = flat_file->blocklens[j];<br>
> + if (size != bwr_size) {<br>
> + indx += size;<br>
> + new_bwr_size -= size;<br>
> + }<br>
> + }<br>
> +<br>
> + if (size == bwr_size) {<br>
> +/* reached end of contiguous block in memory */<br>
> +<br>
> + k = (k + 1)%flat_buf->count;<br>
> + buf_count++;<br>
> + indx = buftype_extent*(buf_count/flat_buf->count)
+<br>
> + flat_buf->indices[k]; <br>
> + new_bwr_size = flat_buf->blocklens[k];<br>
> + if (size != fwr_size) {<br>
> + off += size;<br>
> + new_fwr_size -= size;<br>
> + }<br>
> + }<br>
> + num += size;<br>
> + fwr_size = new_fwr_size;<br>
> + bwr_size
= new_bwr_size;<br>
> + }<br>
> + }<br>
> +<br>
> + if (file_ptr_type == ADIO_INDIVIDUAL)
fd->fp_ind = off;<br>
> + if (err_flag) {<br>
> + *error_code = MPIO_Err_create_code(MPI_SUCCESS,<br>
> +
MPIR_ERR_RECOVERABLE, myname,<br>
> +
__LINE__, MPI_ERR_IO, "**io",<br>
> +
"**io %s", strerror(errno));<br>
> + }<br>
> + else *error_code = MPI_SUCCESS;<br>
> + }<br>
> +<br>
> + fd->fp_sys_posn = -1; /* set it to null.
*/<br>
> +<br>
> +#ifdef HAVE_STATUS_SET_BYTES<br>
> + MPIR_Status_set_bytes(status, datatype, bufsize);<br>
> +/* This is a temporary way of filling in status. The right way is
to <br>
> + keep track of how much data was actually written by <br>
> ADIOI_BUFFERED_WRITE. */<br>
> +#endif<br>
> +<br>
> + if (!buftype_is_contig) ADIOI_Delete_flattened(datatype);<br>
> +}<br>
> diff --git a/lib/mpi/mpich2/src/mpi/romio/adio/include/adioi.h <br>
> b/lib/mpi/mpich2/src/mpi/romio/adio/include/adioi.h<br>
> index c09a586..f6e58cf 100644<br>
> --- a/lib/mpi/mpich2/src/mpi/romio/adio/include/adioi.h<br>
> +++ b/lib/mpi/mpich2/src/mpi/romio/adio/include/adioi.h<br>
> @@ -359,6 +359,10 @@ void ADIOI_GEN_WriteStrided_naive(ADIO_File fd,<br>
> void *buf, int count,<br>
>
MPI_Datatype datatype, int file_ptr_type,<br>
>
ADIO_Offset offset, ADIO_Status *status, int<br>
>
*error_code);<br>
> +void ADIOI_NOLOCK_WriteStrided(ADIO_File fd, void *buf, int count,<br>
> +
MPI_Datatype datatype, int file_ptr_type,<br>
> +
ADIO_Offset offset, ADIO_Status *status, int<br>
> +
*error_code);<br>
> void ADIOI_GEN_ReadStridedColl(ADIO_File fd, void *buf, int
count,<br>
>
MPI_Datatype datatype, int file_ptr_type,<br>
>
ADIO_Offset offset, ADIO_Status *status, int<br>
> -- <br>
> 1.5.3.8<br>
> <br>
> _______________________________________________<br>
> dcmf mailing list<br>
> dcmf@lists.anl-external.org<br>
> http://lists.anl-external.org/cgi-bin/mailman/listinfo/dcmf<br>
> http://dcmf.anl-external.org/wiki<br>
</font></tt>