Annotation of XNU/bsd/nfs/nfs.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
                     23: /*
                     24:  * Copyright (c) 1989, 1993, 1995
                     25:  *     The Regents of the University of California.  All rights reserved.
                     26:  *
                     27:  * This code is derived from software contributed to Berkeley by
                     28:  * Rick Macklem at The University of Guelph.
                     29:  *
                     30:  * Redistribution and use in source and binary forms, with or without
                     31:  * modification, are permitted provided that the following conditions
                     32:  * are met:
                     33:  * 1. Redistributions of source code must retain the above copyright
                     34:  *    notice, this list of conditions and the following disclaimer.
                     35:  * 2. Redistributions in binary form must reproduce the above copyright
                     36:  *    notice, this list of conditions and the following disclaimer in the
                     37:  *    documentation and/or other materials provided with the distribution.
                     38:  * 3. All advertising materials mentioning features or use of this software
                     39:  *    must display the following acknowledgement:
                     40:  *     This product includes software developed by the University of
                     41:  *     California, Berkeley and its contributors.
                     42:  * 4. Neither the name of the University nor the names of its contributors
                     43:  *    may be used to endorse or promote products derived from this software
                     44:  *    without specific prior written permission.
                     45:  *
                     46:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     47:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     48:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     49:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     50:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     51:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     52:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     53:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     54:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     55:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     56:  * SUCH DAMAGE.
                     57:  *
                     58:  *     @(#)nfs.h       8.4 (Berkeley) 5/1/95
                     59:  * FreeBSD-Id: nfs.h,v 1.32 1997/10/12 20:25:38 phk Exp $
                     60:  */
                     61: 
                     62: #ifndef _NFS_NFS_H_
                     63: #define _NFS_NFS_H_
                     64: 
                     65: /*
                     66:  * Tunable constants for nfs
                     67:  */
                     68: 
                     69: #define        NFS_MAXIOVEC    34
                     70: #define NFS_TICKINTVL  5               /* Desired time for a tick (msec) */
                     71: #define NFS_HZ         (hz / nfs_ticks) /* Ticks/sec */
                     72: #define        NFS_TIMEO       (1 * NFS_HZ)    /* Default timeout = 1 second */
                     73: #define        NFS_MINTIMEO    (1 * NFS_HZ)    /* Min timeout to use */
                     74: #define        NFS_MAXTIMEO    (60 * NFS_HZ)   /* Max timeout to backoff to */
                     75: #define        NFS_MINIDEMTIMEO (5 * NFS_HZ)   /* Min timeout for non-idempotent ops*/
                     76: #define        NFS_MAXREXMIT   100             /* Stop counting after this many */
                     77: #define        NFS_MAXWINDOW   1024            /* Max number of outstanding requests */
                     78: #define        NFS_RETRANS     10              /* Num of retrans for soft mounts */
                     79: #define        NFS_MAXGRPS     16              /* Max. size of groups list */
                     80: #ifndef NFS_MINATTRTIMO
                     81: #define        NFS_MINATTRTIMO 5               /* Attribute cache timeout in sec */
                     82: #endif
                     83: #ifndef NFS_MAXATTRTIMO
                     84: #define        NFS_MAXATTRTIMO 60
                     85: #endif
                     86: #define        NFS_WSIZE       8192            /* Def. write data size <= 8192 */
                     87: #define        NFS_RSIZE       8192            /* Def. read data size <= 8192 */
                     88: #define NFS_READDIRSIZE        8192            /* Def. readdir size */
                     89: #define        NFS_DEFRAHEAD   1               /* Def. read ahead # blocks */
                     90: #define        NFS_MAXRAHEAD   4               /* Max. read ahead # blocks */
                     91: #define        NFS_MAXUIDHASH  64              /* Max. # of hashed uid entries/mp */
                     92: #define        NFS_MAXASYNCDAEMON      20      /* Max. number async_daemons runnable */
                     93: #define NFS_MAXGATHERDELAY     100     /* Max. write gather delay (msec) */
                     94: #ifndef NFS_GATHERDELAY
                     95: #define NFS_GATHERDELAY                10      /* Default write gather delay (msec) */
                     96: #endif
                     97: #define        NFS_DIRBLKSIZ   4096            /* Must be a multiple of DIRBLKSIZ */
                     98: 
                     99: /*
                    100:  * Oddballs
                    101:  */
                    102: #define        NMOD(a)         ((a) % nfs_asyncdaemons)
                    103: #define NFS_CMPFH(n, f, s) \
                    104:        ((n)->n_fhsize == (s) && !bcmp((caddr_t)(n)->n_fhp, (caddr_t)(f), (s)))
                    105: #define NFS_ISV3(v)    (VFSTONFS((v)->v_mount)->nm_flag & NFSMNT_NFSV3)
                    106: #define NFS_SRVMAXDATA(n) \
                    107:                (((n)->nd_flag & ND_NFSV3) ? (((n)->nd_nam2) ? \
                    108:                 NFS_MAXDGRAMDATA : NFS_MAXDATA) : NFS_V2MAXDATA)
                    109: 
                    110: /*
                    111:  * XXX
                    112:  * The B_INVAFTERWRITE flag should be set to whatever is required by the
                    113:  * buffer cache code to say "Invalidate the block after it is written back".
                    114:  */
                    115: #ifdef __FreeBSD__
                    116: #define        B_INVAFTERWRITE B_NOCACHE
                    117: #else
                    118: #define        B_INVAFTERWRITE B_INVAL
                    119: #endif
                    120: 
                    121: /*
                    122:  * The IO_METASYNC flag should be implemented for local file systems.
                    123:  * (Until then, it is nothin at all.)
                    124:  */
                    125: #ifndef IO_METASYNC
                    126: #define IO_METASYNC    0
                    127: #endif
                    128: 
                    129: /*
                    130:  * Set the attribute timeout based on how recently the file has been modified.
                    131:  */
                    132: #define        NFS_ATTRTIMEO(np) \
                    133:        ((((np)->n_flag & NMODIFIED) || \
                    134:         (time.tv_sec - (np)->n_mtime) / 10 < NFS_MINATTRTIMO) ? NFS_MINATTRTIMO : \
                    135:         ((time.tv_sec - (np)->n_mtime) / 10 > NFS_MAXATTRTIMO ? NFS_MAXATTRTIMO : \
                    136:          (time.tv_sec - (np)->n_mtime) / 10))
                    137: 
                    138: /*
                    139:  * Expected allocation sizes for major data structures. If the actual size
                    140:  * of the structure exceeds these sizes, then malloc() will be allocating
                    141:  * almost twice the memory required. This is used in nfs_init() to warn
                    142:  * the sysadmin that the size of a structure should be reduced.
                    143:  * (These sizes are always a power of 2. If the kernel malloc() changes
                    144:  *  to one that does not allocate space in powers of 2 size, then this all
                    145:  *  becomes bunk!)
                    146:  */
                    147: #define NFS_NODEALLOC  256
                    148: #define NFS_MNTALLOC   512
                    149: #define NFS_SVCALLOC   256
                    150: #define NFS_UIDALLOC   128
                    151: 
                    152: /*
                    153:  * Arguments to mount NFS
                    154:  */
                    155: #define NFS_ARGSVERSION        3               /* change when nfs_args changes */
                    156: struct nfs_args {
                    157:        int             version;        /* args structure version number */
                    158:        struct sockaddr *addr;          /* file server address */
                    159:        int             addrlen;        /* length of address */
                    160:        int             sotype;         /* Socket type */
                    161:        int             proto;          /* and Protocol */
                    162:        u_char          *fh;            /* File handle to be mounted */
                    163:        int             fhsize;         /* Size, in bytes, of fh */
                    164:        int             flags;          /* flags */
                    165:        int             wsize;          /* write size in bytes */
                    166:        int             rsize;          /* read size in bytes */
                    167:        int             readdirsize;    /* readdir size in bytes */
                    168:        int             timeo;          /* initial timeout in .1 secs */
                    169:        int             retrans;        /* times to retry send */
                    170:        int             maxgrouplist;   /* Max. size of group list */
                    171:        int             readahead;      /* # of blocks to readahead */
                    172:        int             leaseterm;      /* Term (sec) of lease */
                    173:        int             deadthresh;     /* Retrans threshold */
                    174:        char            *hostname;      /* server's name */
                    175: };
                    176: 
                    177: /*
                    178:  * NFS mount option flags
                    179:  */
                    180: #define        NFSMNT_SOFT             0x00000001  /* soft mount (hard is default) */
                    181: #define        NFSMNT_WSIZE            0x00000002  /* set write size */
                    182: #define        NFSMNT_RSIZE            0x00000004  /* set read size */
                    183: #define        NFSMNT_TIMEO            0x00000008  /* set initial timeout */
                    184: #define        NFSMNT_RETRANS          0x00000010  /* set number of request retries */
                    185: #define        NFSMNT_MAXGRPS          0x00000020  /* set maximum grouplist size */
                    186: #define        NFSMNT_INT              0x00000040  /* allow interrupts on hard mount */
                    187: #define        NFSMNT_NOCONN           0x00000080  /* Don't Connect the socket */
                    188: #define        NFSMNT_NQNFS            0x00000100  /* Use Nqnfs protocol */
                    189: #define        NFSMNT_NFSV3            0x00000200  /* Use NFS Version 3 protocol */
                    190: #define        NFSMNT_KERB             0x00000400  /* Use Kerberos authentication */
                    191: #define        NFSMNT_DUMBTIMR         0x00000800  /* Don't estimate rtt dynamically */
                    192: #define        NFSMNT_LEASETERM        0x00001000  /* set lease term (nqnfs) */
                    193: #define        NFSMNT_READAHEAD        0x00002000  /* set read ahead */
                    194: #define        NFSMNT_DEADTHRESH       0x00004000  /* set dead server retry thresh */
                    195: #define        NFSMNT_RESVPORT         0x00008000  /* Allocate a reserved port */
                    196: #define        NFSMNT_RDIRPLUS         0x00010000  /* Use Readdirplus for V3 */
                    197: #define        NFSMNT_READDIRSIZE      0x00020000  /* Set readdir size */
                    198: #define        NFSMNT_INTERNAL         0xfffc0000  /* Bits set internally */
                    199: #define NFSMNT_HASWRITEVERF    0x00040000  /* Has write verifier for V3 */
                    200: #define NFSMNT_GOTPATHCONF     0x00080000  /* Got the V3 pathconf info */
                    201: #define NFSMNT_GOTFSINFO       0x00100000  /* Got the V3 fsinfo */
                    202: #define        NFSMNT_MNTD             0x00200000  /* Mnt server for mnt point */
                    203: #define        NFSMNT_DISMINPROG       0x00400000  /* Dismount in progress */
                    204: #define        NFSMNT_DISMNT           0x00800000  /* Dismounted */
                    205: #define        NFSMNT_SNDLOCK          0x01000000  /* Send socket lock */
                    206: #define        NFSMNT_WANTSND          0x02000000  /* Want above */
                    207: #define        NFSMNT_RCVLOCK          0x04000000  /* Rcv socket lock */
                    208: #define        NFSMNT_WANTRCV          0x08000000  /* Want above */
                    209: #define        NFSMNT_WAITAUTH         0x10000000  /* Wait for authentication */
                    210: #define        NFSMNT_HASAUTH          0x20000000  /* Has authenticator */
                    211: #define        NFSMNT_WANTAUTH         0x40000000  /* Wants an authenticator */
                    212: #define        NFSMNT_AUTHERR          0x80000000  /* Authentication error */
                    213: 
                    214: /*
                    215:  * Structures for the nfssvc(2) syscall. Not that anyone but nfsd and mount_nfs
                    216:  * should ever try and use it.
                    217:  */
                    218: struct nfsd_args {
                    219:        int     sock;           /* Socket to serve */
                    220:        caddr_t name;           /* Client addr for connection based sockets */
                    221:        int     namelen;        /* Length of name */
                    222: };
                    223: 
                    224: struct nfsd_srvargs {
                    225:        struct nfsd     *nsd_nfsd;      /* Pointer to in kernel nfsd struct */
                    226:        uid_t           nsd_uid;        /* Effective uid mapped to cred */
                    227:        u_long          nsd_haddr;      /* Ip address of client */
                    228:        struct ucred    nsd_cr;         /* Cred. uid maps to */
                    229:        int             nsd_authlen;    /* Length of auth string (ret) */
                    230:        u_char          *nsd_authstr;   /* Auth string (ret) */
                    231:        int             nsd_verflen;    /* and the verfier */
                    232:        u_char          *nsd_verfstr;
                    233:        struct timeval  nsd_timestamp;  /* timestamp from verifier */
                    234:        u_long          nsd_ttl;        /* credential ttl (sec) */
                    235:        NFSKERBKEY_T    nsd_key;        /* Session key */
                    236: };
                    237: 
                    238: struct nfsd_cargs {
                    239:        char            *ncd_dirp;      /* Mount dir path */
                    240:        uid_t           ncd_authuid;    /* Effective uid */
                    241:        int             ncd_authtype;   /* Type of authenticator */
                    242:        int             ncd_authlen;    /* Length of authenticator string */
                    243:        u_char          *ncd_authstr;   /* Authenticator string */
                    244:        int             ncd_verflen;    /* and the verifier */
                    245:        u_char          *ncd_verfstr;
                    246:        NFSKERBKEY_T    ncd_key;        /* Session key */
                    247: };
                    248: 
                    249: /*
                    250:  * XXX to allow amd to include nfs.h without nfsproto.h
                    251:  */
                    252: #ifdef NFS_NPROCS
                    253: /*
                    254:  * Stats structure
                    255:  */
                    256: struct nfsstats {
                    257:        int     attrcache_hits;
                    258:        int     attrcache_misses;
                    259:        int     lookupcache_hits;
                    260:        int     lookupcache_misses;
                    261:        int     direofcache_hits;
                    262:        int     direofcache_misses;
                    263:        int     biocache_reads;
                    264:        int     read_bios;
                    265:        int     read_physios;
                    266:        int     biocache_writes;
                    267:        int     write_bios;
                    268:        int     write_physios;
                    269:        int     biocache_readlinks;
                    270:        int     readlink_bios;
                    271:        int     biocache_readdirs;
                    272:        int     readdir_bios;
                    273:        int     rpccnt[NFS_NPROCS];
                    274:        int     rpcretries;
                    275:        int     srvrpccnt[NFS_NPROCS];
                    276:        int     srvrpc_errs;
                    277:        int     srv_errs;
                    278:        int     rpcrequests;
                    279:        int     rpctimeouts;
                    280:        int     rpcunexpected;
                    281:        int     rpcinvalid;
                    282:        int     srvcache_inproghits;
                    283:        int     srvcache_idemdonehits;
                    284:        int     srvcache_nonidemdonehits;
                    285:        int     srvcache_misses;
                    286:        int     srvnqnfs_leases;
                    287:        int     srvnqnfs_maxleases;
                    288:        int     srvnqnfs_getleases;
                    289:        int     srvvop_writes;
                    290: };
                    291: #endif
                    292: 
                    293: /*
                    294:  * Flags for nfssvc() system call.
                    295:  */
                    296: #define        NFSSVC_BIOD     0x002
                    297: #define        NFSSVC_NFSD     0x004
                    298: #define        NFSSVC_ADDSOCK  0x008
                    299: #define        NFSSVC_AUTHIN   0x010
                    300: #define        NFSSVC_GOTAUTH  0x040
                    301: #define        NFSSVC_AUTHINFAIL 0x080
                    302: #define        NFSSVC_MNTD     0x100
                    303: 
                    304: /*
                    305:  * fs.nfs sysctl(3) identifiers
                    306:  */
                    307: #define NFS_NFSSTATS   1               /* struct: struct nfsstats */
                    308: #define NFS_NFSPRIVPORT        2               /* int: prohibit nfs to resvports */
                    309: 
                    310: #define FS_NFS_NAMES { \
                    311:                       { 0, 0 }, \
                    312:                       { "nfsstats", CTLTYPE_STRUCT }, \
                    313:                       { "nfsprivport", CTLTYPE_INT }, \
                    314: }
                    315: 
                    316: #ifndef NFS_MUIDHASHSIZ
                    317: #define NFS_MUIDHASHSIZ        63      /* Tune the size of nfsmount with this */
                    318: #endif
                    319: #ifndef NFS_WDELAYHASHSIZ
                    320: #define        NFS_WDELAYHASHSIZ 16    /* and with this */
                    321: #endif
                    322: 
                    323: /*
                    324:  * The set of signals the interrupt an I/O in progress for NFSMNT_INT mounts.
                    325:  * What should be in this set is open to debate, but I believe that since
                    326:  * I/O system calls on ufs are never interrupted by signals the set should
                    327:  * be minimal. My reasoning is that many current programs that use signals
                    328:  * such as SIGALRM will not expect file I/O system calls to be interrupted
                    329:  * by them and break.
                    330:  */
                    331: #ifdef KERNEL
                    332: 
                    333: #ifdef MALLOC_DECLARE
                    334: MALLOC_DECLARE(M_NFSREQ);
                    335: MALLOC_DECLARE(M_NFSMNT);
                    336: MALLOC_DECLARE(M_NFSDIROFF);
                    337: MALLOC_DECLARE(M_NFSRVDESC);
                    338: MALLOC_DECLARE(M_NFSUID);
                    339: MALLOC_DECLARE(M_NQLEASE);
                    340: MALLOC_DECLARE(M_NFSD);
                    341: MALLOC_DECLARE(M_NFSBIGFH);
                    342: #endif
                    343: 
                    344: struct uio; struct buf; struct vattr; struct nameidata;        /* XXX */
                    345: 
                    346: #define        NFSINT_SIGMASK  (sigmask(SIGINT)|sigmask(SIGTERM)|sigmask(SIGKILL)| \
                    347:                         sigmask(SIGHUP)|sigmask(SIGQUIT))
                    348: 
                    349: /*
                    350:  * Socket errors ignored for connectionless sockets??
                    351:  * For now, ignore them all
                    352:  */
                    353: #define        NFSIGNORE_SOERROR(s, e) \
                    354:                ((e) != EINTR && (e) != ERESTART && (e) != EWOULDBLOCK && \
                    355:                ((s) & PR_CONNREQUIRED) == 0)
                    356: 
                    357: /*
                    358:  * Nfs outstanding request list element
                    359:  */
                    360: struct nfsreq {
                    361:        TAILQ_ENTRY(nfsreq) r_chain;
                    362:        struct mbuf     *r_mreq;
                    363:        struct mbuf     *r_mrep;
                    364:        struct mbuf     *r_md;
                    365:        caddr_t         r_dpos;
                    366:        struct nfsmount *r_nmp;
                    367:        struct vnode    *r_vp;
                    368:        u_long          r_xid;
                    369:        int             r_flags;        /* flags on request, see below */
                    370:        int             r_retry;        /* max retransmission count */
                    371:        int             r_rexmit;       /* current retrans count */
                    372:        int             r_timer;        /* tick counter on reply */
                    373:        u_int32_t       r_procnum;      /* NFS procedure number */
                    374:        int             r_rtt;          /* RTT for rpc */
                    375:        struct proc     *r_procp;       /* Proc that did I/O system call */
                    376: };
                    377: 
                    378: /*
                    379:  * Queue head for nfsreq's
                    380:  */
                    381: extern TAILQ_HEAD(nfs_reqq, nfsreq) nfs_reqq;
                    382: 
                    383: /* Flag values for r_flags */
                    384: #define R_TIMING       0x01            /* timing request (in mntp) */
                    385: #define R_SENT         0x02            /* request has been sent */
                    386: #define        R_SOFTTERM      0x04            /* soft mnt, too many retries */
                    387: #define        R_INTR          0x08            /* intr mnt, signal pending */
                    388: #define        R_SOCKERR       0x10            /* Fatal error on socket */
                    389: #define        R_TPRINTFMSG    0x20            /* Did a tprintf msg. */
                    390: #define        R_MUSTRESEND    0x40            /* Must resend request */
                    391: #define        R_GETONEREP     0x80            /* Probe for one reply only */
                    392: 
                    393: /*
                    394:  * A list of nfssvc_sock structures is maintained with all the sockets
                    395:  * that require service by the nfsd.
                    396:  * The nfsuid structs hang off of the nfssvc_sock structs in both lru
                    397:  * and uid hash lists.
                    398:  */
                    399: #ifndef NFS_UIDHASHSIZ
                    400: #define        NFS_UIDHASHSIZ  29      /* Tune the size of nfssvc_sock with this */
                    401: #endif
                    402: #define        NUIDHASH(sock, uid) \
                    403:        (&(sock)->ns_uidhashtbl[(uid) % NFS_UIDHASHSIZ])
                    404: #define        NWDELAYHASH(sock, f) \
                    405:        (&(sock)->ns_wdelayhashtbl[(*((u_long *)(f))) % NFS_WDELAYHASHSIZ])
                    406: #define        NMUIDHASH(nmp, uid) \
                    407:        (&(nmp)->nm_uidhashtbl[(uid) % NFS_MUIDHASHSIZ])
                    408: #define        NFSNOHASH(fhsum) \
                    409:        (&nfsnodehashtbl[(fhsum) & nfsnodehash])
                    410: 
                    411: /*
                    412:  * Network address hash list element
                    413:  */
                    414: union nethostaddr {
                    415:        u_long had_inetaddr;
                    416:        struct mbuf *had_nam;
                    417: };
                    418: 
                    419: struct nfsuid {
                    420:        TAILQ_ENTRY(nfsuid) nu_lru;     /* LRU chain */
                    421:        LIST_ENTRY(nfsuid) nu_hash;     /* Hash list */
                    422:        int             nu_flag;        /* Flags */
                    423:        union nethostaddr nu_haddr;     /* Host addr. for dgram sockets */
                    424:        struct ucred    nu_cr;          /* Cred uid mapped to */
                    425:        int             nu_expire;      /* Expiry time (sec) */
                    426:        struct timeval  nu_timestamp;   /* Kerb. timestamp */
                    427:        u_long          nu_nickname;    /* Nickname on server */
                    428:        NFSKERBKEY_T    nu_key;         /* and session key */
                    429: };
                    430: 
                    431: #define        nu_inetaddr     nu_haddr.had_inetaddr
                    432: #define        nu_nam          nu_haddr.had_nam
                    433: /* Bits for nu_flag */
                    434: #define        NU_INETADDR     0x1
                    435: #define NU_NAM         0x2
                    436: #define NU_NETFAM(u)   (((u)->nu_flag & NU_INETADDR) ? AF_INET : AF_ISO)
                    437: 
                    438: #ifdef notyet
                    439: /* XXX CSM 12/2/97 When/if we merge queue.h */
                    440: struct nfsrv_rec {
                    441:        STAILQ_ENTRY(nfsrv_rec) nr_link;
                    442:        struct sockaddr *nr_address;
                    443:        struct mbuf     *nr_packet;
                    444: };
                    445: #endif
                    446: 
                    447: struct nfssvc_sock {
                    448:        TAILQ_ENTRY(nfssvc_sock) ns_chain;      /* List of all nfssvc_sock's */
                    449:        TAILQ_HEAD(, nfsuid) ns_uidlruhead;
                    450:        struct file     *ns_fp;
                    451:        struct socket   *ns_so;
                    452:        struct mbuf     *ns_nam;
                    453:        struct mbuf     *ns_raw;
                    454:        struct mbuf     *ns_rawend;
                    455:        struct mbuf     *ns_rec;
                    456:        struct mbuf     *ns_recend;
                    457:        struct mbuf     *ns_frag;
                    458:        int             ns_flag;
                    459:        int             ns_solock;
                    460:        int             ns_cc;
                    461:        int             ns_reclen;
                    462:        int             ns_numuids;
                    463:        u_long          ns_sref;
                    464:        LIST_HEAD(, nfsrv_descript) ns_tq;      /* Write gather lists */
                    465:        LIST_HEAD(, nfsuid) ns_uidhashtbl[NFS_UIDHASHSIZ];
                    466:        LIST_HEAD(nfsrvw_delayhash, nfsrv_descript) ns_wdelayhashtbl[NFS_WDELAYHASHSIZ];
                    467: };
                    468: 
                    469: /* Bits for "ns_flag" */
                    470: #define        SLP_VALID       0x01
                    471: #define        SLP_DOREC       0x02
                    472: #define        SLP_NEEDQ       0x04
                    473: #define        SLP_DISCONN     0x08
                    474: #define        SLP_GETSTREAM   0x10
                    475: #define        SLP_LASTFRAG    0x20
                    476: #define SLP_ALLFLAGS   0xff
                    477: 
                    478: extern TAILQ_HEAD(nfssvc_sockhead, nfssvc_sock) nfssvc_sockhead;
                    479: extern int nfssvc_sockhead_flag;
                    480: #define        SLP_INIT        0x01
                    481: #define        SLP_WANTINIT    0x02
                    482: 
                    483: /*
                    484:  * One of these structures is allocated for each nfsd.
                    485:  */
                    486: struct nfsd {
                    487:        TAILQ_ENTRY(nfsd) nfsd_chain;   /* List of all nfsd's */
                    488:        int             nfsd_flag;      /* NFSD_ flags */
                    489:        struct nfssvc_sock *nfsd_slp;   /* Current socket */
                    490:        int             nfsd_authlen;   /* Authenticator len */
                    491:        u_char          nfsd_authstr[RPCAUTH_MAXSIZ]; /* Authenticator data */
                    492:        int             nfsd_verflen;   /* and the Verifier */
                    493:        u_char          nfsd_verfstr[RPCVERF_MAXSIZ];
                    494:        struct proc     *nfsd_procp;    /* Proc ptr */
                    495:        struct nfsrv_descript *nfsd_nd; /* Associated nfsrv_descript */
                    496: };
                    497: 
                    498: /* Bits for "nfsd_flag" */
                    499: #define        NFSD_WAITING    0x01
                    500: #define        NFSD_REQINPROG  0x02
                    501: #define        NFSD_NEEDAUTH   0x04
                    502: #define        NFSD_AUTHFAIL   0x08
                    503: 
                    504: /*
                    505:  * This structure is used by the server for describing each request.
                    506:  * Some fields are used only when write request gathering is performed.
                    507:  */
                    508: struct nfsrv_descript {
                    509:        u_quad_t                nd_time;        /* Write deadline (usec) */
                    510:        off_t                   nd_off;         /* Start byte offset */
                    511:        off_t                   nd_eoff;        /* and end byte offset */
                    512:        LIST_ENTRY(nfsrv_descript) nd_hash;     /* Hash list */
                    513:        LIST_ENTRY(nfsrv_descript) nd_tq;               /* and timer list */
                    514:        LIST_HEAD(,nfsrv_descript) nd_coalesce; /* coalesced writes */
                    515:        struct mbuf             *nd_mrep;       /* Request mbuf list */
                    516:        struct mbuf             *nd_md;         /* Current dissect mbuf */
                    517:        struct mbuf             *nd_mreq;       /* Reply mbuf list */
                    518:        struct mbuf             *nd_nam;        /* and socket addr */
                    519:        struct mbuf             *nd_nam2;       /* return socket addr */
                    520:        caddr_t                 nd_dpos;        /* Current dissect pos */
                    521:        u_int32_t               nd_procnum;     /* RPC # */
                    522:        int                     nd_stable;      /* storage type */
                    523:        int                     nd_flag;        /* nd_flag */
                    524:        int                     nd_len;         /* Length of this write */
                    525:        int                     nd_repstat;     /* Reply status */
                    526:        u_long                  nd_retxid;      /* Reply xid */
                    527:        u_long                  nd_duration;    /* Lease duration */
                    528:        struct timeval          nd_starttime;   /* Time RPC initiated */
                    529:        fhandle_t               nd_fh;          /* File handle */
                    530:        struct ucred            nd_cr;          /* Credentials */
                    531: };
                    532: 
                    533: /* Bits for "nd_flag" */
                    534: #define        ND_READ         LEASE_READ
                    535: #define ND_WRITE       LEASE_WRITE
                    536: #define ND_CHECK       0x04
                    537: #define ND_LEASE       (ND_READ | ND_WRITE | ND_CHECK)
                    538: #define ND_NFSV3       0x08
                    539: #define ND_NQNFS       0x10
                    540: #define ND_KERBNICK    0x20
                    541: #define ND_KERBFULL    0x40
                    542: #define ND_KERBAUTH    (ND_KERBNICK | ND_KERBFULL)
                    543: 
                    544: extern TAILQ_HEAD(nfsd_head, nfsd) nfsd_head;
                    545: extern int nfsd_head_flag;
                    546: #define        NFSD_CHECKSLP   0x01
                    547: 
                    548: /*
                    549:  * These macros compare nfsrv_descript structures.
                    550:  */
                    551: #define NFSW_CONTIG(o, n) \
                    552:                ((o)->nd_eoff >= (n)->nd_off && \
                    553:                 !bcmp((caddr_t)&(o)->nd_fh, (caddr_t)&(n)->nd_fh, NFSX_V3FH))
                    554: 
                    555: #define NFSW_SAMECRED(o, n) \
                    556:        (((o)->nd_flag & ND_KERBAUTH) == ((n)->nd_flag & ND_KERBAUTH) && \
                    557:         !bcmp((caddr_t)&(o)->nd_cr, (caddr_t)&(n)->nd_cr, \
                    558:                sizeof (struct ucred)))
                    559: 
                    560: /*
                    561:  * Defines for WebNFS
                    562:  */
                    563: 
                    564: #define WEBNFS_ESC_CHAR                '%'
                    565: #define WEBNFS_SPECCHAR_START  0x80
                    566: 
                    567: #define WEBNFS_NATIVE_CHAR     0x80
                    568: /*
                    569:  * ..
                    570:  * Possibly more here in the future.
                    571:  */
                    572: 
                    573: /*
                    574:  * Macro for converting escape characters in WebNFS pathnames.
                    575:  * Should really be in libkern.
                    576:  */
                    577: 
                    578: #define HEXTOC(c) \
                    579:        ((c) >= 'a' ? ((c) - ('a' - 10)) : \
                    580:            ((c) >= 'A' ? ((c) - ('A' - 10)) : ((c) - '0')))
                    581: #define HEXSTRTOI(p) \
                    582:        ((HEXTOC(p[0]) << 4) + HEXTOC(p[1]))
                    583: 
                    584: #if    DIAGNOSTIC
                    585: 
                    586: extern int nfs_debug;
                    587: #define NFS_DEBUG_ASYNCIO      1 /* asynchronous i/o */
                    588: #define NFS_DEBUG_WG           2 /* server write gathering */
                    589: #define NFS_DEBUG_RC           4 /* server request caching */
                    590: #define NFS_DEBUG_SILLY                8 /* nfs_sillyrename (.nfsXXX aka turd files) */
                    591: #define NFS_DEBUG_DUP          16 /* debug duplicate requests */
                    592: #define NFS_DEBUG_ATTR         32
                    593: 
                    594: #define NFS_DPF(cat, args)                                     \
                    595:        do {                                                    \
                    596:                if (nfs_debug & NFS_DEBUG_##cat) kprintf args;  \
                    597:        } while (0)
                    598: 
                    599: #else
                    600: 
                    601: #define NFS_DPF(cat, args)
                    602: 
                    603: #endif
                    604: 
                    605: int    nfs_init __P((struct vfsconf *vfsp));
                    606: int    nfs_reply __P((struct nfsreq *));
                    607: int    nfs_getreq __P((struct nfsrv_descript *,struct nfsd *,int));
                    608: int    nfs_send __P((struct socket *, struct mbuf *, struct mbuf *, 
                    609:                      struct nfsreq *));
                    610: int    nfs_rephead __P((int, struct nfsrv_descript *, struct nfssvc_sock *,
                    611:                         int, int, u_quad_t *, struct mbuf **, struct mbuf **,
                    612:                         caddr_t *));
                    613: int    nfs_sndlock __P((int *, struct nfsreq *));
                    614: void   nfs_sndunlock __P((int *flagp));
                    615: int    nfs_disct __P((struct mbuf **, caddr_t *, int, int, caddr_t *));
                    616: int    nfs_vinvalbuf __P((struct vnode *, int, struct ucred *, struct proc *,
                    617:                           int));
                    618: int    nfs_readrpc __P((struct vnode *, struct uio *, struct ucred *));
                    619: int    nfs_writerpc __P((struct vnode *, struct uio *, struct ucred *, int *, 
                    620:                          int *));
                    621: int    nfs_readdirrpc __P((struct vnode *, struct uio *, struct ucred *));
                    622: int    nfs_asyncio __P((struct buf *, struct ucred *));
                    623: int    nfs_doio __P((struct buf *, struct ucred *, struct proc *));
                    624: int    nfs_readlinkrpc __P((struct vnode *, struct uio *, struct ucred *));
                    625: int    nfs_sigintr __P((struct nfsmount *, struct nfsreq *, struct proc *));
                    626: int    nfs_readdirplusrpc __P((struct vnode *, struct uio *, struct ucred *));
                    627: int    nfsm_disct __P((struct mbuf **, caddr_t *, int, int, caddr_t *));
                    628: void   nfsm_srvfattr __P((struct nfsrv_descript *, struct vattr *, 
                    629:                           struct nfs_fattr *));
                    630: void   nfsm_srvwcc __P((struct nfsrv_descript *, int, struct vattr *, int,
                    631:                         struct vattr *, struct mbuf **, char **));
                    632: void   nfsm_srvpostopattr __P((struct nfsrv_descript *, int, struct vattr *,
                    633:                                struct mbuf **, char **));
                    634: int    netaddr_match __P((int, union nethostaddr *, struct mbuf *));
                    635: int    nfs_request __P((struct vnode *, struct mbuf *, int, struct proc *,
                    636:                         struct ucred *, struct mbuf **, struct mbuf **,
                    637:                         caddr_t *));
                    638: int    nfs_loadattrcache __P((struct vnode **, struct mbuf **, caddr_t *,
                    639:                               struct vattr *));
                    640: int    nfs_namei __P((struct nameidata *, fhandle_t *, int,
                    641:                       struct nfssvc_sock *, struct mbuf *, struct mbuf **,
                    642:                       caddr_t *, struct vnode **, struct proc *, int, int));
                    643: void   nfsm_adj __P((struct mbuf *, int, int));
                    644: int    nfsm_mbuftouio __P((struct mbuf **, struct uio *, int, caddr_t *));
                    645: void   nfsrv_initcache __P((void));
                    646: int    nfs_getauth __P((struct nfsmount *, struct nfsreq *, struct ucred *, 
                    647:                         char **, int *, char *, int *, NFSKERBKEY_T));
                    648: int    nfs_getnickauth __P((struct nfsmount *, struct ucred *, char **, 
                    649:                             int *, char *, int));
                    650: int    nfs_savenickauth __P((struct nfsmount *, struct ucred *, int, 
                    651:                              NFSKERBKEY_T, struct mbuf **, char **,
                    652:                              struct mbuf *));
                    653: int    nfs_adv __P((struct mbuf **, caddr_t *, int, int));
                    654: void   nfs_nhinit __P((void));
                    655: void   nfs_timer __P((void*));
                    656: u_long nfs_hash __P((nfsfh_t *, int));
                    657: int    nfsrv_dorec __P((struct nfssvc_sock *, struct nfsd *, 
                    658:                         struct nfsrv_descript **));
                    659: int    nfsrv_getcache __P((struct nfsrv_descript *, struct nfssvc_sock *,
                    660:                            struct mbuf **));
                    661: void   nfsrv_updatecache __P((struct nfsrv_descript *, int, struct mbuf *));
                    662: void   nfsrv_cleancache __P((void));
                    663: int    nfs_connect __P((struct nfsmount *, struct nfsreq *));
                    664: void   nfs_disconnect __P((struct nfsmount *));
                    665: int    nfs_getattrcache __P((struct vnode *, struct vattr *));
                    666: int    nfsm_strtmbuf __P((struct mbuf **, char **, char *, long));
                    667: int    nfs_bioread __P((struct vnode *, struct uio *, int, struct ucred *,
                    668:                         int));
                    669: int    nfsm_uiotombuf __P((struct uio *, struct mbuf **, int, caddr_t *));
                    670: void   nfsrv_init __P((int));
                    671: void   nfs_clearcommit __P((struct mount *));
                    672: int    nfsrv_errmap __P((struct nfsrv_descript *, int));
                    673: void   nfsrvw_sort __P((gid_t *, int));
                    674: void   nfsrv_setcred __P((struct ucred *, struct ucred *));
                    675: int    nfs_writebp __P((struct buf *, int));
                    676: int    nfsrv_object_create __P((struct vnode *));
                    677: void   nfsrv_wakenfsd __P((struct nfssvc_sock *slp));
                    678: int    nfsrv_writegather __P((struct nfsrv_descript **, struct nfssvc_sock *,
                    679:                               struct proc *, struct mbuf **));
                    680: int    nfs_fsinfo __P((struct nfsmount *, struct vnode *, struct ucred *,
                    681:                        struct proc *p));
                    682: 
                    683: int    nfsrv3_access __P((struct nfsrv_descript *nfsd, 
                    684:                           struct nfssvc_sock *slp,
                    685:                           struct proc *procp, struct mbuf **mrq));
                    686: int    nfsrv_commit __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    687:                          struct proc *procp, struct mbuf **mrq));
                    688: int    nfsrv_create __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    689:                          struct proc *procp, struct mbuf **mrq));
                    690: int    nfsrv_fhtovp __P((fhandle_t *, int, struct vnode **, struct ucred *,
                    691:                          struct nfssvc_sock *, struct mbuf *, int *,
                    692:                          int, int));
                    693: int    nfsrv_setpublicfs __P((struct mount *, struct netexport *,
                    694:                               struct export_args *));
                    695: int    nfs_ispublicfh __P((fhandle_t *));
                    696: int    nfsrv_fsinfo __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    697:                          struct proc *procp, struct mbuf **mrq));
                    698: int    nfsrv_getattr __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    699:                           struct proc *procp, struct mbuf **mrq));
                    700: int    nfsrv_link __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    701:                        struct proc *procp, struct mbuf **mrq));
                    702: int    nfsrv_lookup __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    703:                          struct proc *procp, struct mbuf **mrq));
                    704: int    nfsrv_mkdir __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    705:                         struct proc *procp, struct mbuf **mrq));
                    706: int    nfsrv_mknod __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    707:                         struct proc *procp, struct mbuf **mrq));
                    708: int    nfsrv_noop __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    709:                        struct proc *procp, struct mbuf **mrq));
                    710: int    nfsrv_null __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    711:                        struct proc *procp, struct mbuf **mrq));
                    712: int    nfsrv_pathconf __P((struct nfsrv_descript *nfsd,
                    713:                            struct nfssvc_sock *slp, struct proc *procp,
                    714:                            struct mbuf **mrq));
                    715: int    nfsrv_read __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    716:                        struct proc *procp, struct mbuf **mrq));
                    717: int    nfsrv_readdir __P((struct nfsrv_descript *nfsd, 
                    718:                           struct nfssvc_sock *slp,
                    719:                           struct proc *procp, struct mbuf **mrq));
                    720: int    nfsrv_readdirplus __P((struct nfsrv_descript *nfsd,
                    721:                               struct nfssvc_sock *slp, struct proc *procp,
                    722:                               struct mbuf **mrq));
                    723: int    nfsrv_readlink __P((struct nfsrv_descript *nfsd,
                    724:                            struct nfssvc_sock *slp, struct proc *procp,
                    725:                            struct mbuf **mrq));
                    726: int    nfsrv_remove __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    727:                          struct proc *procp, struct mbuf **mrq));
                    728: int    nfsrv_rename __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    729:                          struct proc *procp, struct mbuf **mrq));
                    730: int    nfsrv_rmdir __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    731:                         struct proc *procp, struct mbuf **mrq));
                    732: int    nfsrv_setattr __P((struct nfsrv_descript *nfsd, 
                    733:                           struct nfssvc_sock *slp,
                    734:                           struct proc *procp, struct mbuf **mrq));
                    735: int    nfsrv_statfs __P((struct nfsrv_descript *nfsd, 
                    736:                          struct nfssvc_sock *slp,
                    737:                          struct proc *procp, struct mbuf **mrq));
                    738: int    nfsrv_symlink __P((struct nfsrv_descript *nfsd, 
                    739:                           struct nfssvc_sock *slp,
                    740:                           struct proc *procp, struct mbuf **mrq));
                    741: int    nfsrv_write __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                    742:                         struct proc *procp, struct mbuf **mrq));
                    743: void   nfsrv_rcv __P((struct socket *so, caddr_t arg, int waitflag));
                    744: void   nfsrv_slpderef __P((struct nfssvc_sock *slp));
                    745: 
                    746: #if DIAGNOSTIC
                    747: 
                    748: #include <sys/time.h>
                    749: #include <kern/clock.h>
                    750: 
                    751: extern uint nfstraceindx;
                    752: #define NFSTBUFSIZ 4096
                    753: struct nfstracerec { uint i1, i2, i3, i4; };
                    754: extern struct nfstracerec nfstracebuf[NFSTBUFSIZ];
                    755: extern uint nfstracemask; /* 32 bits - trace points over 31 are unconditional */
                    756: 
                    757: /* 0x0000000f nfs_getattrcache trace points */
                    758: #define NFSTRC_GAC_MISS 0x00   /* 0x00000001 cache miss */
                    759: #define NFSTRC_GAC_HIT 0x01    /* 0x00000002 cache hit */
                    760: #define NFSTRC_GAC_NP  0x02    /* 0x00000004 np size mismatch - vp... */
                    761: #define NFSTRC_GAC_MAP 0x03    /* 0x00000008 Mapped size mismatch - vp... */
                    762: /* 0x000000f0 nfs_loadattrcache trace points */
                    763: #define NFSTRC_LAC     0x04    /* 0x00000010 function entry point - vp */
                    764: #define NFSTRC_LAC_INIT        0x05    /* 0x00000020 new vp & init n_mtime - vp */
                    765: #define NFSTRC_LAC_NP  0x06    /* 0x00000040 np size mismatch - vp... */
                    766: #define NFSTRC_LAC_MAP 0x07    /* 0x00000080 Mapped size mismatch - vp... */
                    767: /* 0x00000300 nfs_getattr trace points */
                    768: #define NFSTRC_GA_INV  0x08    /* 0x00000100 times mismatch - vp */
                    769: #define NFSTRC_GA_INV1 0x09    /* 0x00000200 invalidate ok - vp */
                    770: /* 0x00004000 vmp_invalidate trace points */
                    771: #define NFSTRC_VMP_INV 0x0e    /* 0x00004000 function entry point - vmp */
                    772: /* 0x00008000 nfs_request trace points */
                    773: #define NFSTRC_REQ     0x0f    /* 0x00008000 - alternates vp and procnum */
                    774: /* 0x00030000 vmp_push_range trace points */
                    775: #define NFSTRC_VPR     0x10    /* 0x00010000 entry point - vp... */
                    776: #define NFSTRC_VPR_DONE        0x11    /* 0x00020000 tail exit - error # */
                    777: /* 0x000c0000 nfs_doio trace points */
                    778: #define NFSTRC_DIO     0x12    /* 0x00040000 entry point - vp */
                    779: #define NFSTRC_DIO_DONE        0x13    /* 0x00080000 exit points - vp */
                    780: /* 0x00300000 mapfs_io trace points */
                    781: #define NFSTRC_MIO_WRT 0x14    /* 0x00100000 Write - vp... */
                    782: #define NFSTRC_MIO_READ        0x15    /* 0x00200000 Read - vp... */
                    783: /* 0x0f000000 mapfs_trunc trace points */
                    784: #define NFSTRC_MTR     0x18    /* 0x01000000 mapfs_trunc - vp... */
                    785: #define NFSTRC_MTR_MREM        0x19    /* 0x02000000 ditto, map_remove - vp... */
                    786: #define NFSTRC_MTR_RMAP        0x1a    /* 0x04000000 ditto, remap_vnode - vp... */
                    787: #define NFSTRC_MTR_DIRT        0x1b    /* 0x08000000 ditto, nfsdirty - vmp->va */
                    788: /* 0xf0000000 nfs_rcvlock & nfs_rcvunlock trace points */
                    789: #define NFSTRC_RCVLCKW 0x1c    /* 0x10000000 seeking recieve lock (waiting) */
                    790: #define NFSTRC_RCVLCK  0x1d    /* 0x20000000 getting recieve lock */ 
                    791: #define NFSTRC_RCVUNLW 0x1e    /* 0x40000000 releasing rcv lock w/ wakeup */
                    792: #define NFSTRC_RCVUNL  0x1f    /* 0x80000000 releasing rcv lock w/o wakeup */
                    793: /* trace points beyond 31 are unconditional */
                    794: #define NFSTRC_GA_INV2 0x20    /* nfs_getattr invalidate - error# */
                    795: #define NFSTRC_MTR_BZER        0x30    /* mapfs_trunc safe_bzero error - vp... */
                    796: #define NFSTRC_MIO_RINV        0x40    /* mapfs_io Read INValidating */
                    797: #define NFSTRC_CONTINUE        0xff    /* continuation record for previous entry */
                    798: 
                    799: #define NFSTRACEX(a1, a2, a3, a4) \
                    800: ( \
                    801:        nfstracebuf[nfstraceindx].i1 = (uint)(a1), \
                    802:        nfstracebuf[nfstraceindx].i2 = (uint)(a2), \
                    803:        nfstracebuf[nfstraceindx].i3 = (uint)(a3), \
                    804:        nfstracebuf[nfstraceindx].i4 = (uint)(a4), \
                    805:        nfstraceindx = (nfstraceindx + 1) % NFSTBUFSIZ, \
                    806:        1 \
                    807: )
                    808: 
                    809: #define NFSTRACE(cnst, fptr) \
                    810: ( \
                    811:        ((cnst) > 31 || nfstracemask & 1<<(cnst)) ? \
                    812:                NFSTRACEX((cnst), (fptr), current_thread(), \
                    813:                          clock_get_system_value().tv_nsec) : \
                    814:                0 \
                    815: )
                    816: 
                    817: #define NFSTRACE4(cnst, fptr, a2, a3, a4) \
                    818: ( \
                    819:        NFSTRACE(cnst,fptr) ? \
                    820:                NFSTRACEX(NFSTRC_CONTINUE, a2, a3, a4) : \
                    821:                0 \
                    822: )
                    823: 
                    824: #else  /* DIAGNOSTIC */
                    825: 
                    826:        #define NFSTRACE(cnst, fptr)
                    827:        #define NFSTRACE4(cnst, fptr, a2, a3, a4)
                    828: 
                    829: #endif /* DIAGNOSTIC */
                    830: 
                    831: #endif /* KERNEL */
                    832: 
                    833: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.