2 * Copyright 2000, International Business Machines Corporation and others.
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
10 #include <afs/param.h>
11 #include <afsconfig.h>
16 #include <sys/errno.h>
17 #include <afs/afs_args.h>
19 #if defined(AFS_SUN_ENV) && !defined(AFS_SUN5_ENV)
27 #ifdef AFS_SGI_XFS_IOPS_ENV
30 #include "afssyscalls.h"
33 FILE *inode_debug_log; /* If set, write to this file. */
34 /* Indices used for database arrays. */
40 static void check_iops(int index, char *fun, char *file, int line);
41 #endif /* AFS_DEBUG_IOPS */
45 * in VRMIX, system calls look just like function calls, so we don't
46 * need to do anything!
50 #if defined(AFS_SGI_ENV)
52 #include <sys/types.h>
53 #endif /* AFS_SGI61_ENV */
55 #pragma weak xicreate = icreate
56 #pragma weak xiinc = iinc
57 #pragma weak xidec = idec
58 #pragma weak xiopen = iopen
59 #pragma weak xlsetpag = lsetpag
60 #pragma weak xlpioctl = lpioctl
62 #pragma weak xiread = iread
63 #pragma weak xiwrite = iwrite
67 icreate(dev, near_inode, param1, param2, param3, param4)
68 int dev, near_inode, param1, param2, param3, param4;
70 return(syscall(AFS_ICREATE, dev, near_inode, param1, param2, param3,
75 iopen(dev, inode, usrmod)
76 int dev, inode, usrmod;
78 return(syscall(AFS_IOPEN, dev, inode, usrmod));
82 iinc(dev, inode, inode_p1)
83 int dev, inode, inode_p1;
85 return(syscall(AFS_IINC, dev, inode, inode_p1));
89 idec(dev, inode, inode_p1)
90 int dev, inode, inode_p1;
92 return(syscall(AFS_IDEC, dev, inode, inode_p1));
96 #ifdef AFS_SGI_XFS_IOPS_ENV
98 icreatename64(int dev, char *partname, int p0, int p1, int p2, int p3)
102 afs_inode_params_t param;
104 /* Use an array so we don't widen the syscall interface. */
109 code = afs_syscall(AFSCALL_ICREATENAME64, dev, partname,
110 1 + strlen(partname), param, &ino);
117 iopen64(int dev, uint64_t inode, int usrmod)
119 return(syscall(AFS_IOPEN64, dev, (u_int)((inode>>32)&0xffffffff),
120 (u_int)(inode&0xffffffff), usrmod));
124 iinc64(int dev, uint64_t inode, int inode_p1)
126 return(afs_syscall(AFSCALL_IINC64, dev,
127 (u_int)((inode>>32)&0xffffffff),
128 (u_int)(inode&0xffffffff),
133 idec64(int dev, uint64_t inode, int inode_p1)
135 return(afs_syscall(AFSCALL_IDEC64, dev,
136 (u_int)((inode>>32)&0xffffffff),
137 (u_int)(inode&0xffffffff),
142 ilistinode64(int dev, uint64_t inode, void *data, int *datalen)
144 return(afs_syscall(AFSCALL_ILISTINODE64, dev,
145 (u_int)((inode>>32)&0xffffffff),
146 (u_int)(inode&0xffffffff),
150 #ifdef AFS_DEBUG_IOPS
151 uint64_t debug_icreatename64(int dev, char *partname, int p0, int p1,
152 int p2, int p3, char *file, int line)
154 check_iops(CREATE_I, "icreatename64", file, line);
155 return icreatename64(dev, partname, p0, p1, p2, p3);
158 int debug_iopen64(int dev, uint64_t inode, int usrmod, char *file, int line)
160 check_iops(OPEN_I, "iopen64", file, line);
161 return iopen64(dev, inode, usrmod);
164 int debug_iinc64(int dev, uint64_t inode, int inode_p1, char *file, int line)
166 check_iops(INC_I, "iinc64", file, line);
167 return iinc64(dev, inode, inode_p1);
170 int debug_idec64(int dev, uint64_t inode, int inode_p1, char *file, int line)
172 check_iops(DEC_I, "idec64", file, line);
173 return idec64(dev, inode, inode_p1);
176 #endif /* AFS_DEBUG_IOPS */
177 #endif /* AFS_SGI_XFS_IOPS_ENV */
179 #ifdef AFS_SGI_VNODE_GLUE
180 /* flag: 1 = has NUMA, 0 = no NUMA, -1 = kernel decides. */
181 int afs_init_kernel_config(int flag)
183 return afs_syscall(AFSCALL_INIT_KERNEL_CONFIG, flag);
188 /* iread and iwrite are deprecated interfaces. Use inode_read and inode_write instead. */
190 iread(dev, inode, inode_p1, offset, cbuf, count)
191 int dev, inode, inode_p1;
196 return(syscall(AFS_IREAD, dev, inode, inode_p1, offset, cbuf, count));
200 iwrite(dev, inode, inode_p1, offset, cbuf, count)
201 int dev, inode, inode_p1;
206 return(syscall(AFS_IWRITE, dev, inode, inode_p1, offset, cbuf, count));
213 return(syscall(AFS_SETPAG));
217 lpioctl(path, cmd, cmarg, follow)
221 return(syscall(AFS_PIOCTL, path, cmd, cmarg, follow));
223 #else /* AFS_SGI_ENV */
225 #ifndef AFS_NAMEI_ENV
233 /* This module contains the stubs for all AFS-related kernel calls that use a single common entry (i.e. AFS_SYSCALL system call). Note we ignore SIGSYS signals that are sent when a "nosys" is reached so that kernels that don't support this new entry, will revert back to the original old afs entry; note that in some cases (where EINVAL is normally returned) we'll call the appropriate system call twice (sigh) */
235 /* Also since we're limited to 6 parameters/call, in some calls (icreate,
236 iread, iwrite) we combine some in a structure */
238 icreate(dev, near_inode, param1, param2, param3, param4)
239 int dev, near_inode, param1, param2, param3, param4;
243 struct iparam iparams;
245 iparams.param1 = param1;
246 iparams.param2 = param2;
247 iparams.param3 = param3;
248 iparams.param4 = param4;
250 errcode = syscall(AFS_SYSCALL, AFSCALL_ICREATE, dev, near_inode, &iparams);
255 iopen(dev, inode, usrmod)
256 int dev, inode, usrmod;
261 errcode = syscall(AFS_SYSCALL, AFSCALL_IOPEN, dev, inode, usrmod);
266 iinc(dev, inode, inode_p1)
267 int dev, inode, inode_p1;
272 errcode = syscall(AFS_SYSCALL, AFSCALL_IINC, dev, inode, inode_p1);
277 idec(dev, inode, inode_p1)
278 int dev, inode, inode_p1;
283 errcode = syscall(AFS_SYSCALL, AFSCALL_IDEC, dev, inode, inode_p1);
289 iread(dev, inode, inode_p1, offset, cbuf, count)
290 int dev, inode, inode_p1;
297 struct iparam iparams;
299 iparams.param1 = inode_p1;
300 iparams.param2 = offset;
301 iparams.param3 = (long)cbuf;
302 iparams.param4 = count;
303 errcode = syscall(AFS_SYSCALL, AFSCALL_IREAD, dev, inode, &iparams);
308 iwrite(dev, inode, inode_p1, offset, cbuf, count)
309 int dev, inode, inode_p1;
316 struct iparam iparams;
318 iparams.param1 = inode_p1;
319 iparams.param2 = offset;
320 iparams.param3 = (long)cbuf;
321 iparams.param4 = count;
323 errcode = syscall(AFS_SYSCALL, AFSCALL_IWRITE, dev, inode, &iparams);
328 #endif /* AFS_NAMEI_ENV */
335 errcode = syscall(AFS_SYSCALL, AFSCALL_SETPAG);
339 lpioctl(path, cmd, cmarg, follow)
346 errcode = syscall(AFS_SYSCALL, AFSCALL_PIOCTL, path, cmd, cmarg, follow);
350 #endif /* !AFS_SGI_ENV */
351 #endif /* !AFS_AIX32_ENV */
353 #ifndef AFS_NAMEI_ENV
356 inode_read(dev, inode, inode_p1, offset, cbuf, count)
368 fd = IOPEN(dev, inode, O_RDONLY);
372 code = lseek(fd, offset, SEEK_SET);
373 if (code != offset) {
377 code = read(fd, cbuf, count);
385 inode_write(dev, inode, inode_p1, offset, cbuf, count)
396 fd = IOPEN(dev, inode, O_WRONLY);
400 code = lseek(fd, offset, SEEK_SET);
401 if (code != offset) {
405 code = write(fd, cbuf, count);
414 * returns a static string used to print either 32 or 64 bit inode numbers.
416 #ifdef AFS_64BIT_IOPS_ENV
417 char * PrintInode(char *s, Inode ino)
419 char * PrintInode(s, ino)
424 static afs_ino_str_t result;
429 #ifdef AFS_64BIT_IOPS_ENV
430 (void) sprintf((char*)s, "%llu", ino);
432 (void) sprintf((char*)s, "%u", ino);
436 #endif /* AFS_NAMEI_ENV */
439 #ifdef AFS_DEBUG_IOPS
440 #define MAX_FILE_NAME_LENGTH 32
443 char file[MAX_FILE_NAME_LENGTH];
445 int iops_debug_n_avail[MAX_I+1];
446 int iops_debug_n_used[MAX_I+1];
447 iops_debug_t *iops_debug[MAX_I+1];
448 #define IOPS_DEBUG_MALLOC_STEP 64
451 * Returns 1 if first time we've seen this file/line.
452 * Puts file/line in array so we only print the first time we encounter
455 static void check_iops(int index, char *fun, char *file, int line)
458 int *availp = &iops_debug_n_avail[index];
459 int *usedp = &iops_debug_n_used[index];
460 iops_debug_t *iops = iops_debug[index];
463 if (!inode_debug_log)
468 for (i=0; i< used; i++) {
469 if (line == iops[i].line) {
470 if (!strncmp(file, iops[i].file, MAX_FILE_NAME_LENGTH)) {
471 /* We've already entered this one. */
478 /* Not found, enter into db. */
479 if (used >= *availp) {
481 avail += IOPS_DEBUG_MALLOC_STEP;
482 if (avail == IOPS_DEBUG_MALLOC_STEP)
484 (iops_debug_t*) malloc(avail * sizeof(iops_debug_t));
486 iops_debug[index] = (iops_debug_t*) realloc(*iops,
487 avail * sizeof(iops_debug_t));
488 if (!iops_debug[index]) {
489 printf("check_iops: Can't %salloc %lu bytes for index %d\n",
490 (avail == IOPS_DEBUG_MALLOC_STEP) ? "m" : "re",
491 avail * sizeof(iops_debug_t), index);
495 iops = iops_debug[index];
497 iops[used].line = line;
498 (void) strncpy(iops[used].file, file, MAX_FILE_NAME_LENGTH);
501 fprintf(inode_debug_log, "%s: file %s, line %d\n", fun, file, line);
502 fflush(inode_debug_log);
504 #endif /* AFS_DEBUG_IOPS */