This source file includes following definitions.
- ADIOI_PVFS_Open
1
2
3
4
5
6
7
8 #include "ad_pvfs.h"
9
10 void ADIOI_PVFS_Open(ADIO_File fd, int *error_code)
11 {
12 int perm, amode, old_mask, flag;
13 char *value;
14
15
16 struct pvfs_filestat pstat = {-1,-1,-1};
17 static char myname[] = "ADIOI_PVFS_OPEN";
18
19 if (fd->perm == ADIO_PERM_NULL) {
20 old_mask = umask(022);
21 umask(old_mask);
22 perm = old_mask ^ 0666;
23 }
24 else perm = fd->perm;
25
26 amode = O_META;
27 if (fd->access_mode & ADIO_CREATE)
28 amode = amode | O_CREAT;
29 if (fd->access_mode & ADIO_RDONLY)
30 amode = amode | O_RDONLY;
31 if (fd->access_mode & ADIO_WRONLY)
32 amode = amode | O_WRONLY;
33 if (fd->access_mode & ADIO_RDWR)
34 amode = amode | O_RDWR;
35 if (fd->access_mode & ADIO_EXCL)
36 amode = amode | O_EXCL;
37
38 value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char));
39
40 ADIOI_Info_get(fd->info, "striping_factor", MPI_MAX_INFO_VAL,
41 value, &flag);
42 if (flag && (atoi(value) > 0)) pstat.pcount = atoi(value);
43
44 ADIOI_Info_get(fd->info, "striping_unit", MPI_MAX_INFO_VAL,
45 value, &flag);
46 if (flag && (atoi(value) > 0)) pstat.ssize = atoi(value);
47
48 ADIOI_Info_get(fd->info, "start_iodevice", MPI_MAX_INFO_VAL,
49 value, &flag);
50 if (flag && (atoi(value) >= 0)) pstat.base = atoi(value);
51
52 #ifdef ADIOI_MPE_LOGGING
53 MPE_Log_event( ADIOI_MPE_open_a, 0, NULL );
54 #endif
55 fd->fd_sys = pvfs_open64(fd->filename, amode, perm, &pstat, NULL);
56 #ifdef ADIOI_MPE_LOGGING
57 MPE_Log_event( ADIOI_MPE_open_b, 0, NULL );
58 #endif
59 fd->fd_direct = -1;
60
61 if ((fd->fd_sys != -1) && (fd->access_mode & ADIO_APPEND)) {
62 #ifdef ADIOI_MPE_LOGGING
63 MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
64 #endif
65 fd->fp_ind = fd->fp_sys_posn = pvfs_lseek64(fd->fd_sys, 0, SEEK_END);
66 #ifdef ADIOI_MPE_LOGGING
67 MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
68 #endif
69 }
70
71 if (fd->fd_sys != -1) {
72 pvfs_ioctl(fd->fd_sys, GETMETA, &pstat);
73 ADIOI_Snprintf(value, MPI_MAX_INFO_VAL+1, "%d", pstat.pcount);
74 ADIOI_Info_set(fd->info, "striping_factor", value);
75 ADIOI_Snprintf(value, MPI_MAX_INFO_VAL+1, "%d", pstat.ssize);
76 ADIOI_Info_set(fd->info, "striping_unit", value);
77 ADIOI_Snprintf(value, MPI_MAX_INFO_VAL+1, "%d", pstat.base);
78 ADIOI_Info_set(fd->info, "start_iodevice", value);
79 }
80
81 ADIOI_Free(value);
82
83 if (fd->fd_sys == -1) {
84 *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
85 myname, __LINE__, MPI_ERR_IO,
86 "**io",
87 "**io %s", strerror(errno));
88 }
89 else *error_code = MPI_SUCCESS;
90 }