Whamcloud - gitweb
cd977569974fc1c8ecf381b48e12e29462b05ccd
[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 #ifdef SYSIO_LABEL_NAMES
102 #define SYSIO_INTERFACE_NAME(x) \
103         PREPEND(SYSIO_LABEL_NAMES, x)
104 #else
105 #define SYSIO_INTERFACE_NAME(x) x
106 #endif
107
108 /* for debugging */
109 #if 0
110 #define ASSERT(cond)                                                    \
111         if (!(cond)) {                                                  \
112                 printf("ASSERTION(" #cond ") failed: " __FILE__ ":"     \
113                         __FUNCTION__ ":%d\n", __LINE__);                \
114                 abort();                                                \
115         }
116
117 #define ERROR(fmt, a...)                                                \
118         do {                                                            \
119                 printf("ERROR(" __FILE__ ":%d):" fmt, __LINE__, ##a);   \
120         while(0)
121
122 #else
123 #define ERROR(fmt)      do{}while(0)
124 #define ASSERT          do{}while(0)
125 #endif
126
127 /*
128  * SYSIO interface frame macros
129  *
130  * + DISPLAY_BLOCK; Allocates storage on the stack for use by the set of
131  *      macros.
132  * + ENTER; Performs entry point work
133  * + RETURN; Returns a value and performs exit point work
134  *
135  * NB: For RETURN, the arguments are the return value and value for errno.
136  * If the value for errno is non-zero then that value, *negated*, is set
137  * into errno.
138  */
139 #define SYSIO_INTERFACE_DISPLAY_BLOCK \
140         int _saved_errno;
141 #define SYSIO_INTERFACE_ENTER \
142         do { \
143                 _saved_errno = errno; \
144                 SYSIO_ENTER; \
145         } while (0)
146 #define SYSIO_INTERFACE_RETURN(rtn, err) \
147         do { \
148                 SYSIO_LEAVE; \
149                 errno = (err) ? -(err) : _saved_errno; \
150                 return (rtn); \
151         } while(0) 
152
153 /* Interface enter/leave hook functions  */
154 #if SYSIO_TRACING
155 extern void *_sysio_entry_trace_q;
156 extern void *_sysio_exit_trace_q;
157
158 extern void *_sysio_register_trace(void *q,
159                                    void (*)(const char *file,
160                                             const char *func,
161                                             int line));
162 extern void _sysio_remove_trace(void *q, void *p);
163 extern void _sysio_run_trace_q(void *q,
164                                const char *file,
165                                const char *func,
166                                int line);
167 #define SYSIO_ENTER                                                     \
168         do { \
169                 _sysio_run_trace_q(_sysio_entry_trace_q,                \
170                                    __FILE__, __func__, __LINE__);       \
171         } while (0)
172
173
174 #define SYSIO_LEAVE                                                     \
175         do { \
176                 _sysio_run_trace_q(_sysio_exit_trace_q,                 \
177                                    __FILE__, __func__, __LINE__);       \
178         } while (0)
179 #else
180 #define SYSIO_ENTER                                                     \
181         do { } while (0)
182 #define SYSIO_LEAVE                                                     \
183         do { } while (0)
184 #endif
185
186 /* accounting for IO stats read and write char count */
187 #if defined(REDSTORM)
188 #define _SYSIO_UPDACCT(w, cc) \
189         do { \
190                 if ((cc) < 0) \
191                         break; \
192                 if (!w) \
193                         _add_iostats(0, (size_t )(cc)); \
194                 else \
195                         _add_iostats((size_t )(cc), 0); \
196         } while(0)
197 #else
198 #define _SYSIO_UPDACCT(w, cc)
199 #endif
200
201 extern ssize_t _sysio_validx(const struct intnl_xtvec *xtv, size_t xtvlen,
202                              const struct iovec *iov, size_t iovlen,
203                              _SYSIO_OFF_T limit);
204 extern ssize_t _sysio_enumerate_extents(const struct intnl_xtvec *xtv,
205                                         size_t xtvlen,
206                                         const struct iovec *iov,
207                                         size_t iovlen,
208                                         ssize_t (*f)(const struct iovec *,
209                                                      int,
210                                                      _SYSIO_OFF_T,
211                                                      ssize_t,
212                                                      void *),
213                                         void *arg);
214 extern ssize_t _sysio_enumerate_iovec(const struct iovec *iov,
215                                       size_t count,
216                                       _SYSIO_OFF_T off,
217                                       ssize_t limit,
218                                       ssize_t (*f)(void *,
219                                                    size_t,
220                                                    _SYSIO_OFF_T,
221                                                    void *),
222                                       void *arg);
223 extern ssize_t _sysio_doio(const struct intnl_xtvec *xtv, size_t xtvlen,
224                            const struct iovec *iov, size_t iovlen,
225                            ssize_t (*f)(void *, size_t, _SYSIO_OFF_T, void *),
226                            void *arg);