Whamcloud - gitweb
Branch HEAD
[fs/lustre-release.git] / libsysio / include / sysio-cmn.h
1 /*
2  *    This Cplant(TM) source code is the property of Sandia National
3  *    Laboratories.
4  *
5  *    This Cplant(TM) source code is copyrighted by Sandia National
6  *    Laboratories.
7  *
8  *    The redistribution of this Cplant(TM) source code is subject to the
9  *    terms of the GNU Lesser General Public License
10  *    (see cit/LGPL or http://www.gnu.org/licenses/lgpl.html)
11  *
12  *    Cplant(TM) Copyright 1998-2005 Sandia Corporation. 
13  *    Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
14  *    license for use of this work by or on behalf of the US Government.
15  *    Export of this program may require a license from the United States
16  *    Government.
17  */
18
19 /*
20  * This library is free software; you can redistribute it and/or
21  * modify it under the terms of the GNU Lesser General Public
22  * License as published by the Free Software Foundation; either
23  * version 2.1 of the License, or (at your option) any later version.
24  * 
25  * This library is distributed in the hope that it will be useful,
26  * but WITHOUT ANY WARRANTY; without even the implied warranty of
27  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28  * Lesser General Public License for more details.
29  * 
30  * You should have received a copy of the GNU Lesser General Public
31  * License along with this library; if not, write to the Free Software
32  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33  *
34  * Questions or comments about this library should be sent to:
35  *
36  * Lee Ward
37  * Sandia National Laboratories, New Mexico
38  * P.O. Box 5800
39  * Albuquerque, NM 87185-1110
40  *
41  * lee@sandia.gov
42  */
43
44 /*
45  * System IO common information.
46  */
47
48 #if !defined(__IS_UNUSED) && defined(__GNUC__)
49 #define __IS_UNUSED     __attribute__ ((unused))
50 #else
51 #define __IS_UNUSED
52 #endif
53
54 #ifndef _LARGEFILE64_SOURCE
55 /*
56  * Not glibc I guess. Define this ourselves.
57  */
58 #define _LARGEFILE64_SOURCE             0
59 #endif
60
61 /*
62  * Define internal file-offset type and it's maximum value.
63  */
64 #if _LARGEFILE64_SOURCE
65 #define _SYSIO_OFF_T                    off64_t
66 #ifdef LLONG_MAX
67 #define _SYSIO_OFF_T_MAX                (LLONG_MAX)
68 #else
69 /*
70  * Don't have LLONG_MAX before C99. We'll need to define it ourselves.
71  */
72 #define _SYSIO_OFF_T_MAX                (9223372036854775807LL)
73 #endif
74 #else
75 #define _SYSIO_OFF_T                    off_t
76 #define _SYSIO_OFF_T_MAX                LONG_MAX
77 #endif
78
79 /*
80  * Internally, all file status is carried in the 64-bit capable
81  * structure.
82  */
83 #if _LARGEFILE64_SOURCE
84 #define intnl_xtvec xtvec64
85 #else
86 #define intnl_xtvec xtvec
87 #endif
88 struct intnl_xtvec;
89
90 struct iovec;
91
92
93 #define _PREPEND_HELPER(p, x) \
94         p ## x
95 #define PREPEND(p, x) \
96         _PREPEND_HELPER(p, x)
97
98 /*
99  * SYSIO name label macros
100  */
101 #ifndef SYSIO_INTERFACE_NAME
102 #ifdef SYSIO_LABEL_NAMES
103 #define SYSIO_INTERFACE_NAME(x) \
104         PREPEND(SYSIO_LABEL_NAMES, x)
105 #else
106 #define SYSIO_INTERFACE_NAME(x) x
107 #endif /* SYSIO_LABEL_NAMES */
108 #endif /* !SYSIO_INTERFACE_NAME */
109
110 /* for debugging */
111 #if 0
112 #define ASSERT(cond)                                                    \
113         if (!(cond)) {                                                  \
114                 printf("ASSERTION(" #cond ") failed: " __FILE__ ":"     \
115                         __FUNCTION__ ":%d\n", __LINE__);                \
116                 abort();                                                \
117         }
118
119 #define ERROR(fmt, a...)                                                \
120         do {                                                            \
121                 printf("ERROR(" __FILE__ ":%d):" fmt, __LINE__, ##a);   \
122         while(0)
123
124 #else
125 #define ERROR(fmt)      do{}while(0)
126 #define ASSERT          do{}while(0)
127 #endif
128
129 /*
130  * SYSIO interface frame macros
131  *
132  * + DISPLAY_BLOCK; Allocates storage on the stack for use by the set of
133  *      macros.
134  * + ENTER; Performs entry point work
135  * + RETURN; Returns a value and performs exit point work
136  *
137  * NB: For RETURN, the arguments are the return value and value for errno.
138  * If the value for errno is non-zero then that value, *negated*, is set
139  * into errno.
140  */
141 #define SYSIO_INTERFACE_DISPLAY_BLOCK \
142         int _saved_errno;
143 #define SYSIO_INTERFACE_ENTER \
144         do { \
145                 _saved_errno = errno; \
146                 SYSIO_ENTER; \
147         } while (0)
148 #define SYSIO_INTERFACE_RETURN(rtn, err) \
149         do { \
150                 SYSIO_LEAVE; \
151                 errno = (err) ? -(err) : _saved_errno; \
152                 return (rtn); \
153         } while(0) 
154
155 /* Interface enter/leave hook functions  */
156 #ifdef SYSIO_TRACING
157 extern void *_sysio_entry_trace_q;
158 extern void *_sysio_exit_trace_q;
159
160 extern void *_sysio_register_trace(void *q,
161                                    void (*)(const char *file,
162                                             const char *func,
163                                             int line));
164 extern void _sysio_remove_trace(void *q, void *p);
165 extern void _sysio_run_trace_q(void *q,
166                                const char *file,
167                                const char *func,
168                                int line);
169 #define SYSIO_ENTER                                                     \
170         do { \
171                 _sysio_run_trace_q(_sysio_entry_trace_q,                \
172                                    __FILE__, __func__, __LINE__);       \
173         } while (0)
174
175
176 #define SYSIO_LEAVE                                                     \
177         do { \
178                 _sysio_run_trace_q(_sysio_exit_trace_q,                 \
179                                    __FILE__, __func__, __LINE__);       \
180         } while (0)
181 #else
182 #define SYSIO_ENTER                                                     \
183         do { } while (0)
184 #define SYSIO_LEAVE                                                     \
185         do { } while (0)
186 #endif
187
188 /* accounting for IO stats read and write char count */
189 #if defined(REDSTORM)
190 #define _SYSIO_UPDACCT(w, cc) \
191         do { \
192                 if ((cc) < 0) \
193                         break; \
194                 if (!w) \
195                         _add_iostats(0, (size_t )(cc)); \
196                 else \
197                         _add_iostats((size_t )(cc), 0); \
198         } while(0)
199 #else
200 #define _SYSIO_UPDACCT(w, cc)
201 #endif
202
203 extern ssize_t _sysio_validx(const struct intnl_xtvec *xtv, size_t xtvlen,
204                              const struct iovec *iov, size_t iovlen,
205                              _SYSIO_OFF_T limit);
206 extern ssize_t _sysio_enumerate_extents(const struct intnl_xtvec *xtv,
207                                         size_t xtvlen,
208                                         const struct iovec *iov,
209                                         size_t iovlen,
210                                         ssize_t (*f)(const struct iovec *,
211                                                      int,
212                                                      _SYSIO_OFF_T,
213                                                      ssize_t,
214                                                      void *),
215                                         void *arg);
216 extern ssize_t _sysio_enumerate_iovec(const struct iovec *iov,
217                                       size_t count,
218                                       _SYSIO_OFF_T off,
219                                       ssize_t limit,
220                                       ssize_t (*f)(void *,
221                                                    size_t,
222                                                    _SYSIO_OFF_T,
223                                                    void *),
224                                       void *arg);
225 extern ssize_t _sysio_doio(const struct intnl_xtvec *xtv, size_t xtvlen,
226                            const struct iovec *iov, size_t iovlen,
227                            ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, void *),
228                            void *arg);