77
88#include "ad_nfs.h"
99#include "adio_extern.h"
10+ #ifdef HAVE_UNISTD_H
11+ #include <unistd.h>
12+ #endif
1013
1114void ADIOI_NFS_ReadContig (ADIO_File fd , void * buf , int count ,
1215 MPI_Datatype datatype , int file_ptr_type ,
1316 ADIO_Offset offset , ADIO_Status * status , int * error_code )
1417{
15- int err = -1 ;
18+ ssize_t err = -1 ;
1619 MPI_Count datatype_size , len ;
20+ ADIO_Offset bytes_xfered = 0 ;
21+ size_t rd_count ;
1722 static char myname [] = "ADIOI_NFS_READCONTIG" ;
23+ char * p ;
1824
1925 MPI_Type_size_x (datatype , & datatype_size );
2026 len = datatype_size * count ;
2127
22- if (file_ptr_type == ADIO_EXPLICIT_OFFSET ) {
23- if (fd -> fp_sys_posn != offset ) {
24- #ifdef ADIOI_MPE_LOGGING
25- MPE_Log_event ( ADIOI_MPE_lseek_a , 0 , NULL );
26- #endif
27- lseek (fd -> fd_sys , offset , SEEK_SET );
28- #ifdef ADIOI_MPE_LOGGING
29- MPE_Log_event ( ADIOI_MPE_lseek_b , 0 , NULL );
30- #endif
31- }
32- if (fd -> atomicity )
33- ADIOI_WRITE_LOCK (fd , offset , SEEK_SET , len );
34- else ADIOI_READ_LOCK (fd , offset , SEEK_SET , len );
35- #ifdef ADIOI_MPE_LOGGING
36- MPE_Log_event ( ADIOI_MPE_read_a , 0 , NULL );
37- #endif
38- err = read (fd -> fd_sys , buf , len );
39- #ifdef ADIOI_MPE_LOGGING
40- MPE_Log_event ( ADIOI_MPE_read_b , 0 , NULL );
41- #endif
42- ADIOI_UNLOCK (fd , offset , SEEK_SET , len );
43- fd -> fp_sys_posn = offset + err ;
44- /* individual file pointer not updated */
45- }
46- else { /* read from curr. location of ind. file pointer */
28+ if (file_ptr_type == ADIO_INDIVIDUAL ) {
4729 offset = fd -> fp_ind ;
48- if (fd -> fp_sys_posn != fd -> fp_ind ) {
49- #ifdef ADIOI_MPE_LOGGING
50- MPE_Log_event ( ADIOI_MPE_lseek_a , 0 , NULL );
51- #endif
52- lseek (fd -> fd_sys , fd -> fp_ind , SEEK_SET );
53- #ifdef ADIOI_MPE_LOGGING
54- MPE_Log_event ( ADIOI_MPE_lseek_b , 0 , NULL );
55- #endif
56- }
30+ }
31+
32+ p = buf ;
33+ while (bytes_xfered < len ) {
34+ rd_count = len - bytes_xfered ;
35+ /* FreeBSD and Darwin workaround: bigger than INT_MAX is an error */
36+ if (rd_count > INT_MAX )
37+ rd_count = INT_MAX ;
5738 if (fd -> atomicity )
58- ADIOI_WRITE_LOCK (fd , offset , SEEK_SET , len );
59- else ADIOI_READ_LOCK (fd , offset , SEEK_SET , len );
39+ ADIOI_WRITE_LOCK (fd , offset + bytes_xfered , SEEK_SET , rd_count );
40+ else ADIOI_READ_LOCK (fd , offset + bytes_xfered , SEEK_SET , rd_count );
6041#ifdef ADIOI_MPE_LOGGING
6142 MPE_Log_event ( ADIOI_MPE_read_a , 0 , NULL );
6243#endif
63- err = read (fd -> fd_sys , buf , len );
44+ err = pread (fd -> fd_sys , p , rd_count , offset + bytes_xfered );
45+ /* --BEGIN ERROR HANDLING-- */
46+ if (err == -1 ) {
47+ * error_code = MPIO_Err_create_code (MPI_SUCCESS ,
48+ MPIR_ERR_RECOVERABLE , myname , __LINE__ , MPI_ERR_IO ,
49+ "**io" , "**io %s" , strerror (errno ));
50+ }
51+ /* --END ERROR HANDLING-- */
6452#ifdef ADIOI_MPE_LOGGING
6553 MPE_Log_event ( ADIOI_MPE_read_b , 0 , NULL );
6654#endif
67- ADIOI_UNLOCK (fd , offset , SEEK_SET , len );
68- fd -> fp_ind += err ;
69- fd -> fp_sys_posn = fd -> fp_ind ;
55+ ADIOI_UNLOCK (fd , offset + bytes_xfered , SEEK_SET , rd_count );
56+ if (err == 0 ) {
57+ /* end of file */
58+ break ;
59+ }
60+ bytes_xfered += err ;
61+ p += err ;
7062 }
7163
72- /* --BEGIN ERROR HANDLING-- */
73- if (err == -1 ) {
74- * error_code = MPIO_Err_create_code (MPI_SUCCESS , MPIR_ERR_RECOVERABLE ,
75- myname , __LINE__ , MPI_ERR_IO ,
76- "**io" , "**io %s" , strerror (errno ));
77- return ;
64+ fd -> fp_sys_posn = offset + bytes_xfered ;
65+ if (file_ptr_type == ADIO_INDIVIDUAL ) {
66+ fd -> fp_ind += bytes_xfered ;
7867 }
7968 /* --END ERROR HANDLING-- */
8069
8170#ifdef HAVE_STATUS_SET_BYTES
82- MPIR_Status_set_bytes (status , datatype , err );
71+ if ( err != -1 ) MPIR_Status_set_bytes (status , datatype , bytes_xfered );
8372#endif
8473
8574 * error_code = MPI_SUCCESS ;
@@ -168,8 +157,9 @@ void ADIOI_NFS_ReadStrided(ADIO_File fd, void *buf, int count,
168157/* offset is in units of etype relative to the filetype. */
169158
170159 ADIOI_Flatlist_node * flat_buf , * flat_file ;
171- int i , j , k , err = -1 , brd_size , frd_size = 0 , st_index = 0 ;
172- int bufsize , num , size , sum , n_etypes_in_filetype , size_in_filetype ;
160+ int i , j , k , err = -1 , brd_size , st_index = 0 ;
161+ int num , size , sum , n_etypes_in_filetype , size_in_filetype ;
162+ MPI_Count bufsize ;
173163 int n_filetypes , etype_in_filetype ;
174164 ADIO_Offset abs_off_in_filetype = 0 ;
175165 int req_len , partial_read ;
@@ -179,8 +169,9 @@ void ADIOI_NFS_ReadStrided(ADIO_File fd, void *buf, int count,
179169 ADIO_Offset userbuf_off ;
180170 ADIO_Offset off , req_off , disp , end_offset = 0 , readbuf_off , start_off ;
181171 char * readbuf , * tmp_buf , * value ;
182- int st_frd_size , st_n_filetypes , readbuf_len ;
183- int new_brd_size , new_frd_size , err_flag = 0 , info_flag , max_bufsize ;
172+ int st_n_filetypes , readbuf_len ;
173+ ADIO_Offset frd_size = 0 , new_frd_size , st_frd_size ;
174+ int new_brd_size , err_flag = 0 , info_flag , max_bufsize ;
184175
185176 static char myname [] = "ADIOI_NFS_READSTRIDED" ;
186177
@@ -460,12 +451,13 @@ void ADIOI_NFS_ReadStrided(ADIO_File fd, void *buf, int count,
460451 else {
461452/* noncontiguous in memory as well as in file */
462453
454+ ADIO_Offset i ;
463455 ADIOI_Flatten_datatype (datatype );
464456 flat_buf = ADIOI_Flatlist ;
465457 while (flat_buf -> type != datatype ) flat_buf = flat_buf -> next ;
466458
467459 k = num = buf_count = 0 ;
468- i = ( int ) ( flat_buf -> indices [0 ]) ;
460+ i = flat_buf -> indices [0 ];
469461 j = st_index ;
470462 off = offset ;
471463 n_filetypes = st_n_filetypes ;
@@ -510,8 +502,8 @@ void ADIOI_NFS_ReadStrided(ADIO_File fd, void *buf, int count,
510502
511503 k = (k + 1 )%flat_buf -> count ;
512504 buf_count ++ ;
513- i = ( int ) ( buftype_extent * (buf_count /flat_buf -> count ) +
514- flat_buf -> indices [k ]) ;
505+ i = buftype_extent * (buf_count /flat_buf -> count ) +
506+ flat_buf -> indices [k ];
515507 new_brd_size = flat_buf -> blocklens [k ];
516508 if (size != frd_size ) {
517509 off += size ;
0 commit comments