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