IOR
aiori-Gfarm.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <unistd.h>
3 #include <sys/types.h>
4 #include <errno.h>
5 #include <gfarm/gfarm.h>
6 #undef PACKAGE_NAME
7 #undef PACKAGE_STRING
8 #undef PACKAGE_TARNAME
9 #undef PACKAGE_VERSION
10 #include "ior.h"
11 #include "aiori.h"
12 
13 struct gfarm_file {
14  GFS_File gf;
15 };
16 
18 
19 void
21 {
22  hints = params;
23 }
24 
25 void
27 {
28  gfarm_initialize(NULL, NULL);
29 }
30 
31 void
33 {
34  gfarm_terminate();
35 }
36 
37 aiori_fd_t *
38 Gfarm_create(char *fn, int flag, aiori_mod_opt_t *param)
39 {
40  GFS_File gf;
41  struct gfarm_file *fp;
42  gfarm_error_t e;
43 
44  if (hints->dryRun)
45  return (NULL);
46 
47  e = gfs_pio_create(fn, GFARM_FILE_RDWR, 0664, &gf);
48  if (e != GFARM_ERR_NO_ERROR)
49  ERR("gfs_pio_create failed");
50  GFARM_MALLOC(fp);
51  if (fp == NULL)
52  ERR("no memory");
53  fp->gf = gf;
54  return ((aiori_fd_t *)fp);
55 }
56 
57 aiori_fd_t *
58 Gfarm_open(char *fn, int flag, aiori_mod_opt_t *param)
59 {
60  GFS_File gf;
61  struct gfarm_file *fp;
62  gfarm_error_t e;
63 
64  if (hints->dryRun)
65  return (NULL);
66 
67  e = gfs_pio_open(fn, GFARM_FILE_RDWR, &gf);
68  if (e != GFARM_ERR_NO_ERROR)
69  ERR("gfs_pio_open failed");
70  GFARM_MALLOC(fp);
71  if (fp == NULL)
72  ERR("no memory");
73  fp->gf = gf;
74  return ((aiori_fd_t *)fp);
75 }
76 
78 Gfarm_xfer(int access, aiori_fd_t *fd, IOR_size_t *buffer,
80 {
81  struct gfarm_file *fp = (struct gfarm_file *)fd;
82  IOR_offset_t rem = len;
83  gfarm_off_t off;
84  gfarm_error_t e;
85 #define MAX_SZ (1024 * 1024 * 1024)
86  int sz, n;
87  char *buf = (char *)buffer;
88 
89  if (hints->dryRun)
90  return (len);
91 
92  if (len > MAX_SZ)
93  sz = MAX_SZ;
94  else
95  sz = len;
96 
97  e = gfs_pio_seek(fp->gf, offset, GFARM_SEEK_SET, &off);
98  if (e != GFARM_ERR_NO_ERROR)
99  ERR("gfs_pio_seek failed");
100  while (rem > 0) {
101  if (access == WRITE)
102  e = gfs_pio_write(fp->gf, buf, sz, &n);
103  else
104  e = gfs_pio_read(fp->gf, buf, sz, &n);
105  if (e != GFARM_ERR_NO_ERROR)
106  ERR("xfer failed");
107  if (n == 0)
108  ERR("EOF encountered");
109  rem -= n;
110  buf += n;
111  }
112  return (len);
113 }
114 
115 void
117 {
118  struct gfarm_file *fp = (struct gfarm_file *)fd;
119 
120  if (hints->dryRun)
121  return;
122 
123  if (gfs_pio_close(fp->gf) != GFARM_ERR_NO_ERROR)
124  ERR("gfs_pio_close failed");
125  free(fp);
126 }
127 
128 void
129 Gfarm_delete(char *fn, aiori_mod_opt_t *param)
130 {
131  gfarm_error_t e;
132 
133  if (hints->dryRun)
134  return;
135 
136  e = gfs_unlink(fn);
137  if (e != GFARM_ERR_NO_ERROR)
138  errno = gfarm_error_to_errno(e);
139 }
140 
141 char *
143 {
144  return ((char *)gfarm_version());
145 }
146 
147 void
149 {
150  struct gfarm_file *fp = (struct gfarm_file *)fd;
151 
152  if (hints->dryRun)
153  return;
154 
155  if (gfs_pio_sync(fp->gf) != GFARM_ERR_NO_ERROR)
156  ERR("gfs_pio_sync failed");
157 }
158 
161 {
162  struct gfs_stat st;
163  IOR_offset_t size, sum, min, max;
164 
165  if (hints->dryRun)
166  return (0);
167 
168  if (gfs_stat(fn, &st) != GFARM_ERR_NO_ERROR)
169  ERR("gfs_stat failed");
170  size = st.st_size;
171  gfs_stat_free(&st);
172 
173  return (size);
174 }
175 
176 int
177 Gfarm_statfs(const char *fn, ior_aiori_statfs_t *st, aiori_mod_opt_t *param)
178 {
179  gfarm_off_t used, avail, files;
180  gfarm_error_t e;
181  int bsize = 4096;
182 
183  if (hints->dryRun)
184  return (0);
185 
186  e = gfs_statfs_by_path(fn, &used, &avail, &files);
187  if (e != GFARM_ERR_NO_ERROR) {
188  errno = gfarm_error_to_errno(e);
189  return (-1);
190  }
191  st->f_bsize = bsize;
192  st->f_blocks = (used + avail) / bsize;
193  st->f_bfree = avail / bsize;
194  st->f_files = 2 * files; /* XXX */
195  st->f_ffree = files; /* XXX */
196  return (0);
197 }
198 
199 int
200 Gfarm_mkdir(const char *fn, mode_t mode, aiori_mod_opt_t *param)
201 {
202  gfarm_error_t e;
203 
204  if (hints->dryRun)
205  return (0);
206 
207  e = gfs_mkdir(fn, mode);
208  if (e == GFARM_ERR_NO_ERROR)
209  return (0);
210  errno = gfarm_error_to_errno(e);
211  return (-1);
212 }
213 
214 int
215 Gfarm_rmdir(const char *fn, aiori_mod_opt_t *param)
216 {
217  gfarm_error_t e;
218 
219  if (hints->dryRun)
220  return (0);
221 
222  e = gfs_rmdir(fn);
223  if (e == GFARM_ERR_NO_ERROR)
224  return (0);
225  errno = gfarm_error_to_errno(e);
226  return (-1);
227 }
228 
229 int
230 Gfarm_access(const char *fn, int mode, aiori_mod_opt_t *param)
231 {
232  struct gfs_stat st;
233  gfarm_error_t e;
234 
235  if (hints->dryRun)
236  return (0);
237 
238  e = gfs_stat(fn, &st);
239  if (e != GFARM_ERR_NO_ERROR) {
240  errno = gfarm_error_to_errno(e);
241  return (-1);
242  }
243  gfs_stat_free(&st);
244  return (0);
245 }
246 
247 /* XXX FIXME */
248 #define GFS_DEV ((dev_t)-1)
249 #define GFS_BLKSIZE 8192
250 #define STAT_BLKSIZ 512 /* for st_blocks */
251 
252 int
253 Gfarm_stat(const char *fn, struct stat *buf, aiori_mod_opt_t *param)
254 {
255  struct gfs_stat st;
256  gfarm_error_t e;
257 
258  if (hints->dryRun)
259  return (0);
260 
261  e = gfs_stat(fn, &st);
262  if (e != GFARM_ERR_NO_ERROR) {
263  errno = gfarm_error_to_errno(e);
264  return (-1);
265  }
266  buf->st_dev = GFS_DEV;
267  buf->st_ino = st.st_ino;
268  buf->st_mode = st.st_mode;
269  buf->st_nlink = st.st_nlink;
270  buf->st_uid = getuid(); /* XXX */
271  buf->st_gid = getgid(); /* XXX */
272  buf->st_size = st.st_size;
273  buf->st_blksize = GFS_BLKSIZE;
274  buf->st_blocks = (st.st_size + STAT_BLKSIZ - 1) / STAT_BLKSIZ;
275  buf->st_atime = st.st_atimespec.tv_sec;
276  buf->st_mtime = st.st_mtimespec.tv_sec;
277  buf->st_ctime = st.st_ctimespec.tv_sec;
278 #if defined(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC)
279  buf->st_atim.tv_nsec = st.st_atimespec.tv_nsec;
280  buf->st_mtim.tv_nsec = st.st_mtimespec.tv_nsec;
281  buf->st_ctim.tv_nsec = st.st_ctimespec.tv_nsec;
282 #endif
283  gfs_stat_free(&st);
284  return (0);
285 }
286 
287 void
289 {
290  if (hints->dryRun)
291  return;
292 
293  /* no cache in libgfarm */
294  return;
295 }
296 
298  .name = "Gfarm",
299  .name_legacy = NULL,
300  .create = Gfarm_create,
301  .open = Gfarm_open,
302  .xfer_hints = Gfarm_xfer_hints,
303  .xfer = Gfarm_xfer,
304  .close = Gfarm_close,
305  .delete = Gfarm_delete,
306  .get_version = Gfarm_version,
307  .fsync = Gfarm_fsync,
308  .get_file_size = Gfarm_get_file_size,
309  .statfs = Gfarm_statfs,
310  .mkdir = Gfarm_mkdir,
311  .rmdir = Gfarm_rmdir,
312  .access = Gfarm_access,
313  .stat = Gfarm_stat,
314  .initialize = Gfarm_initialize,
315  .finalize = Gfarm_finalize,
316  .get_options = NULL,
317  .sync = Gfarm_sync,
318  .enable_mdtest = true,
319 };
void Gfarm_initialize()
Definition: aiori-Gfarm.c:26
uint64_t f_blocks
Definition: aiori.h:53
uint64_t f_bfree
Definition: aiori.h:54
void Gfarm_delete(char *fn, aiori_mod_opt_t *param)
Definition: aiori-Gfarm.c:129
int Gfarm_rmdir(const char *fn, aiori_mod_opt_t *param)
Definition: aiori-Gfarm.c:215
#define GFS_BLKSIZE
Definition: aiori-Gfarm.c:249
int errno
IOR_offset_t Gfarm_get_file_size(aiori_mod_opt_t *param, char *fn)
Definition: aiori-Gfarm.c:160
aiori_fd_t * Gfarm_create(char *fn, int flag, aiori_mod_opt_t *param)
Definition: aiori-Gfarm.c:38
#define MAX_SZ
#define min(a, b)
Definition: md-workbench.c:26
GFS_File gf
Definition: aiori-Gfarm.c:14
uint64_t f_ffree
Definition: aiori.h:57
int Gfarm_stat(const char *fn, struct stat *buf, aiori_mod_opt_t *param)
Definition: aiori-Gfarm.c:253
#define WRITE
Definition: iordef.h:86
void Gfarm_fsync(aiori_fd_t *fd, aiori_mod_opt_t *param)
Definition: aiori-Gfarm.c:148
void Gfarm_finalize()
Definition: aiori-Gfarm.c:32
static aiori_xfer_hint_t * hints
Definition: aiori-Gfarm.c:17
int Gfarm_mkdir(const char *fn, mode_t mode, aiori_mod_opt_t *param)
Definition: aiori-Gfarm.c:200
uint64_t f_files
Definition: aiori.h:56
uint64_t f_bsize
Definition: aiori.h:52
Definition: ior.h:56
void Gfarm_xfer_hints(aiori_xfer_hint_t *params)
Definition: aiori-Gfarm.c:20
void Gfarm_close(aiori_fd_t *fd, aiori_mod_opt_t *param)
Definition: aiori-Gfarm.c:116
long long int IOR_size_t
Definition: iordef.h:110
int Gfarm_statfs(const char *fn, ior_aiori_statfs_t *st, aiori_mod_opt_t *param)
Definition: aiori-Gfarm.c:177
char * Gfarm_version()
Definition: aiori-Gfarm.c:142
void Gfarm_sync(aiori_mod_opt_t *param)
Definition: aiori-Gfarm.c:288
#define GFS_DEV
Definition: aiori-Gfarm.c:248
int Gfarm_access(const char *fn, int mode, aiori_mod_opt_t *param)
Definition: aiori-Gfarm.c:230
#define ERR(MSG)
Definition: aiori-debug.h:92
char * name
Definition: aiori.h:88
aiori_fd_t * Gfarm_open(char *fn, int flag, aiori_mod_opt_t *param)
Definition: aiori-Gfarm.c:58
long long int IOR_offset_t
Definition: iordef.h:109
IOR_offset_t Gfarm_xfer(int access, aiori_fd_t *fd, IOR_size_t *buffer, IOR_offset_t len, IOR_offset_t offset, aiori_mod_opt_t *param)
Definition: aiori-Gfarm.c:78
ior_aiori_t gfarm_aiori
Definition: aiori-Gfarm.c:297
#define STAT_BLKSIZ
Definition: aiori-Gfarm.c:250
#define NULL
Definition: iordef.h:70