1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3 * Copyright (C) 2003 University of Chicago.
4 * See COPYRIGHT notice in top-level directory.
5 */
6
7 #include "ad_zoidfs.h"
8 #include "ad_zoidfs_common.h"
9 #include <unistd.h>
10 #include <sys/types.h>
11
12 /* keyval hack to both tell us if we've already initialized zoidfs and also
13 * close it down when mpi exits */
14 int ADIOI_ZOIDFS_Initialized = MPI_KEYVAL_INVALID;
15
ADIOI_ZOIDFS_End(int * error_code)16 void ADIOI_ZOIDFS_End(int *error_code)
17 {
18 int ret;
19 static char myname[] = "ADIOI_ZOIDFS_END";
20
21 ret = zoidfs_finalize();
22
23 /* --BEGIN ERROR HANDLING-- */
24 if (ret != 0 ) {
25 *error_code = MPIO_Err_create_code(MPI_SUCCESS,
26 MPIR_ERR_RECOVERABLE,
27 myname, __LINE__,
28 ADIOI_ZOIDFS_error_convert(ret),
29 "Error in zoidfs_finalize", 0);
30 return;
31 }
32 /* --END ERROR HANDLING-- */
33
34 *error_code = MPI_SUCCESS;
35 }
36
ADIOI_ZOIDFS_End_call(MPI_Comm comm,int keyval,void * attribute_val,void * extra_state)37 int ADIOI_ZOIDFS_End_call(MPI_Comm comm, int keyval,
38 void *attribute_val, void *extra_state)
39 {
40 int error_code;
41 ADIOI_ZOIDFS_End(&error_code);
42 MPI_Keyval_free(&keyval);
43 return error_code;
44 }
45
ADIOI_ZOIDFS_Init(int rank,int * error_code)46 void ADIOI_ZOIDFS_Init(int rank, int *error_code )
47 {
48 int ret;
49 static char myname[] = "ADIOI_ZOIDFS_INIT";
50
51 /* do nothing if we've already fired up the zoidfs interface */
52 if (ADIOI_ZOIDFS_Initialized != MPI_KEYVAL_INVALID) {
53 *error_code = MPI_SUCCESS;
54 return;
55 }
56
57 ret = zoidfs_init();
58 if (ret < 0 ) {
59 *error_code = MPIO_Err_create_code(MPI_SUCCESS,
60 MPIR_ERR_RECOVERABLE,
61 myname, __LINE__,
62 ADIOI_ZOIDFS_error_convert(ret),
63 "Error in zoidfs_init",
64 0);
65 return;
66 }
67
68 MPI_Keyval_create(MPI_NULL_COPY_FN, ADIOI_ZOIDFS_End_call,
69 &ADIOI_ZOIDFS_Initialized, (void *)0);
70 /* just like romio does, we make a dummy attribute so we
71 * get cleaned up */
72 MPI_Attr_put(MPI_COMM_SELF, ADIOI_ZOIDFS_Initialized, (void *)0);
73 }
74
ADIOI_ZOIDFS_makeattribs(zoidfs_sattr_t * attribs)75 void ADIOI_ZOIDFS_makeattribs(zoidfs_sattr_t * attribs)
76 {
77 memset(attribs, 0, sizeof(zoidfs_sattr_t));
78
79 attribs->mask = ZOIDFS_ATTR_MODE;
80 attribs->mode = 0644;
81 }
82
ADIOI_ZOIDFS_error_convert(int error)83 int ADIOI_ZOIDFS_error_convert(int error)
84 {
85 switch (error)
86 {
87 case ZFSERR_PERM: /* ??? */
88 case ZFSERR_ACCES:
89 return MPI_ERR_ACCESS;
90 case ZFSERR_NOENT:
91 case ZFSERR_NXIO: /* ??? */
92 case ZFSERR_NODEV: /* ??? */
93 return MPI_ERR_NO_SUCH_FILE;
94 case ZFSERR_IO:
95 return MPI_ERR_IO;
96 case ZFSERR_EXIST:
97 return MPI_ERR_FILE_EXISTS;
98 case ZFSERR_NOTDIR: /* ??? */
99 case ZFSERR_ISDIR: /* ??? */
100 case ZFSERR_NAMETOOLONG:
101 return MPI_ERR_BAD_FILE;
102 case ZFSERR_INVAL:
103 case ZFSERR_STALE:
104 return MPI_ERR_FILE;
105 case ZFSERR_FBIG: /* ??? */
106 case ZFSERR_NOSPC:
107 return MPI_ERR_NO_SPACE;
108 case ZFSERR_ROFS:
109 return MPI_ERR_READ_ONLY;
110 case ZFSERR_NOTIMPL:
111 return MPI_ERR_UNSUPPORTED_OPERATION;
112 case ZFSERR_DQUOT:
113 return MPI_ERR_QUOTA;
114 /* case ZFSERR_NOTEMPTY: */
115 /* case ZFSERR_WFLUSH: */
116 /* case ZFSERR_OTHER: */
117 case ZFSERR_NOMEM:
118 return MPI_ERR_INTERN;
119 default:
120 return MPI_UNDEFINED;
121 }
122 }
123
124 /*
125 * vim: ts=8 sts=4 sw=4 noexpandtab
126 */
127