vol: remove SYNC fatal_error processing
[openafs.git] / src / vol / ihandle.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /* An IHandle_t is an abstraction allowing the file and volume operations to
11  * pass the elements required to identify a file to the underlying file
12  * systen. For the usual Vice inode operations, this is no more than the
13  * usual device and inode numbers. For the user space file system used on NT
14  * we also need the volume id to identify the file.
15  *
16  * An FdHandle_t is an abstraction used to associate file descroptors
17  * with Inode handles. IH_OPEN is used to get a file descriptor that
18  * can be used in subsequent I/O operations. File descriptor handles are
19  * cached by IO_CLOSE. To make sure a file descriptor is really closed call
20  * IH_REALLYCLOSE.
21  *
22  * The IHandle_t also provides a place to do other optimizations. In the
23  * NT user space file system, we keep a separate special file for the
24  * link counts and using the IHandle_t allows keeping the details of
25  * that at a lower level than the IDEC and IINC calls.
26  *
27  * To use the IHandle_t there are a new set of IH_xxxx/FDH_XXXX operations.
28  * Each takes a pointer to an IHandle_t or an FdHandle_t as the first
29  * argument. This pointer is  considered an in/out variable. In particular,
30  * the open file descriptors for a given Inode are stored in a linked list
31  * of FdHandle_t hanging off of each IHandle_t. IH_OPEN returns NULL on error,
32  * and a valid FdHandle_t otherwise. All other IH_xxxx/FDH_xxxx macros return
33  * -1 on error and 0 on success.
34  *
35  * Inode handle operations:
36  * IH_INIT - Initialize the Inode handle with the device, volume id, and ino
37  * IH_COPY - Copy Inode handle info to a new handle with no open descriptors.
38  * IH_REALLYCLOSE - Close all cached file descriptors for Inode handle
39  * IH_RELEASE - release a Inode handle, close all cached file descriptors
40  * IH_CONDSYNC -  snyc the Inode if it has any open file descriptors
41  *
42  * Inode operation replacements:
43  * IH_CREATE - create a file in the underlying filesystem and setup the
44  *      information needed to reference this file in the IHandle_t.
45  * IH_OPEN - open the file belonging to the associated inode and set the
46  *      file descriptor.
47  * IH_IREAD/IH_IWRITE - read/write an Inode.
48  * IH_INC/IH_DEC - increment/decrement the link count.
49  *
50  * Replacements for C runtime file operations
51  * FDH_READ/FDH_WRITE - read/write using the file descriptor.
52  * FDH_READV/FDH_WRITEV - readv/writev (Unix only)
53  * FDH_SEEK - set file handle's read/write position
54  * FDH_CLOSE - return a file descriptor to the cache
55  * FDH_REALLYCLOSE - Close a file descriptor, do not return to the cache
56  * FDH_SYNC - Unconditionally sync an open file.
57  * FDH_TRUNC - Truncate a file
58  * FDH_LOCKFILE - Lock a whole file
59  * FDH_UNLOCKFILE - Unlock a whole file
60  *
61  * status information:
62  * FDH_SIZE - returns the size of the file.
63  * FDH_NLINK - returns the link count of the file.
64  *
65  * Miscellaneous:
66  * FDH_FDOPEN - create a descriptor for buffered I/O
67  * STREAM_READ/STREAM_WRITE - buffered file I/O
68  */
69
70 #ifndef _IHANDLE_H_
71 #define _IHANDLE_H_
72
73 #ifdef AFS_PTHREAD_ENV
74 #include <pthread.h>
75 extern pthread_once_t ih_glock_once;
76 extern pthread_mutex_t ih_glock_mutex;
77 extern void ih_glock_init(void);
78 #define IH_LOCK \
79     do { osi_Assert(pthread_once(&ih_glock_once, ih_glock_init) == 0);  \
80         MUTEX_ENTER(&ih_glock_mutex); \
81     } while (0)
82 #define IH_UNLOCK MUTEX_EXIT(&ih_glock_mutex)
83 #else /* AFS_PTHREAD_ENV */
84 #define IH_LOCK
85 #define IH_UNLOCK
86 #endif /* AFS_PTHREAD_ENV */
87
88 #ifndef DLL_INIT_LIST
89 /*
90  * Macro to initialize a doubly linked list, lifted from Encina
91  */
92 #define DLL_INIT_LIST(head, tail)       \
93     do {                                \
94         (head) = NULL;                  \
95         (tail) = NULL;                  \
96     } while(0)
97
98 /*
99  * Macro to remove an element from a doubly linked list
100  */
101 #define DLL_DELETE(ptr,head,tail,next,prev)     \
102     do {                                        \
103         if ((ptr)->next)                        \
104             (ptr)->next->prev = (ptr)->prev;    \
105         else                                    \
106             (tail) = (ptr)->prev;               \
107         if ((ptr)->prev)                        \
108             (ptr)->prev->next = (ptr)->next;    \
109         else                                    \
110             (head) = (ptr)->next;               \
111         (ptr)->next = (ptr)->prev = NULL;       \
112         osi_Assert(!(head) || !((head)->prev)); \
113     } while(0)
114
115 /*
116  * Macro to insert an element at the tail of a doubly linked list
117  */
118 #define DLL_INSERT_TAIL(ptr,head,tail,next,prev) \
119     do {                                         \
120         (ptr)->next = NULL;                      \
121         (ptr)->prev = (tail);                    \
122         (tail) = (ptr);                          \
123         if ((ptr)->prev)                         \
124             (ptr)->prev->next = (ptr);           \
125         else                                     \
126             (head) = (ptr);                      \
127         osi_Assert((head) && ((head)->prev == NULL));   \
128     } while(0)
129
130 #endif /* DLL_INIT_LIST */
131
132 #ifdef AFS_NT40_ENV
133 typedef __int64 Inode;
134 #else
135 #include <afs/afssyscalls.h>
136 #endif
137
138 /* The dir package's page hashing function is dependent upon the layout of
139  * IHandle_t as well as the containing DirHandle in viced/viced.h. Make
140  * Sure the volume id is still used as the hash after any changes to either
141  * structure.
142  */
143
144 /* forward declaration */
145 struct IHandle_s;
146
147 /* File descriptors are HANDLE's on NT. The following typedef helps catch
148  * type errors. duplicated in libadmin/vos/afs_vosAdmin.c
149  */
150 #ifdef AFS_NT40_ENV
151 typedef HANDLE FD_t;
152 #define INVALID_FD INVALID_HANDLE_VALUE
153 #else
154 typedef int FD_t;
155 #define INVALID_FD ((FD_t)-1)
156 #endif
157
158 /* file descriptor handle */
159 typedef struct FdHandle_s {
160     int fd_status;              /* status flags */
161     int fd_refcnt;              /* refcnt */
162     FD_t fd_fd;                 /* file descriptor */
163     struct IHandle_s *fd_ih;    /* Pointer to Inode handle */
164     struct FdHandle_s *fd_next; /* LRU/Avail list pointers */
165     struct FdHandle_s *fd_prev;
166     struct FdHandle_s *fd_ihnext;       /* Inode handle's list of file descriptors */
167     struct FdHandle_s *fd_ihprev;
168 } FdHandle_t;
169
170 /* File descriptor status values */
171 #define FD_HANDLE_AVAIL         1       /* handle is not open and available */
172 #define FD_HANDLE_OPEN          2       /* handle is open and not in use */
173 #define FD_HANDLE_INUSE         3       /* handle is open and in use */
174 #define FD_HANDLE_CLOSING       4       /* handle is open, in use, and has been
175                                          * IH_REALLYCLOSE'd. It should not be
176                                          * used for subsequent opens. */
177
178 /* buffered file descriptor handle */
179 #define STREAM_HANDLE_BUFSIZE   2048    /* buffer size for STR_READ/STR_WRITE */
180 typedef struct StreamHandle_s {
181     FD_t str_fd;                /* file descriptor */
182     int str_direction;          /* current read/write direction */
183     afs_sfsize_t str_buflen;    /* bytes remaining in buffer */
184     afs_foff_t str_bufoff;      /* current offset into buffer */
185     afs_foff_t str_fdoff;       /* current offset into file */
186     int str_error;              /* error code */
187     int str_eof;                /* end of file flag */
188     struct StreamHandle_s *str_next;    /* Avail list pointers */
189     struct StreamHandle_s *str_prev;
190     char str_buffer[STREAM_HANDLE_BUFSIZE];     /* data buffer */
191 } StreamHandle_t;
192
193 #define STREAM_DIRECTION_NONE   1       /* stream is in initial mode */
194 #define STREAM_DIRECTION_READ   2       /* stream is in input mode */
195 #define STREAM_DIRECTION_WRITE  3       /* stream is in output mode */
196
197 /* number handles allocated at a shot */
198 #define I_HANDLE_MALLOCSIZE     ((size_t)((4096/sizeof(IHandle_t))))
199 #define FD_HANDLE_MALLOCSIZE    ((size_t)((4096/sizeof(FdHandle_t))))
200 #define STREAM_HANDLE_MALLOCSIZE 1
201
202
203 /* READ THIS.
204  *
205  * On modern platforms tuned for I/O intensive workloads, there may be
206  * thousands of file descriptors available (64K on 32-bit Solaris 7,
207  * for example), and threading in Solaris 9 and Linux 2.6 (NPTL) are
208  * tuned for (many) thousands of concurrent threads at peak.
209  *
210  * On these platforms, it makes sense to allow administrators to set
211  * appropriate limits for their hardware.  Clients may now set desired
212  * values in the exported vol_io_params, of type ih_init_params.
213  */
214
215 typedef struct ih_init_params
216 {
217     afs_uint32 fd_handle_setaside; /* for non-cached i/o, trad. was 128 */
218     afs_uint32 fd_initial_cachesize; /* what was 'default' */
219     afs_uint32 fd_max_cachesize; /* max open files if large-cache activated */
220 } ih_init_params;
221
222
223 /* Number of file descriptors needed for non-cached I/O */
224 #define FD_HANDLE_SETASIDE      128 /* Match to MAX_FILESERVER_THREAD */
225
226 /* Which systems have 8-bit fileno?  On GNU/Linux systems, the
227  * fileno member of FILE is an int.  On NetBSD 5, it's a short.
228  * Ditto for OpenBSD 4.5. Through Solaris 10 8/07 it's unsigned char.
229  */
230
231 /* Don't try to have more than 256 files open at once if you are planning
232  * to use fopen or fdopen. The FILE structure has an eight bit field for
233  * the file descriptor.  */
234 #define FD_DEFAULT_CACHESIZE (255-FD_HANDLE_SETASIDE)
235
236 /* We need some limit on the number of files open at once. Some systems
237  * say we can open lots of files, but when we do they run out of slots
238  * in the file table.
239  */
240 #define FD_MAX_CACHESIZE (2000 - FD_HANDLE_SETASIDE)
241
242 /* On modern platforms, this is sized higher than the note implies.
243  * For HP, see http://forums11.itrc.hp.com/service/forums/questionanswer.do?admit=109447626+1242508538748+28353475&threadId=302950
244  * On AIX, it's said to be self-tuning (sar -v)
245  * On Solaris, http://www.princeton.edu/~unix/Solaris/troubleshoot/kerntune.html
246  * says stdio limit (FILE) may exist, but then backtracks and says the 64bit
247  * solaris and POLL (rather than select) io avoid the issue.  Solaris Internals
248  * states that Solaris 7 and above deal with up to 64K on 32bit.
249  * However, extended FILE must be enabled to use this. See
250  * enable_extended_FILE_stdio(3C)
251  */
252
253 /* Inode handle */
254 typedef struct IHandle_s {
255     afs_uint32 ih_vid;          /* Parent volume id. */
256     int ih_dev;                 /* device id. */
257     int ih_flags;               /* Flags */
258     int ih_synced;              /* should be synced next time */
259     Inode ih_ino;               /* Inode number */
260     int ih_refcnt;              /* reference count */
261     struct FdHandle_s *ih_fdhead;       /* List of open file desciptors */
262     struct FdHandle_s *ih_fdtail;
263     struct IHandle_s *ih_next;  /* Links for avail list/hash chains */
264     struct IHandle_s *ih_prev;
265 } IHandle_t;
266
267 /* Flags for the Inode handle */
268 #define IH_REALLY_CLOSED                1
269
270 /* Hash function for inode handles */
271 #define I_HANDLE_HASH_SIZE      2048    /* power of 2 */
272
273 /* The casts to int's ensure NT gets the xor operation correct. */
274 #define IH_HASH(D, V, I) ((int)(((D)^(V)^((int)(I)))&(I_HANDLE_HASH_SIZE-1)))
275
276 /*
277  * Hash buckets for inode handles
278  */
279 typedef struct IHashBucket_s {
280     IHandle_t *ihash_head;
281     IHandle_t *ihash_tail;
282 } IHashBucket_t;
283
284 /* Prototypes for handle support routines. */
285 #ifdef AFS_NAMEI_ENV
286 #ifdef AFS_NT40_ENV
287 #include "ntops.h"
288 #endif
289 #include "namei_ops.h"
290
291 extern void ih_clear(IHandle_t * h);
292 extern Inode ih_create(IHandle_t * h, int dev, char *part, Inode nI, int p1,
293                        int p2, int p3, int p4);
294 extern FD_t *ih_fdopen(FdHandle_t * h, char *fdperms);
295 #endif /* AFS_NAMEI_ENV */
296
297 /*
298  * Prototypes for file descriptor cache routines
299  */
300 extern void ih_PkgDefaults(void);
301 extern void ih_Initialize(void);
302 extern void ih_UseLargeCache(void);
303 extern IHandle_t *ih_init(int /*@alt Device@ */ dev, int /*@alt VolId@ */ vid,
304                           Inode ino);
305 extern IHandle_t *ih_copy(IHandle_t * ihP);
306 extern FdHandle_t *ih_open(IHandle_t * ihP);
307 extern int fd_close(FdHandle_t * fdP);
308 extern int fd_reallyclose(FdHandle_t * fdP);
309 extern StreamHandle_t *stream_fdopen(FD_t fd);
310 extern StreamHandle_t *stream_open(const char *file, const char *mode);
311 extern afs_sfsize_t stream_read(void *ptr, afs_fsize_t size,
312                                 afs_fsize_t nitems, StreamHandle_t * streamP);
313 extern afs_sfsize_t stream_write(void *ptr, afs_fsize_t size,
314                                  afs_fsize_t nitems,
315                                  StreamHandle_t * streamP);
316 extern int stream_aseek(StreamHandle_t * streamP, afs_foff_t offset);
317 extern int stream_flush(StreamHandle_t * streamP);
318 extern int stream_close(StreamHandle_t * streamP, int reallyClose);
319 extern int ih_reallyclose(IHandle_t * ihP);
320 extern int ih_release(IHandle_t * ihP);
321 extern int ih_condsync(IHandle_t * ihP);
322
323 /* Macros common to user space and inode API's. */
324 #define IH_INIT(H, D, V, I) ((H) = ih_init((D), (V), (I)))
325
326 #define IH_COPY(D, S) ((D) = ih_copy(S))
327
328 #define IH_NLINK(H) ih_nlink(H)
329
330 #define IH_OPEN(H) ih_open(H)
331
332 #define FDH_CLOSE(H) (fd_close(H), (H)=NULL, 0)
333
334 #define FDH_REALLYCLOSE(H) (fd_reallyclose(H), (H)=NULL, 0)
335
336 #define FDH_FDOPEN(H, A) stream_fdopen((H)->fd_fd)
337
338 #define STREAM_FDOPEN(A, B) stream_fdopen(A)
339
340 #define STREAM_OPEN(A, B) stream_open(A, B)
341
342 #define STREAM_READ(A, B, C, H) stream_read(A, B, C, H)
343
344 #define STREAM_WRITE(A, B, C, H) stream_write(A, B, C, H)
345
346 #define STREAM_ASEEK(H, A) stream_aseek(H, A)
347
348 #define STREAM_FLUSH(H) stream_flush(H)
349
350 #define STREAM_ERROR(H) ((H)->str_error)
351
352 #define STREAM_EOF(H) ((H)->str_eof)
353
354 #define STREAM_CLOSE(H) stream_close(H, 0)
355
356 #define STREAM_REALLYCLOSE(H) stream_close(H, 1)
357
358 #define IH_RELEASE(H) (ih_release(H), (H)=NULL, 0)
359
360 #define IH_REALLYCLOSE(H) ih_reallyclose(H)
361
362 #define IH_CONDSYNC(H) ih_condsync(H)
363
364 #ifdef HAVE_PIO
365 #ifdef AFS_NT40_ENV
366 #define OS_PREAD(FD, B, S, O) nt_pread(FD, B, S, O)
367 #define OS_PWRITE(FD, B, S, O) nt_pwrite(FD, B, S, O)
368 #else
369 #ifdef O_LARGEFILE
370 #define OS_PREAD(FD, B, S, O) pread64(FD, B, S, O)
371 #define OS_PWRITE(FD, B, S, O) pwrite64(FD, B, S, O)
372 #else /* !O_LARGEFILE */
373 #define OS_PREAD(FD, B, S, O) pread(FD, B, S, O)
374 #define OS_PWRITE(FD, B, S, O) pwrite(FD, B, S, O)
375 #endif /* !O_LARGEFILE */
376 #endif /* AFS_NT40_ENV */
377 #else /* !HAVE_PIO */
378 extern ssize_t ih_pread(FD_t fd, void * buf, size_t count, afs_foff_t offset);
379 extern ssize_t ih_pwrite(FD_t fd, const void * buf, size_t count, afs_foff_t offset);
380 #define OS_PREAD(FD, B, S, O) ih_pread(FD, B, S, O)
381 #define OS_PWRITE(FD, B, S, O) ih_pwrite(FD, B, S, O)
382 #endif /* !HAVE_PIO */
383 #ifdef AFS_NT40_ENV
384 #define OS_LOCKFILE(FD, O) (!LockFile(FD, (DWORD)((O) & 0xFFFFFFFF), (DWORD)((O) >> 32), 2, 0))
385 #define OS_UNLOCKFILE(FD, O) (!UnlockFile(FD, (DWORD)((O) & 0xFFFFFFFF), (DWORD)((O) >> 32), 2, 0))
386 #define OS_ERROR(X) nterr_nt2unix(GetLastError(), X)
387 #define OS_UNLINK(X) nt_unlink(X)
388 #define OS_DIRSEP "\\"
389 #define OS_DIRSEPC '\\'
390 #else
391 #define OS_LOCKFILE(FD, O) flock(FD, LOCK_EX)
392 #define OS_UNLOCKFILE(FD, O) flock(FD, LOCK_UN)
393 #define OS_ERROR(X) X
394 #define OS_UNLINK(X) unlink(X)
395 #define OS_DIRSEP "/"
396 #define OS_DIRSEPC '/'
397 #endif
398
399
400
401 #ifdef AFS_NAMEI_ENV
402
403 #ifdef AFS_NT40_ENV
404 #define OS_OPEN(F, M, P) nt_open(F, M, P)
405 #define OS_CLOSE(FD) nt_close(FD)
406
407 #define OS_READ(FD, B, S) nt_read(FD, B, S)
408 #define OS_WRITE(FD, B, S) nt_write(FD, B, S)
409 #define OS_SEEK(FD, O, F) nt_seek(FD, O, F)
410
411 #define OS_SYNC(FD) nt_fsync(FD)
412 #define OS_TRUNC(FD, L) nt_ftruncate(FD, L)
413
414 #else /* AFS_NT40_ENV */
415
416 /*@+fcnmacros +macrofcndecl@*/
417 #ifdef S_SPLINT_S
418 extern Inode IH_CREATE(IHandle_t * H, int /*@alt Device @ */ D,
419                        char *P, Inode N, int /*@alt VolumeId @ */ P1,
420                        int /*@alt VnodeId @ */ P2,
421                        int /*@alt Unique @ */ P3,
422                        int /*@alt unsigned @ */ P4);
423 extern FD_t OS_IOPEN(IHandle_t * H);
424 extern int OS_OPEN(const char *F, int M, mode_t P);
425 extern int OS_CLOSE(FD_t FD);
426 extern ssize_t OS_READ(FD_t FD, void *B, size_t S);
427 extern ssize_t OS_WRITE(FD_t FD, void *B, size_t S);
428 extern ssize_t OS_PREAD(FD_t FD, void *B, size_t S, afs_foff_t O);
429 extern ssize_t OS_PWRITE(FD_t FD, void *B, size_t S, afs_foff_t O);
430 extern int OS_SYNC(FD_t FD);
431 extern afs_sfsize_t OS_SIZE(FD_t FD);
432 extern int IH_INC(IHandle_t * H, Inode I, int /*@alt VolId, VolumeId @ */ P);
433 extern int IH_DEC(IHandle_t * H, Inode I, int /*@alt VolId, VolumeId @ */ P);
434 extern afs_sfsize_t IH_IREAD(IHandle_t * H, afs_foff_t O, void *B,
435                              afs_fsize_t S);
436 extern afs_sfsize_t IH_IWRITE(IHandle_t * H, afs_foff_t O, void *B,
437                               afs_fsize_t S);
438 #ifdef O_LARGEFILE
439 #define OFFT off64_t
440 #else
441 #define OFFT off_t
442 #endif
443
444 extern OFFT OS_SEEK(FD_t FD, OFFT O, int F);
445 extern int OS_TRUNC(FD_t FD, OFFT L);
446 #endif /*S_SPLINT_S */
447
448 #ifdef O_LARGEFILE
449 #define OS_OPEN(F, M, P) open64(F, M, P)
450 #else /* !O_LARGEFILE */
451 #define OS_OPEN(F, M, P) open(F, M, P)
452 #endif /* !O_LARGEFILE */
453 #define OS_CLOSE(FD) close(FD)
454
455 #define OS_READ(FD, B, S) read(FD, B, S)
456 #define OS_WRITE(FD, B, S) write(FD, B, S)
457 #ifdef O_LARGEFILE
458 #define OS_SEEK(FD, O, F) lseek64(FD, (off64_t) (O), F)
459 #define OS_TRUNC(FD, L) ftruncate64(FD, (off64_t) (L))
460 #else /* !O_LARGEFILE */
461 #define OS_SEEK(FD, O, F) lseek(FD, (off_t) (O), F)
462 #define OS_TRUNC(FD, L) ftruncate(FD, (off_t) (L))
463 #endif /* !O_LARGEFILE */
464
465 #define OS_SYNC(FD) fsync(FD)
466
467 /*@=fcnmacros =macrofcndecl@*/
468 #endif /* AFS_NT40_ENV */
469 #define IH_INC(H, I, P) namei_inc(H, I, P)
470 #define IH_DEC(H, I, P) namei_dec(H, I, P)
471 #define IH_IREAD(H, O, B, S) namei_iread(H, O, B, S)
472 #define IH_IWRITE(H, O, B, S) namei_iwrite(H, O, B, S)
473 #define IH_CREATE(H, D, P, N, P1, P2, P3, P4) \
474         namei_icreate(H, P, P1, P2, P3, P4)
475 #define OS_IOPEN(H) namei_iopen(H)
476
477
478 #else /* AFS_NAMEI_ENV */
479 extern Inode ih_icreate(IHandle_t * ih, int dev, char *part, Inode nI, int p1,
480                         int p2, int p3, int p4);
481
482 #define IH_CREATE(H, D, P, N, P1, P2, P3, P4) \
483         ih_icreate(H, D, P, N, P1, P2, P3, P4)
484
485 #ifdef AFS_LINUX22_ENV
486 #define OS_IOPEN(H) -1
487 #else
488 #ifdef O_LARGEFILE
489 #define OS_IOPEN(H) (IOPEN((H)->ih_dev, (H)->ih_ino, O_RDWR|O_LARGEFILE))
490 #else
491 #define OS_IOPEN(H) (IOPEN((H)->ih_dev, (H)->ih_ino, O_RDWR))
492 #endif
493 #endif
494 #define OS_OPEN(F, M, P) open(F, M, P)
495 #define OS_CLOSE(FD) close(FD)
496
497 #define OS_READ(FD, B, S) read(FD, B, S)
498 #define OS_WRITE(FD, B, S) write(FD, B, S)
499 #ifdef O_LARGEFILE
500 #define OS_SEEK(FD, O, F) lseek64(FD, (off64_t) (O), F)
501 #define OS_TRUNC(FD, L) ftruncate64(FD, (off64_t) (L))
502 #else /* !O_LARGEFILE */
503 #define OS_SEEK(FD, O, F) lseek(FD, (off_t) (O), F)
504 #define OS_TRUNC(FD, L) ftruncate(FD, (off_t) (L))
505 #endif /* !O_LARGEFILE */
506
507 #define OS_SYNC(FD) fsync(FD)
508
509 #ifdef AFS_LINUX22_ENV
510 #define IH_INC(H, I, P) -1
511 #define IH_DEC(H, I, P) -1
512 #define IH_IREAD(H, O, B, S) -1
513 #define IH_IWRITE(H, O, B, S) -1
514 #else
515 #define IH_INC(H, I, P) IINC((H)->ih_dev, I, P)
516 #define IH_DEC(H, I, P) IDEC((H)->ih_dev, I, P)
517 #define IH_IREAD(H, O, B, S) inode_read((H)->ih_dev, (H)->ih_ino, (H)->ih_vid,\
518                                         O, B, S)
519 #define IH_IWRITE(H, O, B, S) \
520         inode_write((H)->ih_dev, (H)->ih_ino, (H)->ih_vid, O, B, S)
521 #endif /* AFS_LINUX22_ENV */
522
523
524 #endif /* AFS_NAMEI_ENV */
525 #define OS_SIZE(FD) ih_size(FD)
526 extern afs_sfsize_t ih_size(FD_t);
527
528 #ifndef AFS_NT40_ENV
529 #define FDH_READV(H, I, N) readv((H)->fd_fd, I, N)
530 #define FDH_WRITEV(H, I, N) writev((H)->fd_fd, I, N)
531 #endif
532
533 #ifdef HAVE_PIOV
534 #ifdef O_LARGEFILE
535 #define FDH_PREADV(H, I, N, O) preadv64((H)->fd_fd, I, N, O)
536 #define FDH_PWRITEV(H, I, N, O) pwritev64((H)->fd_fd, I, N, O)
537 #else /* !O_LARGEFILE */
538 #define FDH_PREADV(H, I, N, O) preadv((H)->fd_fd, I, N, O)
539 #define FDH_PWRITEV(H, I, N, O) pwritev((H)->fd_fd, I, N, O)
540 #endif /* !O_LARGEFILE */
541 #endif
542
543 #define FDH_PREAD(H, B, S, O) OS_PREAD((H)->fd_fd, B, S, O)
544 #define FDH_PWRITE(H, B, S, O) OS_PWRITE((H)->fd_fd, B, S, O)
545 #define FDH_READ(H, B, S) OS_READ((H)->fd_fd, B, S)
546 #define FDH_WRITE(H, B, S) OS_WRITE((H)->fd_fd, B, S)
547 #define FDH_SEEK(H, O, F) OS_SEEK((H)->fd_fd, O, F)
548
549 #define FDH_SYNC(H) ((H->fd_ih!=NULL) ? ( H->fd_ih->ih_synced = 1) - 1 : 1)
550 #define FDH_TRUNC(H, L) OS_TRUNC((H)->fd_fd, L)
551 #define FDH_SIZE(H) OS_SIZE((H)->fd_fd)
552 #define FDH_LOCKFILE(H, O) OS_LOCKFILE((H)->fd_fd, O)
553 #define FDH_UNLOCKFILE(H, O) OS_UNLOCKFILE((H)->fd_fd, O)
554
555 #ifdef AFS_NT40_ENV
556 #define afs_stat_st     __stat64
557 #define afs_stat        _stat64
558 #define afs_fstat       _fstat64
559 #define afs_fopen       fopen
560 #define afs_open        open
561 #define afs_lseek(FD, O, F)     _lseeki64(FD, O, F)
562 #else
563 #ifdef O_LARGEFILE
564 #define afs_stat_st     stat64
565 #define afs_stat        stat64
566 #define afs_fstat       fstat64
567 #define afs_fopen       fopen64
568 #define afs_open        open64
569 #ifdef S_SPLINT_S
570 extern off64_t afs_lseek(int FD, off64_t O, int F);
571 #endif /*S_SPLINT_S */
572 #define afs_lseek(FD, O, F)     lseek64(FD, (off64_t) (O), F)
573 #define afs_ftruncate           ftruncate64
574 #define afs_mmap                mmap64
575 #ifdef AFS_AIX_ENV
576 extern void * mmap64();  /* ugly hack since aix build env appears to be somewhat broken */
577 #endif
578 #else /* !O_LARGEFILE */
579 #define afs_stat_st     stat
580 #define afs_stat        stat
581 #define afs_fstat       fstat
582 #define afs_fopen       fopen
583 #define afs_open        open
584 #ifdef S_SPLINT_S
585 extern off_t afs_lseek(int FD, off_t O, int F);
586 #endif /*S_SPLINT_S */
587 #define afs_lseek(FD, O, F)     lseek(FD, (off_t) (O), F)
588 #define afs_ftruncate           ftruncate
589 #define afs_mmap                mmap
590 #endif /* !O_LARGEFILE */
591 #if AFS_HAVE_STATVFS64
592 # define afs_statvfs    statvfs64
593 #else
594 # if AFS_HAVE_STATFS64
595 #  define afs_statfs    statfs64
596 #else
597 #  if AFS_HAVE_STATVFS
598 #   define afs_statvfs  statvfs
599 #  else
600 #   define afs_statfs   statfs
601 #  endif /* !AFS_HAVE_STATVFS */
602 # endif /* !AFS_HAVE_STATFS64 */
603 #endif /* !AFS_HAVE_STATVFS64 */
604 #endif /* AFS_NT40_ENV */
605
606 #endif /* _IHANDLE_H_ */