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