1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
/*
* Copyright (C) by Argonne National Laboratory
* See COPYRIGHT in top-level directory
*/
#include "adio.h"
/*
* Scalable open: for file systems capable of having one process
* create/open a file and broadcast the result to everyone else.
* - Does not need one process to create the file
* - Does not need special handling for CREATE|EXCL
*/
void ADIOI_SCALEABLE_OpenColl(ADIO_File fd, int rank, int access_mode, int *error_code)
{
int orig_amode_wronly;
/* if we are doing deferred open, non-aggregators should return now */
if (fd->hints->deferred_open && !(fd->is_agg)) {
*error_code = MPI_SUCCESS;
return;
}
/* For writing with data sieving, a read-modify-write is needed. If
* the file is opened for write_only, the read will fail. Therefore,
* if write_only, open the file as read_write, but record it as
* write_only in fd, so that get_amode returns the right answer. */
orig_amode_wronly = access_mode;
if (access_mode & ADIO_WRONLY) {
access_mode = access_mode ^ ADIO_WRONLY;
access_mode = access_mode | ADIO_RDWR;
}
fd->access_mode = access_mode;
(*(fd->fns->ADIOI_xxx_Open)) (fd, error_code);
/* if error, may be it was due to the change in amode above.
* therefore, reopen with access mode provided by the user. */
fd->access_mode = orig_amode_wronly;
if (*error_code != MPI_SUCCESS)
(*(fd->fns->ADIOI_xxx_Open)) (fd, error_code);
/* for deferred open: this process has opened the file (because if we are
* not an aggregaor and we are doing deferred open, we returned earlier)*/
fd->is_open = 1;
}
|