This source file includes following definitions.
- gpfs_free_all_locks
- ADIOI_GPFS_Open
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include "ad_gpfs.h"
16 #include "ad_gpfs_tuning.h"
17
18 #include <sys/types.h>
19 #include <sys/stat.h>
20 #include <unistd.h>
21 #include <fcntl.h>
22
23
24 #ifdef HAVE_GPFS_H
25 #include <gpfs.h>
26 #endif
27 #ifdef HAVE_GPFS_FCNTL_H
28 #include <gpfs_fcntl.h>
29 #endif
30
31 #ifdef HAVE_GPFS_FCNTL_H
32 static void gpfs_free_all_locks(int fd)
33 {
34 int rc;
35 struct {
36 gpfsFcntlHeader_t header;
37 gpfsFreeRange_t release;
38 } release_all;
39
40 release_all.header.totalLength = sizeof(release_all);
41 release_all.header.fcntlVersion = GPFS_FCNTL_CURRENT_VERSION;
42 release_all.header.fcntlReserved = 0;
43
44 release_all.release.structLen = sizeof(release_all.release);
45 release_all.release.structType = GPFS_FREE_RANGE;
46 release_all.release.start = 0;
47 release_all.release.length = 0;
48
49 rc = gpfs_fcntl(fd, &release_all);
50 if (rc != 0) {
51 DBGV_FPRINTF(stderr,"GPFS fcntl release failed with rc=%d, errno=%d\n",
52 rc,errno);
53 }
54 }
55 #endif
56
57
58 void ADIOI_GPFS_Open(ADIO_File fd, int *error_code)
59 {
60 int perm, old_mask, amode, rank, rc;
61 static char myname[] = "ADIOI_GPFS_OPEN";
62
63
64 ad_gpfs_get_env_vars();
65
66 if (fd->perm == ADIO_PERM_NULL) {
67 old_mask = umask(022);
68 umask(old_mask);
69 perm = old_mask ^ 0666;
70 }
71 else perm = fd->perm;
72
73 amode = 0;
74 if (fd->access_mode & ADIO_CREATE)
75 amode = amode | O_CREAT;
76 if (fd->access_mode & ADIO_RDONLY)
77 amode = amode | O_RDONLY;
78 if (fd->access_mode & ADIO_WRONLY)
79 amode = amode | O_WRONLY;
80 if (fd->access_mode & ADIO_RDWR)
81 amode = amode | O_RDWR;
82 if (fd->access_mode & ADIO_EXCL)
83 amode = amode | O_EXCL;
84 #ifdef ADIOI_MPE_LOGGING
85 MPE_Log_event(ADIOI_MPE_open_a, 0, NULL);
86 #endif
87 fd->fd_sys = open(fd->filename, amode, perm);
88 #ifdef ADIOI_MPE_LOGGING
89 MPE_Log_event(ADIOI_MPE_open_b, 0, NULL);
90 #endif
91 DBG_FPRINTF(stderr,"open('%s',%#X,%#X) rc=%d, errno=%d\n",fd->filename,amode,perm,fd->fd_sys,errno);
92 fd->fd_direct = -1;
93
94 if (gpfsmpio_devnullio == 1) {
95 fd->null_fd = open("/dev/null", O_RDWR);
96 } else {
97 fd->null_fd = -1;
98 }
99
100 if ((fd->fd_sys != -1) && (fd->access_mode & ADIO_APPEND))
101 fd->fp_ind = fd->fp_sys_posn = lseek(fd->fd_sys, 0, SEEK_END);
102
103 if(fd->fd_sys != -1)
104 {
105
106 fd->blksize = 1048576;
107
108 #ifdef ADIOI_MPE_LOGGING
109 MPE_Log_event(ADIOI_MPE_stat_a, 0, NULL);
110 #endif
111
112
113
114
115
116 MPI_Comm_rank(fd->comm, &rank);
117 if ((rank == fd->hints->ranklist[0]) || (fd->comm == MPI_COMM_SELF)) {
118 struct stat64 gpfs_statbuf;
119
120 rc = stat64(fd->filename, &gpfs_statbuf);
121 if (rc >= 0)
122 {
123 fd->blksize = gpfs_statbuf.st_blksize;
124 DBGV_FPRINTF(stderr,"Successful stat '%s'. Blocksize=%ld\n",
125 fd->filename,gpfs_statbuf.st_blksize);
126 }
127 else
128 {
129 DBGV_FPRINTF(stderr,"Stat '%s' failed with rc=%d, errno=%d\n",
130 fd->filename,rc,errno);
131 }
132 }
133
134
135
136 #ifdef ADIOI_MPE_LOGGING
137 MPE_Log_event(ADIOI_MPE_stat_b, 0, NULL);
138 #endif
139
140 #ifdef HAVE_GPFS_FCNTL_H
141
142
143 if (getenv("ROMIO_GPFS_FREE_LOCKS")!=NULL)
144 gpfs_free_all_locks(fd->fd_sys);
145
146 #endif
147 }
148
149 if (fd->fd_sys == -1) {
150 *error_code = ADIOI_Err_create_code(myname, fd->filename, errno);
151 }
152 else *error_code = MPI_SUCCESS;
153 }
154
155
156