@@ -144,34 +144,38 @@ bool mca_fbtl_posix_progress ( mca_ompio_request_t *req)
144144 data -> aio_req_status [i ] = EINPROGRESS ;
145145 start_offset = data -> aio_reqs [i ].aio_offset ;
146146 total_length = data -> aio_reqs [i ].aio_nbytes ;
147+ /* release previous lock */
148+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
149+
147150 if ( data -> aio_req_type == FBTL_POSIX_WRITE ) {
148- ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_WRLCK , start_offset , total_length , OMPIO_LOCK_ENTIRE_REGION );
151+ ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_WRLCK , start_offset , total_length ,
152+ OMPIO_LOCK_ENTIRE_REGION , & data -> aio_lock_counter );
149153 if ( 0 < ret_code ) {
150154 opal_output (1 , "mca_fbtl_posix_progress: error in mca_fbtl_posix_lock() %d" , ret_code );
151155 /* Just in case some part of the lock actually succeeded. */
152- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
156+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
153157 return OMPI_ERROR ;
154158 }
155159 if (-1 == aio_write (& data -> aio_reqs [i ])) {
156160 opal_output (1 , "mca_fbtl_posix_progress: error in aio_write()" );
157- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
161+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
158162 return OMPI_ERROR ;
159163 }
160164 }
161165 else if ( data -> aio_req_type == FBTL_POSIX_READ ) {
162- ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_RDLCK , start_offset , total_length , OMPIO_LOCK_ENTIRE_REGION );
166+ ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_RDLCK , start_offset , total_length ,
167+ OMPIO_LOCK_ENTIRE_REGION , & data -> aio_lock_counter );
163168 if ( 0 < ret_code ) {
164169 opal_output (1 , "mca_fbtl_posix_progress: error in mca_fbtl_posix_lock() %d" , ret_code );
165170 /* Just in case some part of the lock actually succeeded. */
166- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
171+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
167172 return OMPI_ERROR ;
168173 }
169174 if (-1 == aio_read (& data -> aio_reqs [i ])) {
170175 opal_output (1 , "mca_fbtl_posix_progress: error in aio_read()" );
171- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
176+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
172177 return OMPI_ERROR ;
173178 }
174- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
175179 }
176180 }
177181 else {
@@ -199,10 +203,9 @@ bool mca_fbtl_posix_progress ( mca_ompio_request_t *req)
199203#if 0
200204 printf ("lcount=%d open_reqs=%d\n" , lcount , data -> aio_open_reqs );
201205#endif
202-
203206 if ( (lcount == data -> aio_req_chunks ) && (0 != data -> aio_open_reqs )) {
204207 /* release the lock of the previous operations */
205- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
208+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
206209
207210 /* post the next batch of operations */
208211 data -> aio_first_active_req = data -> aio_last_active_req ;
@@ -218,30 +221,32 @@ bool mca_fbtl_posix_progress ( mca_ompio_request_t *req)
218221 total_length = (end_offset - start_offset );
219222
220223 if ( FBTL_POSIX_READ == data -> aio_req_type ) {
221- ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_RDLCK , start_offset , total_length , OMPIO_LOCK_ENTIRE_REGION );
224+ ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_RDLCK , start_offset , total_length ,
225+ OMPIO_LOCK_ENTIRE_REGION , & data -> aio_lock_counter );
222226 }
223227 else if ( FBTL_POSIX_WRITE == data -> aio_req_type ) {
224- ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_WRLCK , start_offset , total_length , OMPIO_LOCK_ENTIRE_REGION );
228+ ret_code = mca_fbtl_posix_lock ( & data -> aio_lock , data -> aio_fh , F_WRLCK , start_offset , total_length ,
229+ OMPIO_LOCK_ENTIRE_REGION , & data -> aio_lock_counter );
225230 }
226231 if ( 0 < ret_code ) {
227232 opal_output (1 , "mca_fbtl_posix_progress: error in mca_fbtl_posix_lock() %d" , ret_code );
228233 /* Just in case some part of the lock actually succeeded. */
229- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
234+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
230235 return OMPI_ERROR ;
231236 }
232237
233238 for ( i = data -> aio_first_active_req ; i < data -> aio_last_active_req ; i ++ ) {
234239 if ( FBTL_POSIX_READ == data -> aio_req_type ) {
235240 if (-1 == aio_read (& data -> aio_reqs [i ])) {
236241 opal_output (1 , "mca_fbtl_posix_progress: error in aio_read()" );
237- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
242+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
238243 return OMPI_ERROR ;
239244 }
240245 }
241246 else if ( FBTL_POSIX_WRITE == data -> aio_req_type ) {
242247 if (-1 == aio_write (& data -> aio_reqs [i ])) {
243248 opal_output (1 , "mca_fbtl_posix_progress: error in aio_write()" );
244- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
249+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
245250 return OMPI_ERROR ;
246251 }
247252 }
@@ -255,8 +260,13 @@ bool mca_fbtl_posix_progress ( mca_ompio_request_t *req)
255260 /* all pending operations are finished for this request */
256261 req -> req_ompi .req_status .MPI_ERROR = OMPI_SUCCESS ;
257262 req -> req_ompi .req_status ._ucount = data -> aio_total_len ;
258- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
259- ret = true;
263+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
264+
265+ if ( data -> aio_fh -> f_atomicity ) {
266+ mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh , & data -> aio_lock_counter );
267+ }
268+
269+ ret = true;
260270 }
261271#endif
262272 return ret ;
@@ -268,8 +278,8 @@ void mca_fbtl_posix_request_free ( mca_ompio_request_t *req)
268278 /* Free the fbtl specific data structures */
269279 mca_fbtl_posix_request_data_t * data = (mca_fbtl_posix_request_data_t * )req -> req_data ;
270280 if (NULL != data ) {
271- mca_fbtl_posix_unlock ( & data -> aio_lock , data -> aio_fh );
272- if ( NULL != data -> aio_reqs ) {
281+
282+ if ( NULL != data -> aio_reqs ) {
273283 free ( data -> aio_reqs );
274284 }
275285 if ( NULL != data -> aio_req_status ) {
0 commit comments