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