Home | History | Annotate | Line # | Download | only in server
nfs_nfsdsocket.c revision 1.1.1.1.10.3
      1  1.1.1.1.10.2       tls /*	$NetBSD: nfs_nfsdsocket.c,v 1.1.1.1.10.3 2017/12/03 11:38:42 jdolecek Exp $	*/
      2  1.1.1.1.10.2       tls /*-
      3  1.1.1.1.10.2       tls  * Copyright (c) 1989, 1993
      4  1.1.1.1.10.2       tls  *	The Regents of the University of California.  All rights reserved.
      5  1.1.1.1.10.2       tls  *
      6  1.1.1.1.10.2       tls  * This code is derived from software contributed to Berkeley by
      7  1.1.1.1.10.2       tls  * Rick Macklem at The University of Guelph.
      8  1.1.1.1.10.2       tls  *
      9  1.1.1.1.10.2       tls  * Redistribution and use in source and binary forms, with or without
     10  1.1.1.1.10.2       tls  * modification, are permitted provided that the following conditions
     11  1.1.1.1.10.2       tls  * are met:
     12  1.1.1.1.10.2       tls  * 1. Redistributions of source code must retain the above copyright
     13  1.1.1.1.10.2       tls  *    notice, this list of conditions and the following disclaimer.
     14  1.1.1.1.10.2       tls  * 2. Redistributions in binary form must reproduce the above copyright
     15  1.1.1.1.10.2       tls  *    notice, this list of conditions and the following disclaimer in the
     16  1.1.1.1.10.2       tls  *    documentation and/or other materials provided with the distribution.
     17  1.1.1.1.10.2       tls  * 4. Neither the name of the University nor the names of its contributors
     18  1.1.1.1.10.2       tls  *    may be used to endorse or promote products derived from this software
     19  1.1.1.1.10.2       tls  *    without specific prior written permission.
     20  1.1.1.1.10.2       tls  *
     21  1.1.1.1.10.2       tls  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     22  1.1.1.1.10.2       tls  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  1.1.1.1.10.2       tls  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  1.1.1.1.10.2       tls  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     25  1.1.1.1.10.2       tls  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26  1.1.1.1.10.2       tls  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27  1.1.1.1.10.2       tls  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28  1.1.1.1.10.2       tls  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29  1.1.1.1.10.2       tls  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30  1.1.1.1.10.2       tls  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31  1.1.1.1.10.2       tls  * SUCH DAMAGE.
     32  1.1.1.1.10.2       tls  *
     33  1.1.1.1.10.2       tls  */
     34  1.1.1.1.10.2       tls 
     35  1.1.1.1.10.2       tls #include <sys/cdefs.h>
     36  1.1.1.1.10.3  jdolecek /* __FBSDID("FreeBSD: head/sys/fs/nfsserver/nfs_nfsdsocket.c 304026 2016-08-12 22:44:59Z rmacklem "); */
     37  1.1.1.1.10.2       tls __RCSID("$NetBSD: nfs_nfsdsocket.c,v 1.1.1.1.10.3 2017/12/03 11:38:42 jdolecek Exp $");
     38  1.1.1.1.10.2       tls 
     39  1.1.1.1.10.2       tls /*
     40  1.1.1.1.10.2       tls  * Socket operations for use by the nfs server.
     41  1.1.1.1.10.2       tls  */
     42  1.1.1.1.10.2       tls 
     43  1.1.1.1.10.2       tls #ifndef APPLEKEXT
     44  1.1.1.1.10.3  jdolecek #include <fs/nfs/common/nfsport.h>
     45  1.1.1.1.10.2       tls 
     46  1.1.1.1.10.3  jdolecek extern struct nfsstatsv1 nfsstatsv1;
     47  1.1.1.1.10.2       tls extern struct nfsrvfh nfs_pubfh, nfs_rootfh;
     48  1.1.1.1.10.2       tls extern int nfs_pubfhset, nfs_rootfhset;
     49  1.1.1.1.10.2       tls extern struct nfsv4lock nfsv4rootfs_lock;
     50  1.1.1.1.10.2       tls extern struct nfsrv_stablefirst nfsrv_stablefirst;
     51  1.1.1.1.10.3  jdolecek extern struct nfsclienthashhead *nfsclienthash;
     52  1.1.1.1.10.3  jdolecek extern int nfsrv_clienthashsize;
     53  1.1.1.1.10.2       tls extern int nfsrc_floodlevel, nfsrc_tcpsavedreplies;
     54  1.1.1.1.10.3  jdolecek extern int nfsd_debuglevel;
     55  1.1.1.1.10.2       tls NFSV4ROOTLOCKMUTEX;
     56  1.1.1.1.10.2       tls NFSSTATESPINLOCK;
     57  1.1.1.1.10.2       tls 
     58  1.1.1.1.10.2       tls int (*nfsrv3_procs0[NFS_V3NPROCS])(struct nfsrv_descript *,
     59  1.1.1.1.10.2       tls     int, vnode_t , NFSPROC_T *, struct nfsexstuff *) = {
     60  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
     61  1.1.1.1.10.2       tls 	nfsrvd_getattr,
     62  1.1.1.1.10.2       tls 	nfsrvd_setattr,
     63  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
     64  1.1.1.1.10.2       tls 	nfsrvd_access,
     65  1.1.1.1.10.2       tls 	nfsrvd_readlink,
     66  1.1.1.1.10.2       tls 	nfsrvd_read,
     67  1.1.1.1.10.2       tls 	nfsrvd_write,
     68  1.1.1.1.10.2       tls 	nfsrvd_create,
     69  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
     70  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
     71  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
     72  1.1.1.1.10.2       tls 	nfsrvd_remove,
     73  1.1.1.1.10.2       tls 	nfsrvd_remove,
     74  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
     75  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
     76  1.1.1.1.10.2       tls 	nfsrvd_readdir,
     77  1.1.1.1.10.2       tls 	nfsrvd_readdirplus,
     78  1.1.1.1.10.2       tls 	nfsrvd_statfs,
     79  1.1.1.1.10.2       tls 	nfsrvd_fsinfo,
     80  1.1.1.1.10.2       tls 	nfsrvd_pathconf,
     81  1.1.1.1.10.2       tls 	nfsrvd_commit,
     82  1.1.1.1.10.2       tls };
     83  1.1.1.1.10.2       tls 
     84  1.1.1.1.10.2       tls int (*nfsrv3_procs1[NFS_V3NPROCS])(struct nfsrv_descript *,
     85  1.1.1.1.10.2       tls     int, vnode_t , vnode_t *, fhandle_t *,
     86  1.1.1.1.10.2       tls     NFSPROC_T *, struct nfsexstuff *) = {
     87  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
     88  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
     89  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
     90  1.1.1.1.10.2       tls 	nfsrvd_lookup,
     91  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
     92  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
     93  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
     94  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
     95  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
     96  1.1.1.1.10.2       tls 	nfsrvd_mkdir,
     97  1.1.1.1.10.2       tls 	nfsrvd_symlink,
     98  1.1.1.1.10.2       tls 	nfsrvd_mknod,
     99  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    100  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    101  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    102  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    103  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    104  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    105  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    106  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    107  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    108  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    109  1.1.1.1.10.2       tls };
    110  1.1.1.1.10.2       tls 
    111  1.1.1.1.10.2       tls int (*nfsrv3_procs2[NFS_V3NPROCS])(struct nfsrv_descript *,
    112  1.1.1.1.10.2       tls     int, vnode_t , vnode_t , NFSPROC_T *,
    113  1.1.1.1.10.2       tls     struct nfsexstuff *, struct nfsexstuff *) = {
    114  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    115  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    116  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    117  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    118  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    119  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    120  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    121  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    122  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    123  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    124  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    125  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    126  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    127  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    128  1.1.1.1.10.2       tls 	nfsrvd_rename,
    129  1.1.1.1.10.2       tls 	nfsrvd_link,
    130  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    131  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    132  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    133  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    134  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    135  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    136  1.1.1.1.10.2       tls };
    137  1.1.1.1.10.2       tls 
    138  1.1.1.1.10.3  jdolecek int (*nfsrv4_ops0[NFSV41_NOPS])(struct nfsrv_descript *,
    139  1.1.1.1.10.2       tls     int, vnode_t , NFSPROC_T *, struct nfsexstuff *) = {
    140  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    141  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    142  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    143  1.1.1.1.10.2       tls 	nfsrvd_access,
    144  1.1.1.1.10.2       tls 	nfsrvd_close,
    145  1.1.1.1.10.2       tls 	nfsrvd_commit,
    146  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    147  1.1.1.1.10.2       tls 	nfsrvd_delegpurge,
    148  1.1.1.1.10.2       tls 	nfsrvd_delegreturn,
    149  1.1.1.1.10.2       tls 	nfsrvd_getattr,
    150  1.1.1.1.10.2       tls 	nfsrvd_getfh,
    151  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    152  1.1.1.1.10.2       tls 	nfsrvd_lock,
    153  1.1.1.1.10.2       tls 	nfsrvd_lockt,
    154  1.1.1.1.10.2       tls 	nfsrvd_locku,
    155  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    156  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    157  1.1.1.1.10.2       tls 	nfsrvd_verify,
    158  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    159  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    160  1.1.1.1.10.2       tls 	nfsrvd_openconfirm,
    161  1.1.1.1.10.2       tls 	nfsrvd_opendowngrade,
    162  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    163  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    164  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    165  1.1.1.1.10.2       tls 	nfsrvd_read,
    166  1.1.1.1.10.2       tls 	nfsrvd_readdirplus,
    167  1.1.1.1.10.2       tls 	nfsrvd_readlink,
    168  1.1.1.1.10.2       tls 	nfsrvd_remove,
    169  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    170  1.1.1.1.10.2       tls 	nfsrvd_renew,
    171  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    172  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , NFSPROC_T *, struct nfsexstuff *))0,
    173  1.1.1.1.10.2       tls 	nfsrvd_secinfo,
    174  1.1.1.1.10.2       tls 	nfsrvd_setattr,
    175  1.1.1.1.10.2       tls 	nfsrvd_setclientid,
    176  1.1.1.1.10.2       tls 	nfsrvd_setclientidcfrm,
    177  1.1.1.1.10.2       tls 	nfsrvd_verify,
    178  1.1.1.1.10.2       tls 	nfsrvd_write,
    179  1.1.1.1.10.2       tls 	nfsrvd_releaselckown,
    180  1.1.1.1.10.3  jdolecek 	nfsrvd_notsupp,
    181  1.1.1.1.10.3  jdolecek 	nfsrvd_notsupp,
    182  1.1.1.1.10.3  jdolecek 	nfsrvd_exchangeid,
    183  1.1.1.1.10.3  jdolecek 	nfsrvd_createsession,
    184  1.1.1.1.10.3  jdolecek 	nfsrvd_destroysession,
    185  1.1.1.1.10.3  jdolecek 	nfsrvd_freestateid,
    186  1.1.1.1.10.3  jdolecek 	nfsrvd_notsupp,
    187  1.1.1.1.10.3  jdolecek 	nfsrvd_notsupp,
    188  1.1.1.1.10.3  jdolecek 	nfsrvd_notsupp,
    189  1.1.1.1.10.3  jdolecek 	nfsrvd_notsupp,
    190  1.1.1.1.10.3  jdolecek 	nfsrvd_notsupp,
    191  1.1.1.1.10.3  jdolecek 	nfsrvd_notsupp,
    192  1.1.1.1.10.3  jdolecek 	nfsrvd_notsupp,
    193  1.1.1.1.10.3  jdolecek 	nfsrvd_sequence,
    194  1.1.1.1.10.3  jdolecek 	nfsrvd_notsupp,
    195  1.1.1.1.10.3  jdolecek 	nfsrvd_notsupp,
    196  1.1.1.1.10.3  jdolecek 	nfsrvd_notsupp,
    197  1.1.1.1.10.3  jdolecek 	nfsrvd_destroyclientid,
    198  1.1.1.1.10.3  jdolecek 	nfsrvd_reclaimcomplete,
    199  1.1.1.1.10.2       tls };
    200  1.1.1.1.10.2       tls 
    201  1.1.1.1.10.3  jdolecek int (*nfsrv4_ops1[NFSV41_NOPS])(struct nfsrv_descript *,
    202  1.1.1.1.10.2       tls     int, vnode_t , vnode_t *, fhandle_t *,
    203  1.1.1.1.10.2       tls     NFSPROC_T *, struct nfsexstuff *) = {
    204  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    205  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    206  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    207  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    208  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    209  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    210  1.1.1.1.10.2       tls 	nfsrvd_mknod,
    211  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    212  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    213  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    214  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    215  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    216  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    217  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    218  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    219  1.1.1.1.10.2       tls 	nfsrvd_lookup,
    220  1.1.1.1.10.2       tls 	nfsrvd_lookup,
    221  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    222  1.1.1.1.10.2       tls 	nfsrvd_open,
    223  1.1.1.1.10.2       tls 	nfsrvd_openattr,
    224  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    225  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    226  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    227  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    228  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    229  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    230  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    231  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    232  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    233  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    234  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    235  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    236  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    237  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    238  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    239  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    240  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    241  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    242  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    243  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    244  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    245  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    246  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    247  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    248  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    249  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    250  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    251  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    252  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    253  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    254  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    255  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    256  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    257  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    258  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    259  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    260  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    261  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    262  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t *, fhandle_t *, NFSPROC_T *, struct nfsexstuff *))0,
    263  1.1.1.1.10.2       tls };
    264  1.1.1.1.10.2       tls 
    265  1.1.1.1.10.3  jdolecek int (*nfsrv4_ops2[NFSV41_NOPS])(struct nfsrv_descript *,
    266  1.1.1.1.10.2       tls     int, vnode_t , vnode_t , NFSPROC_T *,
    267  1.1.1.1.10.2       tls     struct nfsexstuff *, struct nfsexstuff *) = {
    268  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    269  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    270  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    271  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    272  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    273  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    274  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    275  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    276  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    277  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    278  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    279  1.1.1.1.10.2       tls 	nfsrvd_link,
    280  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    281  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    282  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    283  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    284  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    285  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    286  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    287  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    288  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    289  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    290  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    291  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    292  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    293  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    294  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    295  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    296  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    297  1.1.1.1.10.2       tls 	nfsrvd_rename,
    298  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    299  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    300  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    301  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    302  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    303  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    304  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    305  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    306  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    307  1.1.1.1.10.2       tls 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    308  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    309  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    310  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    311  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    312  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    313  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    314  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    315  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    316  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    317  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    318  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    319  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    320  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    321  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    322  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    323  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    324  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    325  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    326  1.1.1.1.10.3  jdolecek 	(int (*)(struct nfsrv_descript *, int, vnode_t , vnode_t , NFSPROC_T *, struct nfsexstuff *, struct nfsexstuff *))0,
    327  1.1.1.1.10.2       tls };
    328  1.1.1.1.10.2       tls #endif	/* !APPLEKEXT */
    329  1.1.1.1.10.2       tls 
    330  1.1.1.1.10.2       tls /*
    331  1.1.1.1.10.2       tls  * Static array that defines which nfs rpc's are nonidempotent
    332  1.1.1.1.10.2       tls  */
    333  1.1.1.1.10.2       tls static int nfsrv_nonidempotent[NFS_V3NPROCS] = {
    334  1.1.1.1.10.2       tls 	FALSE,
    335  1.1.1.1.10.2       tls 	FALSE,
    336  1.1.1.1.10.2       tls 	TRUE,
    337  1.1.1.1.10.2       tls 	FALSE,
    338  1.1.1.1.10.2       tls 	FALSE,
    339  1.1.1.1.10.2       tls 	FALSE,
    340  1.1.1.1.10.2       tls 	FALSE,
    341  1.1.1.1.10.2       tls 	TRUE,
    342  1.1.1.1.10.2       tls 	TRUE,
    343  1.1.1.1.10.2       tls 	TRUE,
    344  1.1.1.1.10.2       tls 	TRUE,
    345  1.1.1.1.10.2       tls 	TRUE,
    346  1.1.1.1.10.2       tls 	TRUE,
    347  1.1.1.1.10.2       tls 	TRUE,
    348  1.1.1.1.10.2       tls 	TRUE,
    349  1.1.1.1.10.2       tls 	TRUE,
    350  1.1.1.1.10.2       tls 	FALSE,
    351  1.1.1.1.10.2       tls 	FALSE,
    352  1.1.1.1.10.2       tls 	FALSE,
    353  1.1.1.1.10.2       tls 	FALSE,
    354  1.1.1.1.10.2       tls 	FALSE,
    355  1.1.1.1.10.2       tls 	FALSE,
    356  1.1.1.1.10.2       tls };
    357  1.1.1.1.10.2       tls 
    358  1.1.1.1.10.2       tls /*
    359  1.1.1.1.10.2       tls  * This static array indicates whether or not the RPC modifies the
    360  1.1.1.1.10.2       tls  * file system.
    361  1.1.1.1.10.2       tls  */
    362  1.1.1.1.10.2       tls static int nfs_writerpc[NFS_NPROCS] = { 0, 0, 1, 0, 0, 0, 0,
    363  1.1.1.1.10.2       tls     1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
    364  1.1.1.1.10.2       tls     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
    365  1.1.1.1.10.2       tls 
    366  1.1.1.1.10.2       tls /* local functions */
    367  1.1.1.1.10.2       tls static void nfsrvd_compound(struct nfsrv_descript *nd, int isdgram,
    368  1.1.1.1.10.3  jdolecek     u_char *tag, int taglen, u_int32_t minorvers, NFSPROC_T *p);
    369  1.1.1.1.10.2       tls 
    370  1.1.1.1.10.2       tls 
    371  1.1.1.1.10.2       tls /*
    372  1.1.1.1.10.2       tls  * This static array indicates which server procedures require the extra
    373  1.1.1.1.10.2       tls  * arguments to return the current file handle for V2, 3.
    374  1.1.1.1.10.2       tls  */
    375  1.1.1.1.10.2       tls static int nfs_retfh[NFS_V3NPROCS] = { 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1,
    376  1.1.1.1.10.2       tls 	1, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0 };
    377  1.1.1.1.10.2       tls 
    378  1.1.1.1.10.3  jdolecek extern struct nfsv4_opflag nfsv4_opflag[NFSV41_NOPS];
    379  1.1.1.1.10.2       tls 
    380  1.1.1.1.10.2       tls static int nfsv3to4op[NFS_V3NPROCS] = {
    381  1.1.1.1.10.2       tls 	NFSPROC_NULL,
    382  1.1.1.1.10.2       tls 	NFSV4OP_GETATTR,
    383  1.1.1.1.10.2       tls 	NFSV4OP_SETATTR,
    384  1.1.1.1.10.2       tls 	NFSV4OP_LOOKUP,
    385  1.1.1.1.10.2       tls 	NFSV4OP_ACCESS,
    386  1.1.1.1.10.2       tls 	NFSV4OP_READLINK,
    387  1.1.1.1.10.2       tls 	NFSV4OP_READ,
    388  1.1.1.1.10.2       tls 	NFSV4OP_WRITE,
    389  1.1.1.1.10.2       tls 	NFSV4OP_V3CREATE,
    390  1.1.1.1.10.2       tls 	NFSV4OP_MKDIR,
    391  1.1.1.1.10.2       tls 	NFSV4OP_SYMLINK,
    392  1.1.1.1.10.2       tls 	NFSV4OP_MKNOD,
    393  1.1.1.1.10.2       tls 	NFSV4OP_REMOVE,
    394  1.1.1.1.10.2       tls 	NFSV4OP_RMDIR,
    395  1.1.1.1.10.2       tls 	NFSV4OP_RENAME,
    396  1.1.1.1.10.2       tls 	NFSV4OP_LINK,
    397  1.1.1.1.10.2       tls 	NFSV4OP_READDIR,
    398  1.1.1.1.10.2       tls 	NFSV4OP_READDIRPLUS,
    399  1.1.1.1.10.2       tls 	NFSV4OP_FSSTAT,
    400  1.1.1.1.10.2       tls 	NFSV4OP_FSINFO,
    401  1.1.1.1.10.2       tls 	NFSV4OP_PATHCONF,
    402  1.1.1.1.10.2       tls 	NFSV4OP_COMMIT,
    403  1.1.1.1.10.2       tls };
    404  1.1.1.1.10.2       tls 
    405  1.1.1.1.10.3  jdolecek static struct mtx nfsrvd_statmtx;
    406  1.1.1.1.10.3  jdolecek MTX_SYSINIT(nfsst, &nfsrvd_statmtx, "NFSstat", MTX_DEF);
    407  1.1.1.1.10.3  jdolecek 
    408  1.1.1.1.10.3  jdolecek static void
    409  1.1.1.1.10.3  jdolecek nfsrvd_statstart(int op, struct bintime *now)
    410  1.1.1.1.10.3  jdolecek {
    411  1.1.1.1.10.3  jdolecek 	if (op > (NFSV42_NOPS + NFSV4OP_FAKENOPS)) {
    412  1.1.1.1.10.3  jdolecek 		printf("%s: op %d invalid\n", __func__, op);
    413  1.1.1.1.10.3  jdolecek 		return;
    414  1.1.1.1.10.3  jdolecek 	}
    415  1.1.1.1.10.3  jdolecek 
    416  1.1.1.1.10.3  jdolecek 	mtx_lock(&nfsrvd_statmtx);
    417  1.1.1.1.10.3  jdolecek 	if (nfsstatsv1.srvstartcnt == nfsstatsv1.srvdonecnt) {
    418  1.1.1.1.10.3  jdolecek 		if (now != NULL)
    419  1.1.1.1.10.3  jdolecek 			nfsstatsv1.busyfrom = *now;
    420  1.1.1.1.10.3  jdolecek 		else
    421  1.1.1.1.10.3  jdolecek 			binuptime(&nfsstatsv1.busyfrom);
    422  1.1.1.1.10.3  jdolecek 
    423  1.1.1.1.10.3  jdolecek 	}
    424  1.1.1.1.10.3  jdolecek 	nfsstatsv1.srvrpccnt[op]++;
    425  1.1.1.1.10.3  jdolecek 	nfsstatsv1.srvstartcnt++;
    426  1.1.1.1.10.3  jdolecek 	mtx_unlock(&nfsrvd_statmtx);
    427  1.1.1.1.10.3  jdolecek 
    428  1.1.1.1.10.3  jdolecek }
    429  1.1.1.1.10.3  jdolecek 
    430  1.1.1.1.10.3  jdolecek static void
    431  1.1.1.1.10.3  jdolecek nfsrvd_statend(int op, uint64_t bytes, struct bintime *now,
    432  1.1.1.1.10.3  jdolecek     struct bintime *then)
    433  1.1.1.1.10.3  jdolecek {
    434  1.1.1.1.10.3  jdolecek 	struct bintime dt, lnow;
    435  1.1.1.1.10.3  jdolecek 
    436  1.1.1.1.10.3  jdolecek 	if (op > (NFSV42_NOPS + NFSV4OP_FAKENOPS)) {
    437  1.1.1.1.10.3  jdolecek 		printf("%s: op %d invalid\n", __func__, op);
    438  1.1.1.1.10.3  jdolecek 		return;
    439  1.1.1.1.10.3  jdolecek 	}
    440  1.1.1.1.10.3  jdolecek 
    441  1.1.1.1.10.3  jdolecek 	if (now == NULL) {
    442  1.1.1.1.10.3  jdolecek 		now = &lnow;
    443  1.1.1.1.10.3  jdolecek 		binuptime(now);
    444  1.1.1.1.10.3  jdolecek 	}
    445  1.1.1.1.10.3  jdolecek 
    446  1.1.1.1.10.3  jdolecek 	mtx_lock(&nfsrvd_statmtx);
    447  1.1.1.1.10.3  jdolecek 
    448  1.1.1.1.10.3  jdolecek 	nfsstatsv1.srvbytes[op] += bytes;
    449  1.1.1.1.10.3  jdolecek 	nfsstatsv1.srvops[op]++;
    450  1.1.1.1.10.3  jdolecek 
    451  1.1.1.1.10.3  jdolecek 	if (then != NULL) {
    452  1.1.1.1.10.3  jdolecek 		dt = *now;
    453  1.1.1.1.10.3  jdolecek 		bintime_sub(&dt, then);
    454  1.1.1.1.10.3  jdolecek 		bintime_add(&nfsstatsv1.srvduration[op], &dt);
    455  1.1.1.1.10.3  jdolecek 	}
    456  1.1.1.1.10.3  jdolecek 
    457  1.1.1.1.10.3  jdolecek 	dt = *now;
    458  1.1.1.1.10.3  jdolecek 	bintime_sub(&dt, &nfsstatsv1.busyfrom);
    459  1.1.1.1.10.3  jdolecek 	bintime_add(&nfsstatsv1.busytime, &dt);
    460  1.1.1.1.10.3  jdolecek 	nfsstatsv1.busyfrom = *now;
    461  1.1.1.1.10.3  jdolecek 
    462  1.1.1.1.10.3  jdolecek 	nfsstatsv1.srvdonecnt++;
    463  1.1.1.1.10.3  jdolecek 
    464  1.1.1.1.10.3  jdolecek 	mtx_unlock(&nfsrvd_statmtx);
    465  1.1.1.1.10.3  jdolecek }
    466  1.1.1.1.10.3  jdolecek 
    467  1.1.1.1.10.2       tls /*
    468  1.1.1.1.10.2       tls  * Do an RPC. Basically, get the file handles translated to vnode pointers
    469  1.1.1.1.10.2       tls  * and then call the appropriate server routine. The server routines are
    470  1.1.1.1.10.2       tls  * split into groups, based on whether they use a file handle or file
    471  1.1.1.1.10.2       tls  * handle plus name or ...
    472  1.1.1.1.10.2       tls  * The NFS V4 Compound RPC is performed separately by nfsrvd_compound().
    473  1.1.1.1.10.2       tls  */
    474  1.1.1.1.10.2       tls APPLESTATIC void
    475  1.1.1.1.10.3  jdolecek nfsrvd_dorpc(struct nfsrv_descript *nd, int isdgram, u_char *tag, int taglen,
    476  1.1.1.1.10.3  jdolecek     u_int32_t minorvers, NFSPROC_T *p)
    477  1.1.1.1.10.2       tls {
    478  1.1.1.1.10.2       tls 	int error = 0, lktype;
    479  1.1.1.1.10.2       tls 	vnode_t vp;
    480  1.1.1.1.10.2       tls 	mount_t mp = NULL;
    481  1.1.1.1.10.2       tls 	struct nfsrvfh fh;
    482  1.1.1.1.10.2       tls 	struct nfsexstuff nes;
    483  1.1.1.1.10.2       tls 
    484  1.1.1.1.10.2       tls 	/*
    485  1.1.1.1.10.2       tls 	 * Get a locked vnode for the first file handle
    486  1.1.1.1.10.2       tls 	 */
    487  1.1.1.1.10.2       tls 	if (!(nd->nd_flag & ND_NFSV4)) {
    488  1.1.1.1.10.2       tls 		KASSERT(nd->nd_repstat == 0, ("nfsrvd_dorpc"));
    489  1.1.1.1.10.2       tls 		/*
    490  1.1.1.1.10.2       tls 		 * For NFSv3, if the malloc/mget allocation is near limits,
    491  1.1.1.1.10.2       tls 		 * return NFSERR_DELAY.
    492  1.1.1.1.10.2       tls 		 */
    493  1.1.1.1.10.2       tls 		if ((nd->nd_flag & ND_NFSV3) && nfsrv_mallocmget_limit()) {
    494  1.1.1.1.10.2       tls 			nd->nd_repstat = NFSERR_DELAY;
    495  1.1.1.1.10.2       tls 			vp = NULL;
    496  1.1.1.1.10.2       tls 		} else {
    497  1.1.1.1.10.2       tls 			error = nfsrv_mtofh(nd, &fh);
    498  1.1.1.1.10.2       tls 			if (error) {
    499  1.1.1.1.10.2       tls 				if (error != EBADRPC)
    500  1.1.1.1.10.2       tls 					printf("nfs dorpc err1=%d\n", error);
    501  1.1.1.1.10.2       tls 				nd->nd_repstat = NFSERR_GARBAGE;
    502  1.1.1.1.10.2       tls 				goto out;
    503  1.1.1.1.10.2       tls 			}
    504  1.1.1.1.10.2       tls 			if (nd->nd_procnum == NFSPROC_READ ||
    505  1.1.1.1.10.2       tls 			    nd->nd_procnum == NFSPROC_WRITE ||
    506  1.1.1.1.10.2       tls 			    nd->nd_procnum == NFSPROC_READDIR ||
    507  1.1.1.1.10.3  jdolecek 			    nd->nd_procnum == NFSPROC_READDIRPLUS ||
    508  1.1.1.1.10.2       tls 			    nd->nd_procnum == NFSPROC_READLINK ||
    509  1.1.1.1.10.2       tls 			    nd->nd_procnum == NFSPROC_GETATTR ||
    510  1.1.1.1.10.3  jdolecek 			    nd->nd_procnum == NFSPROC_ACCESS ||
    511  1.1.1.1.10.3  jdolecek 			    nd->nd_procnum == NFSPROC_FSSTAT ||
    512  1.1.1.1.10.3  jdolecek 			    nd->nd_procnum == NFSPROC_FSINFO)
    513  1.1.1.1.10.2       tls 				lktype = LK_SHARED;
    514  1.1.1.1.10.2       tls 			else
    515  1.1.1.1.10.2       tls 				lktype = LK_EXCLUSIVE;
    516  1.1.1.1.10.2       tls 			if (nd->nd_flag & ND_PUBLOOKUP)
    517  1.1.1.1.10.2       tls 				nfsd_fhtovp(nd, &nfs_pubfh, lktype, &vp, &nes,
    518  1.1.1.1.10.2       tls 				    &mp, nfs_writerpc[nd->nd_procnum], p);
    519  1.1.1.1.10.2       tls 			else
    520  1.1.1.1.10.2       tls 				nfsd_fhtovp(nd, &fh, lktype, &vp, &nes,
    521  1.1.1.1.10.2       tls 				    &mp, nfs_writerpc[nd->nd_procnum], p);
    522  1.1.1.1.10.2       tls 			if (nd->nd_repstat == NFSERR_PROGNOTV4)
    523  1.1.1.1.10.2       tls 				goto out;
    524  1.1.1.1.10.2       tls 		}
    525  1.1.1.1.10.2       tls 	}
    526  1.1.1.1.10.2       tls 
    527  1.1.1.1.10.2       tls 	/*
    528  1.1.1.1.10.2       tls 	 * For V2 and 3, set the ND_SAVEREPLY flag for the recent request
    529  1.1.1.1.10.2       tls 	 * cache, as required.
    530  1.1.1.1.10.2       tls 	 * For V4, nfsrvd_compound() does this.
    531  1.1.1.1.10.2       tls 	 */
    532  1.1.1.1.10.2       tls 	if (!(nd->nd_flag & ND_NFSV4) && nfsrv_nonidempotent[nd->nd_procnum])
    533  1.1.1.1.10.2       tls 		nd->nd_flag |= ND_SAVEREPLY;
    534  1.1.1.1.10.2       tls 
    535  1.1.1.1.10.2       tls 	nfsrvd_rephead(nd);
    536  1.1.1.1.10.2       tls 	/*
    537  1.1.1.1.10.2       tls 	 * If nd_repstat is non-zero, just fill in the reply status
    538  1.1.1.1.10.2       tls 	 * to complete the RPC reply for V2. Otherwise, you must do
    539  1.1.1.1.10.2       tls 	 * the RPC.
    540  1.1.1.1.10.2       tls 	 */
    541  1.1.1.1.10.2       tls 	if (nd->nd_repstat && (nd->nd_flag & ND_NFSV2)) {
    542  1.1.1.1.10.2       tls 		*nd->nd_errp = nfsd_errmap(nd);
    543  1.1.1.1.10.3  jdolecek 		nfsrvd_statstart(nfsv3to4op[nd->nd_procnum], /*now*/ NULL);
    544  1.1.1.1.10.3  jdolecek 		nfsrvd_statend(nfsv3to4op[nd->nd_procnum], /*bytes*/ 0,
    545  1.1.1.1.10.3  jdolecek 		   /*now*/ NULL, /*then*/ NULL);
    546  1.1.1.1.10.2       tls 		if (mp != NULL && nfs_writerpc[nd->nd_procnum] != 0)
    547  1.1.1.1.10.2       tls 			vn_finished_write(mp);
    548  1.1.1.1.10.2       tls 		goto out;
    549  1.1.1.1.10.2       tls 	}
    550  1.1.1.1.10.2       tls 
    551  1.1.1.1.10.2       tls 	/*
    552  1.1.1.1.10.2       tls 	 * Now the procedure can be performed. For V4, nfsrvd_compound()
    553  1.1.1.1.10.2       tls 	 * works through the sub-rpcs, otherwise just call the procedure.
    554  1.1.1.1.10.2       tls 	 * The procedures are in three groups with different arguments.
    555  1.1.1.1.10.2       tls 	 * The group is indicated by the value in nfs_retfh[].
    556  1.1.1.1.10.2       tls 	 */
    557  1.1.1.1.10.2       tls 	if (nd->nd_flag & ND_NFSV4) {
    558  1.1.1.1.10.3  jdolecek 		nfsrvd_compound(nd, isdgram, tag, taglen, minorvers, p);
    559  1.1.1.1.10.2       tls 	} else {
    560  1.1.1.1.10.3  jdolecek 		struct bintime start_time;
    561  1.1.1.1.10.3  jdolecek 
    562  1.1.1.1.10.3  jdolecek 		binuptime(&start_time);
    563  1.1.1.1.10.3  jdolecek 		nfsrvd_statstart(nfsv3to4op[nd->nd_procnum], &start_time);
    564  1.1.1.1.10.3  jdolecek 
    565  1.1.1.1.10.2       tls 		if (nfs_retfh[nd->nd_procnum] == 1) {
    566  1.1.1.1.10.2       tls 			if (vp)
    567  1.1.1.1.10.2       tls 				NFSVOPUNLOCK(vp, 0);
    568  1.1.1.1.10.2       tls 			error = (*(nfsrv3_procs1[nd->nd_procnum]))(nd, isdgram,
    569  1.1.1.1.10.2       tls 			    vp, NULL, (fhandle_t *)fh.nfsrvfh_data, p, &nes);
    570  1.1.1.1.10.2       tls 		} else if (nfs_retfh[nd->nd_procnum] == 2) {
    571  1.1.1.1.10.2       tls 			error = (*(nfsrv3_procs2[nd->nd_procnum]))(nd, isdgram,
    572  1.1.1.1.10.2       tls 			    vp, NULL, p, &nes, NULL);
    573  1.1.1.1.10.2       tls 		} else {
    574  1.1.1.1.10.2       tls 			error = (*(nfsrv3_procs0[nd->nd_procnum]))(nd, isdgram,
    575  1.1.1.1.10.2       tls 			    vp, p, &nes);
    576  1.1.1.1.10.2       tls 		}
    577  1.1.1.1.10.2       tls 		if (mp != NULL && nfs_writerpc[nd->nd_procnum] != 0)
    578  1.1.1.1.10.2       tls 			vn_finished_write(mp);
    579  1.1.1.1.10.3  jdolecek 
    580  1.1.1.1.10.3  jdolecek 		nfsrvd_statend(nfsv3to4op[nd->nd_procnum], /*bytes*/ 0,
    581  1.1.1.1.10.3  jdolecek 		    /*now*/ NULL, /*then*/ &start_time);
    582  1.1.1.1.10.2       tls 	}
    583  1.1.1.1.10.2       tls 	if (error) {
    584  1.1.1.1.10.2       tls 		if (error != EBADRPC)
    585  1.1.1.1.10.2       tls 			printf("nfs dorpc err2=%d\n", error);
    586  1.1.1.1.10.2       tls 		nd->nd_repstat = NFSERR_GARBAGE;
    587  1.1.1.1.10.2       tls 	}
    588  1.1.1.1.10.2       tls 	*nd->nd_errp = nfsd_errmap(nd);
    589  1.1.1.1.10.2       tls 
    590  1.1.1.1.10.2       tls 	/*
    591  1.1.1.1.10.2       tls 	 * Don't cache certain reply status values.
    592  1.1.1.1.10.2       tls 	 */
    593  1.1.1.1.10.2       tls 	if (nd->nd_repstat && (nd->nd_flag & ND_SAVEREPLY) &&
    594  1.1.1.1.10.2       tls 	    (nd->nd_repstat == NFSERR_GARBAGE ||
    595  1.1.1.1.10.2       tls 	     nd->nd_repstat == NFSERR_BADXDR ||
    596  1.1.1.1.10.2       tls 	     nd->nd_repstat == NFSERR_MOVED ||
    597  1.1.1.1.10.2       tls 	     nd->nd_repstat == NFSERR_DELAY ||
    598  1.1.1.1.10.2       tls 	     nd->nd_repstat == NFSERR_BADSEQID ||
    599  1.1.1.1.10.2       tls 	     nd->nd_repstat == NFSERR_RESOURCE ||
    600  1.1.1.1.10.2       tls 	     nd->nd_repstat == NFSERR_SERVERFAULT ||
    601  1.1.1.1.10.2       tls 	     nd->nd_repstat == NFSERR_STALECLIENTID ||
    602  1.1.1.1.10.2       tls 	     nd->nd_repstat == NFSERR_STALESTATEID ||
    603  1.1.1.1.10.2       tls 	     nd->nd_repstat == NFSERR_OLDSTATEID ||
    604  1.1.1.1.10.2       tls 	     nd->nd_repstat == NFSERR_BADSTATEID ||
    605  1.1.1.1.10.2       tls 	     nd->nd_repstat == NFSERR_GRACE ||
    606  1.1.1.1.10.2       tls 	     nd->nd_repstat == NFSERR_NOGRACE))
    607  1.1.1.1.10.2       tls 		nd->nd_flag &= ~ND_SAVEREPLY;
    608  1.1.1.1.10.2       tls 
    609  1.1.1.1.10.2       tls out:
    610  1.1.1.1.10.2       tls 	NFSEXITCODE2(0, nd);
    611  1.1.1.1.10.2       tls }
    612  1.1.1.1.10.2       tls 
    613  1.1.1.1.10.2       tls /*
    614  1.1.1.1.10.2       tls  * Breaks down a compound RPC request and calls the server routines for
    615  1.1.1.1.10.2       tls  * the subprocedures.
    616  1.1.1.1.10.2       tls  * Some suboperations are performed directly here to simplify file handle<-->
    617  1.1.1.1.10.2       tls  * vnode pointer handling.
    618  1.1.1.1.10.2       tls  */
    619  1.1.1.1.10.2       tls static void
    620  1.1.1.1.10.3  jdolecek nfsrvd_compound(struct nfsrv_descript *nd, int isdgram, u_char *tag,
    621  1.1.1.1.10.3  jdolecek     int taglen, u_int32_t minorvers, NFSPROC_T *p)
    622  1.1.1.1.10.2       tls {
    623  1.1.1.1.10.3  jdolecek 	int i, lktype, op, op0 = 0, statsinprog = 0;
    624  1.1.1.1.10.2       tls 	u_int32_t *tl;
    625  1.1.1.1.10.2       tls 	struct nfsclient *clp, *nclp;
    626  1.1.1.1.10.3  jdolecek 	int numops, error = 0, igotlock;
    627  1.1.1.1.10.3  jdolecek 	u_int32_t retops = 0, *retopsp = NULL, *repp;
    628  1.1.1.1.10.2       tls 	vnode_t vp, nvp, savevp;
    629  1.1.1.1.10.2       tls 	struct nfsrvfh fh;
    630  1.1.1.1.10.2       tls 	mount_t new_mp, temp_mp = NULL;
    631  1.1.1.1.10.2       tls 	struct ucred *credanon;
    632  1.1.1.1.10.2       tls 	struct nfsexstuff nes, vpnes, savevpnes;
    633  1.1.1.1.10.2       tls 	fsid_t cur_fsid, save_fsid;
    634  1.1.1.1.10.2       tls 	static u_int64_t compref = 0;
    635  1.1.1.1.10.3  jdolecek 	struct bintime start_time;
    636  1.1.1.1.10.2       tls 
    637  1.1.1.1.10.2       tls 	NFSVNO_EXINIT(&vpnes);
    638  1.1.1.1.10.2       tls 	NFSVNO_EXINIT(&savevpnes);
    639  1.1.1.1.10.2       tls 	/*
    640  1.1.1.1.10.2       tls 	 * Put the seq# of the current compound RPC in nfsrv_descript.
    641  1.1.1.1.10.2       tls 	 * (This is used by nfsrv_checkgetattr(), to see if the write
    642  1.1.1.1.10.2       tls 	 *  delegation was created by the same compound RPC as the one
    643  1.1.1.1.10.2       tls 	 *  with that Getattr in it.)
    644  1.1.1.1.10.2       tls 	 * Don't worry about the 64bit number wrapping around. It ain't
    645  1.1.1.1.10.2       tls 	 * gonna happen before this server gets shut down/rebooted.
    646  1.1.1.1.10.2       tls 	 */
    647  1.1.1.1.10.2       tls 	nd->nd_compref = compref++;
    648  1.1.1.1.10.2       tls 
    649  1.1.1.1.10.2       tls 	/*
    650  1.1.1.1.10.2       tls 	 * Check for and optionally get a lock on the root. This lock means that
    651  1.1.1.1.10.2       tls 	 * no nfsd will be fiddling with the V4 file system and state stuff. It
    652  1.1.1.1.10.2       tls 	 * is required when the V4 root is being changed, the stable storage
    653  1.1.1.1.10.2       tls 	 * restart file is being updated, or callbacks are being done.
    654  1.1.1.1.10.2       tls 	 * When any of the nfsd are processing an NFSv4 compound RPC, they must
    655  1.1.1.1.10.2       tls 	 * either hold a reference count (nfs_usecnt) or the lock. When
    656  1.1.1.1.10.2       tls 	 * nfsrv_unlock() is called to release the lock, it can optionally
    657  1.1.1.1.10.2       tls 	 * also get a reference count, which saves the need for a call to
    658  1.1.1.1.10.2       tls 	 * nfsrv_getref() after nfsrv_unlock().
    659  1.1.1.1.10.2       tls 	 */
    660  1.1.1.1.10.2       tls 	/*
    661  1.1.1.1.10.2       tls 	 * First, check to see if we need to wait for an update lock.
    662  1.1.1.1.10.2       tls 	 */
    663  1.1.1.1.10.2       tls 	igotlock = 0;
    664  1.1.1.1.10.2       tls 	NFSLOCKV4ROOTMUTEX();
    665  1.1.1.1.10.2       tls 	if (nfsrv_stablefirst.nsf_flags & NFSNSF_NEEDLOCK)
    666  1.1.1.1.10.2       tls 		igotlock = nfsv4_lock(&nfsv4rootfs_lock, 1, NULL,
    667  1.1.1.1.10.2       tls 		    NFSV4ROOTLOCKMUTEXPTR, NULL);
    668  1.1.1.1.10.2       tls 	else
    669  1.1.1.1.10.2       tls 		igotlock = nfsv4_lock(&nfsv4rootfs_lock, 0, NULL,
    670  1.1.1.1.10.2       tls 		    NFSV4ROOTLOCKMUTEXPTR, NULL);
    671  1.1.1.1.10.2       tls 	NFSUNLOCKV4ROOTMUTEX();
    672  1.1.1.1.10.2       tls 	if (igotlock) {
    673  1.1.1.1.10.2       tls 		/*
    674  1.1.1.1.10.2       tls 		 * If I got the lock, I can update the stable storage file.
    675  1.1.1.1.10.2       tls 		 * Done when the grace period is over or a client has long
    676  1.1.1.1.10.2       tls 		 * since expired.
    677  1.1.1.1.10.2       tls 		 */
    678  1.1.1.1.10.2       tls 		nfsrv_stablefirst.nsf_flags &= ~NFSNSF_NEEDLOCK;
    679  1.1.1.1.10.2       tls 		if ((nfsrv_stablefirst.nsf_flags &
    680  1.1.1.1.10.2       tls 		    (NFSNSF_GRACEOVER | NFSNSF_UPDATEDONE)) == NFSNSF_GRACEOVER)
    681  1.1.1.1.10.2       tls 			nfsrv_updatestable(p);
    682  1.1.1.1.10.2       tls 
    683  1.1.1.1.10.2       tls 		/*
    684  1.1.1.1.10.2       tls 		 * If at least one client has long since expired, search
    685  1.1.1.1.10.2       tls 		 * the client list for them, write a REVOKE record on the
    686  1.1.1.1.10.2       tls 		 * stable storage file and then remove them from the client
    687  1.1.1.1.10.2       tls 		 * list.
    688  1.1.1.1.10.2       tls 		 */
    689  1.1.1.1.10.2       tls 		if (nfsrv_stablefirst.nsf_flags & NFSNSF_EXPIREDCLIENT) {
    690  1.1.1.1.10.2       tls 			nfsrv_stablefirst.nsf_flags &= ~NFSNSF_EXPIREDCLIENT;
    691  1.1.1.1.10.3  jdolecek 			for (i = 0; i < nfsrv_clienthashsize; i++) {
    692  1.1.1.1.10.2       tls 			    LIST_FOREACH_SAFE(clp, &nfsclienthash[i], lc_hash,
    693  1.1.1.1.10.2       tls 				nclp) {
    694  1.1.1.1.10.2       tls 				if (clp->lc_flags & LCL_EXPIREIT) {
    695  1.1.1.1.10.2       tls 				    if (!LIST_EMPTY(&clp->lc_open) ||
    696  1.1.1.1.10.2       tls 					!LIST_EMPTY(&clp->lc_deleg))
    697  1.1.1.1.10.2       tls 					nfsrv_writestable(clp->lc_id,
    698  1.1.1.1.10.2       tls 					    clp->lc_idlen, NFSNST_REVOKE, p);
    699  1.1.1.1.10.2       tls 				    nfsrv_cleanclient(clp, p);
    700  1.1.1.1.10.2       tls 				    nfsrv_freedeleglist(&clp->lc_deleg);
    701  1.1.1.1.10.2       tls 				    nfsrv_freedeleglist(&clp->lc_olddeleg);
    702  1.1.1.1.10.2       tls 				    LIST_REMOVE(clp, lc_hash);
    703  1.1.1.1.10.2       tls 				    nfsrv_zapclient(clp, p);
    704  1.1.1.1.10.2       tls 				}
    705  1.1.1.1.10.2       tls 			    }
    706  1.1.1.1.10.2       tls 			}
    707  1.1.1.1.10.2       tls 		}
    708  1.1.1.1.10.2       tls 		NFSLOCKV4ROOTMUTEX();
    709  1.1.1.1.10.2       tls 		nfsv4_unlock(&nfsv4rootfs_lock, 1);
    710  1.1.1.1.10.2       tls 		NFSUNLOCKV4ROOTMUTEX();
    711  1.1.1.1.10.2       tls 	} else {
    712  1.1.1.1.10.2       tls 		/*
    713  1.1.1.1.10.2       tls 		 * If we didn't get the lock, we need to get a refcnt,
    714  1.1.1.1.10.2       tls 		 * which also checks for and waits for the lock.
    715  1.1.1.1.10.2       tls 		 */
    716  1.1.1.1.10.2       tls 		NFSLOCKV4ROOTMUTEX();
    717  1.1.1.1.10.2       tls 		nfsv4_getref(&nfsv4rootfs_lock, NULL,
    718  1.1.1.1.10.2       tls 		    NFSV4ROOTLOCKMUTEXPTR, NULL);
    719  1.1.1.1.10.2       tls 		NFSUNLOCKV4ROOTMUTEX();
    720  1.1.1.1.10.2       tls 	}
    721  1.1.1.1.10.2       tls 
    722  1.1.1.1.10.2       tls 	/*
    723  1.1.1.1.10.2       tls 	 * If flagged, search for open owners that haven't had any opens
    724  1.1.1.1.10.2       tls 	 * for a long time.
    725  1.1.1.1.10.2       tls 	 */
    726  1.1.1.1.10.2       tls 	if (nfsrv_stablefirst.nsf_flags & NFSNSF_NOOPENS) {
    727  1.1.1.1.10.2       tls 		nfsrv_throwawayopens(p);
    728  1.1.1.1.10.2       tls 	}
    729  1.1.1.1.10.2       tls 
    730  1.1.1.1.10.2       tls 	savevp = vp = NULL;
    731  1.1.1.1.10.2       tls 	save_fsid.val[0] = save_fsid.val[1] = 0;
    732  1.1.1.1.10.2       tls 	cur_fsid.val[0] = cur_fsid.val[1] = 0;
    733  1.1.1.1.10.3  jdolecek 
    734  1.1.1.1.10.3  jdolecek 	/* If taglen < 0, there was a parsing error in nfsd_getminorvers(). */
    735  1.1.1.1.10.2       tls 	if (taglen < 0) {
    736  1.1.1.1.10.2       tls 		error = EBADRPC;
    737  1.1.1.1.10.2       tls 		goto nfsmout;
    738  1.1.1.1.10.2       tls 	}
    739  1.1.1.1.10.3  jdolecek 
    740  1.1.1.1.10.2       tls 	(void) nfsm_strtom(nd, tag, taglen);
    741  1.1.1.1.10.2       tls 	NFSM_BUILD(retopsp, u_int32_t *, NFSX_UNSIGNED);
    742  1.1.1.1.10.3  jdolecek 	NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
    743  1.1.1.1.10.3  jdolecek 	if (minorvers != NFSV4_MINORVERSION && minorvers != NFSV41_MINORVERSION)
    744  1.1.1.1.10.2       tls 		nd->nd_repstat = NFSERR_MINORVERMISMATCH;
    745  1.1.1.1.10.2       tls 	if (nd->nd_repstat)
    746  1.1.1.1.10.2       tls 		numops = 0;
    747  1.1.1.1.10.2       tls 	else
    748  1.1.1.1.10.2       tls 		numops = fxdr_unsigned(int, *tl);
    749  1.1.1.1.10.2       tls 	/*
    750  1.1.1.1.10.2       tls 	 * Loop around doing the sub ops.
    751  1.1.1.1.10.2       tls 	 * vp - is an unlocked vnode pointer for the CFH
    752  1.1.1.1.10.2       tls 	 * savevp - is an unlocked vnode pointer for the SAVEDFH
    753  1.1.1.1.10.2       tls 	 * (at some future date, it might turn out to be more appropriate
    754  1.1.1.1.10.2       tls 	 *  to keep the file handles instead of vnode pointers?)
    755  1.1.1.1.10.2       tls 	 * savevpnes and vpnes - are the export flags for the above.
    756  1.1.1.1.10.2       tls 	 */
    757  1.1.1.1.10.2       tls 	for (i = 0; i < numops; i++) {
    758  1.1.1.1.10.2       tls 		NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
    759  1.1.1.1.10.2       tls 		NFSM_BUILD(repp, u_int32_t *, 2 * NFSX_UNSIGNED);
    760  1.1.1.1.10.2       tls 		*repp = *tl;
    761  1.1.1.1.10.2       tls 		op = fxdr_unsigned(int, *tl);
    762  1.1.1.1.10.3  jdolecek 		NFSD_DEBUG(4, "op=%d\n", op);
    763  1.1.1.1.10.3  jdolecek 
    764  1.1.1.1.10.3  jdolecek 		binuptime(&start_time);
    765  1.1.1.1.10.3  jdolecek 		nfsrvd_statstart(op, &start_time);
    766  1.1.1.1.10.3  jdolecek 		statsinprog = 1;
    767  1.1.1.1.10.3  jdolecek 
    768  1.1.1.1.10.3  jdolecek 		if (op < NFSV4OP_ACCESS ||
    769  1.1.1.1.10.3  jdolecek 		    (op >= NFSV4OP_NOPS && (nd->nd_flag & ND_NFSV41) == 0) ||
    770  1.1.1.1.10.3  jdolecek 		    (op >= NFSV41_NOPS && (nd->nd_flag & ND_NFSV41) != 0)) {
    771  1.1.1.1.10.2       tls 			nd->nd_repstat = NFSERR_OPILLEGAL;
    772  1.1.1.1.10.2       tls 			*repp++ = txdr_unsigned(NFSV4OP_OPILLEGAL);
    773  1.1.1.1.10.2       tls 			*repp = nfsd_errmap(nd);
    774  1.1.1.1.10.2       tls 			retops++;
    775  1.1.1.1.10.2       tls 			break;
    776  1.1.1.1.10.2       tls 		} else {
    777  1.1.1.1.10.2       tls 			repp++;
    778  1.1.1.1.10.2       tls 		}
    779  1.1.1.1.10.3  jdolecek 		if (i == 0)
    780  1.1.1.1.10.3  jdolecek 			op0 = op;
    781  1.1.1.1.10.3  jdolecek 		if (i == numops - 1)
    782  1.1.1.1.10.3  jdolecek 			nd->nd_flag |= ND_LASTOP;
    783  1.1.1.1.10.2       tls 
    784  1.1.1.1.10.2       tls 		/*
    785  1.1.1.1.10.2       tls 		 * Check for a referral on the current FH and, if so, return
    786  1.1.1.1.10.2       tls 		 * NFSERR_MOVED for all ops that allow it, except Getattr.
    787  1.1.1.1.10.2       tls 		 */
    788  1.1.1.1.10.2       tls 		if (vp != NULL && op != NFSV4OP_GETATTR &&
    789  1.1.1.1.10.2       tls 		    nfsv4root_getreferral(vp, NULL, 0) != NULL &&
    790  1.1.1.1.10.2       tls 		    nfsrv_errmoved(op)) {
    791  1.1.1.1.10.2       tls 			nd->nd_repstat = NFSERR_MOVED;
    792  1.1.1.1.10.2       tls 			*repp = nfsd_errmap(nd);
    793  1.1.1.1.10.2       tls 			retops++;
    794  1.1.1.1.10.2       tls 			break;
    795  1.1.1.1.10.2       tls 		}
    796  1.1.1.1.10.2       tls 
    797  1.1.1.1.10.3  jdolecek 		/*
    798  1.1.1.1.10.3  jdolecek 		 * For NFSv4.1, check for a Sequence Operation being first
    799  1.1.1.1.10.3  jdolecek 		 * or one of the other allowed operations by itself.
    800  1.1.1.1.10.3  jdolecek 		 */
    801  1.1.1.1.10.3  jdolecek 		if ((nd->nd_flag & ND_NFSV41) != 0) {
    802  1.1.1.1.10.3  jdolecek 			if (i != 0 && op == NFSV4OP_SEQUENCE)
    803  1.1.1.1.10.3  jdolecek 				nd->nd_repstat = NFSERR_SEQUENCEPOS;
    804  1.1.1.1.10.3  jdolecek 			else if (i == 0 && op != NFSV4OP_SEQUENCE &&
    805  1.1.1.1.10.3  jdolecek 			    op != NFSV4OP_EXCHANGEID &&
    806  1.1.1.1.10.3  jdolecek 			    op != NFSV4OP_CREATESESSION &&
    807  1.1.1.1.10.3  jdolecek 			    op != NFSV4OP_BINDCONNTOSESS &&
    808  1.1.1.1.10.3  jdolecek 			    op != NFSV4OP_DESTROYCLIENTID &&
    809  1.1.1.1.10.3  jdolecek 			    op != NFSV4OP_DESTROYSESSION)
    810  1.1.1.1.10.3  jdolecek 				nd->nd_repstat = NFSERR_OPNOTINSESS;
    811  1.1.1.1.10.3  jdolecek 			else if (i != 0 && op0 != NFSV4OP_SEQUENCE)
    812  1.1.1.1.10.3  jdolecek 				nd->nd_repstat = NFSERR_NOTONLYOP;
    813  1.1.1.1.10.3  jdolecek 			if (nd->nd_repstat != 0) {
    814  1.1.1.1.10.3  jdolecek 				*repp = nfsd_errmap(nd);
    815  1.1.1.1.10.3  jdolecek 				retops++;
    816  1.1.1.1.10.3  jdolecek 				break;
    817  1.1.1.1.10.3  jdolecek 			}
    818  1.1.1.1.10.3  jdolecek 		}
    819  1.1.1.1.10.3  jdolecek 
    820  1.1.1.1.10.2       tls 		nd->nd_procnum = op;
    821  1.1.1.1.10.2       tls 		/*
    822  1.1.1.1.10.2       tls 		 * If over flood level, reply NFSERR_RESOURCE, if at the first
    823  1.1.1.1.10.2       tls 		 * Op. (Since a client recovery from NFSERR_RESOURCE can get
    824  1.1.1.1.10.2       tls 		 * really nasty for certain Op sequences, I'll play it safe
    825  1.1.1.1.10.2       tls 		 * and only return the error at the beginning.) The cache
    826  1.1.1.1.10.2       tls 		 * will still function over flood level, but uses lots of
    827  1.1.1.1.10.2       tls 		 * mbufs.)
    828  1.1.1.1.10.2       tls 		 * If nfsrv_mallocmget_limit() returns True, the system is near
    829  1.1.1.1.10.2       tls 		 * to its limit for memory that malloc()/mget() can allocate.
    830  1.1.1.1.10.2       tls 		 */
    831  1.1.1.1.10.3  jdolecek 		if (i == 0 && (nd->nd_rp == NULL ||
    832  1.1.1.1.10.3  jdolecek 		    nd->nd_rp->rc_refcnt == 0) &&
    833  1.1.1.1.10.2       tls 		    (nfsrv_mallocmget_limit() ||
    834  1.1.1.1.10.2       tls 		     nfsrc_tcpsavedreplies > nfsrc_floodlevel)) {
    835  1.1.1.1.10.3  jdolecek 			if (nfsrc_tcpsavedreplies > nfsrc_floodlevel)
    836  1.1.1.1.10.3  jdolecek 				printf("nfsd server cache flooded, try "
    837  1.1.1.1.10.3  jdolecek 				    "increasing vfs.nfsd.tcphighwater\n");
    838  1.1.1.1.10.2       tls 			nd->nd_repstat = NFSERR_RESOURCE;
    839  1.1.1.1.10.2       tls 			*repp = nfsd_errmap(nd);
    840  1.1.1.1.10.2       tls 			if (op == NFSV4OP_SETATTR) {
    841  1.1.1.1.10.2       tls 				/*
    842  1.1.1.1.10.2       tls 				 * Setattr replies require a bitmap.
    843  1.1.1.1.10.2       tls 				 * even for errors like these.
    844  1.1.1.1.10.2       tls 				 */
    845  1.1.1.1.10.2       tls 				NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED);
    846  1.1.1.1.10.2       tls 				*tl = 0;
    847  1.1.1.1.10.2       tls 			}
    848  1.1.1.1.10.2       tls 			retops++;
    849  1.1.1.1.10.2       tls 			break;
    850  1.1.1.1.10.2       tls 		}
    851  1.1.1.1.10.2       tls 		if (nfsv4_opflag[op].savereply)
    852  1.1.1.1.10.2       tls 			nd->nd_flag |= ND_SAVEREPLY;
    853  1.1.1.1.10.2       tls 		switch (op) {
    854  1.1.1.1.10.2       tls 		case NFSV4OP_PUTFH:
    855  1.1.1.1.10.2       tls 			error = nfsrv_mtofh(nd, &fh);
    856  1.1.1.1.10.2       tls 			if (error)
    857  1.1.1.1.10.2       tls 				goto nfsmout;
    858  1.1.1.1.10.2       tls 			if (!nd->nd_repstat)
    859  1.1.1.1.10.2       tls 				nfsd_fhtovp(nd, &fh, LK_SHARED, &nvp, &nes,
    860  1.1.1.1.10.2       tls 				    NULL, 0, p);
    861  1.1.1.1.10.2       tls 			/* For now, allow this for non-export FHs */
    862  1.1.1.1.10.2       tls 			if (!nd->nd_repstat) {
    863  1.1.1.1.10.2       tls 				if (vp)
    864  1.1.1.1.10.2       tls 					vrele(vp);
    865  1.1.1.1.10.2       tls 				vp = nvp;
    866  1.1.1.1.10.2       tls 				cur_fsid = vp->v_mount->mnt_stat.f_fsid;
    867  1.1.1.1.10.2       tls 				NFSVOPUNLOCK(vp, 0);
    868  1.1.1.1.10.2       tls 				vpnes = nes;
    869  1.1.1.1.10.2       tls 			}
    870  1.1.1.1.10.2       tls 			break;
    871  1.1.1.1.10.2       tls 		case NFSV4OP_PUTPUBFH:
    872  1.1.1.1.10.2       tls 			if (nfs_pubfhset)
    873  1.1.1.1.10.2       tls 			    nfsd_fhtovp(nd, &nfs_pubfh, LK_SHARED, &nvp,
    874  1.1.1.1.10.2       tls 				&nes, NULL, 0, p);
    875  1.1.1.1.10.2       tls 			else
    876  1.1.1.1.10.2       tls 			    nd->nd_repstat = NFSERR_NOFILEHANDLE;
    877  1.1.1.1.10.2       tls 			if (!nd->nd_repstat) {
    878  1.1.1.1.10.2       tls 				if (vp)
    879  1.1.1.1.10.2       tls 					vrele(vp);
    880  1.1.1.1.10.2       tls 				vp = nvp;
    881  1.1.1.1.10.2       tls 				cur_fsid = vp->v_mount->mnt_stat.f_fsid;
    882  1.1.1.1.10.2       tls 				NFSVOPUNLOCK(vp, 0);
    883  1.1.1.1.10.2       tls 				vpnes = nes;
    884  1.1.1.1.10.2       tls 			}
    885  1.1.1.1.10.2       tls 			break;
    886  1.1.1.1.10.2       tls 		case NFSV4OP_PUTROOTFH:
    887  1.1.1.1.10.2       tls 			if (nfs_rootfhset) {
    888  1.1.1.1.10.2       tls 				nfsd_fhtovp(nd, &nfs_rootfh, LK_SHARED, &nvp,
    889  1.1.1.1.10.2       tls 				    &nes, NULL, 0, p);
    890  1.1.1.1.10.2       tls 				if (!nd->nd_repstat) {
    891  1.1.1.1.10.2       tls 					if (vp)
    892  1.1.1.1.10.2       tls 						vrele(vp);
    893  1.1.1.1.10.2       tls 					vp = nvp;
    894  1.1.1.1.10.2       tls 					cur_fsid = vp->v_mount->mnt_stat.f_fsid;
    895  1.1.1.1.10.2       tls 					NFSVOPUNLOCK(vp, 0);
    896  1.1.1.1.10.2       tls 					vpnes = nes;
    897  1.1.1.1.10.2       tls 				}
    898  1.1.1.1.10.2       tls 			} else
    899  1.1.1.1.10.2       tls 				nd->nd_repstat = NFSERR_NOFILEHANDLE;
    900  1.1.1.1.10.2       tls 			break;
    901  1.1.1.1.10.2       tls 		case NFSV4OP_SAVEFH:
    902  1.1.1.1.10.2       tls 			if (vp && NFSVNO_EXPORTED(&vpnes)) {
    903  1.1.1.1.10.2       tls 				nd->nd_repstat = 0;
    904  1.1.1.1.10.2       tls 				/* If vp == savevp, a no-op */
    905  1.1.1.1.10.2       tls 				if (vp != savevp) {
    906  1.1.1.1.10.2       tls 					if (savevp)
    907  1.1.1.1.10.2       tls 						vrele(savevp);
    908  1.1.1.1.10.2       tls 					VREF(vp);
    909  1.1.1.1.10.2       tls 					savevp = vp;
    910  1.1.1.1.10.2       tls 					savevpnes = vpnes;
    911  1.1.1.1.10.2       tls 					save_fsid = cur_fsid;
    912  1.1.1.1.10.2       tls 				}
    913  1.1.1.1.10.2       tls 			} else {
    914  1.1.1.1.10.2       tls 				nd->nd_repstat = NFSERR_NOFILEHANDLE;
    915  1.1.1.1.10.2       tls 			}
    916  1.1.1.1.10.2       tls 			break;
    917  1.1.1.1.10.2       tls 		case NFSV4OP_RESTOREFH:
    918  1.1.1.1.10.2       tls 			if (savevp) {
    919  1.1.1.1.10.2       tls 				nd->nd_repstat = 0;
    920  1.1.1.1.10.2       tls 				/* If vp == savevp, a no-op */
    921  1.1.1.1.10.2       tls 				if (vp != savevp) {
    922  1.1.1.1.10.2       tls 					VREF(savevp);
    923  1.1.1.1.10.2       tls 					vrele(vp);
    924  1.1.1.1.10.2       tls 					vp = savevp;
    925  1.1.1.1.10.2       tls 					vpnes = savevpnes;
    926  1.1.1.1.10.2       tls 					cur_fsid = save_fsid;
    927  1.1.1.1.10.2       tls 				}
    928  1.1.1.1.10.2       tls 			} else {
    929  1.1.1.1.10.2       tls 				nd->nd_repstat = NFSERR_RESTOREFH;
    930  1.1.1.1.10.2       tls 			}
    931  1.1.1.1.10.2       tls 			break;
    932  1.1.1.1.10.2       tls 		default:
    933  1.1.1.1.10.2       tls 		    /*
    934  1.1.1.1.10.2       tls 		     * Allow a Lookup, Getattr, GetFH, Secinfo on an
    935  1.1.1.1.10.2       tls 		     * non-exported directory if
    936  1.1.1.1.10.2       tls 		     * nfs_rootfhset. Do I need to allow any other Ops?
    937  1.1.1.1.10.2       tls 		     * (You can only have a non-exported vpnes if
    938  1.1.1.1.10.2       tls 		     *  nfs_rootfhset is true. See nfsd_fhtovp())
    939  1.1.1.1.10.2       tls 		     * Allow AUTH_SYS to be used for file systems
    940  1.1.1.1.10.2       tls 		     * exported GSS only for certain Ops, to allow
    941  1.1.1.1.10.2       tls 		     * clients to do mounts more easily.
    942  1.1.1.1.10.2       tls 		     */
    943  1.1.1.1.10.2       tls 		    if (nfsv4_opflag[op].needscfh && vp) {
    944  1.1.1.1.10.2       tls 			if (!NFSVNO_EXPORTED(&vpnes) &&
    945  1.1.1.1.10.2       tls 			    op != NFSV4OP_LOOKUP &&
    946  1.1.1.1.10.2       tls 			    op != NFSV4OP_GETATTR &&
    947  1.1.1.1.10.2       tls 			    op != NFSV4OP_GETFH &&
    948  1.1.1.1.10.2       tls 			    op != NFSV4OP_ACCESS &&
    949  1.1.1.1.10.2       tls 			    op != NFSV4OP_READLINK &&
    950  1.1.1.1.10.2       tls 			    op != NFSV4OP_SECINFO)
    951  1.1.1.1.10.2       tls 				nd->nd_repstat = NFSERR_NOFILEHANDLE;
    952  1.1.1.1.10.2       tls 			else if (nfsvno_testexp(nd, &vpnes) &&
    953  1.1.1.1.10.2       tls 			    op != NFSV4OP_LOOKUP &&
    954  1.1.1.1.10.2       tls 			    op != NFSV4OP_GETFH &&
    955  1.1.1.1.10.2       tls 			    op != NFSV4OP_GETATTR &&
    956  1.1.1.1.10.2       tls 			    op != NFSV4OP_SECINFO)
    957  1.1.1.1.10.2       tls 				nd->nd_repstat = NFSERR_WRONGSEC;
    958  1.1.1.1.10.2       tls 			if (nd->nd_repstat) {
    959  1.1.1.1.10.2       tls 				if (op == NFSV4OP_SETATTR) {
    960  1.1.1.1.10.2       tls 				    /*
    961  1.1.1.1.10.2       tls 				     * Setattr reply requires a bitmap
    962  1.1.1.1.10.2       tls 				     * even for errors like these.
    963  1.1.1.1.10.2       tls 				     */
    964  1.1.1.1.10.2       tls 				    NFSM_BUILD(tl, u_int32_t *,
    965  1.1.1.1.10.2       tls 					NFSX_UNSIGNED);
    966  1.1.1.1.10.2       tls 				    *tl = 0;
    967  1.1.1.1.10.2       tls 				}
    968  1.1.1.1.10.2       tls 				break;
    969  1.1.1.1.10.2       tls 			}
    970  1.1.1.1.10.2       tls 		    }
    971  1.1.1.1.10.2       tls 		    if (nfsv4_opflag[op].retfh == 1) {
    972  1.1.1.1.10.2       tls 			if (!vp) {
    973  1.1.1.1.10.2       tls 				nd->nd_repstat = NFSERR_NOFILEHANDLE;
    974  1.1.1.1.10.2       tls 				break;
    975  1.1.1.1.10.2       tls 			}
    976  1.1.1.1.10.2       tls 			VREF(vp);
    977  1.1.1.1.10.2       tls 			if (nfsv4_opflag[op].modifyfs)
    978  1.1.1.1.10.2       tls 				vn_start_write(vp, &temp_mp, V_WAIT);
    979  1.1.1.1.10.2       tls 			error = (*(nfsrv4_ops1[op]))(nd, isdgram, vp,
    980  1.1.1.1.10.2       tls 			    &nvp, (fhandle_t *)fh.nfsrvfh_data, p, &vpnes);
    981  1.1.1.1.10.2       tls 			if (!error && !nd->nd_repstat) {
    982  1.1.1.1.10.2       tls 			    if (op == NFSV4OP_LOOKUP || op == NFSV4OP_LOOKUPP) {
    983  1.1.1.1.10.2       tls 				new_mp = nvp->v_mount;
    984  1.1.1.1.10.2       tls 				if (cur_fsid.val[0] !=
    985  1.1.1.1.10.2       tls 				    new_mp->mnt_stat.f_fsid.val[0] ||
    986  1.1.1.1.10.2       tls 				    cur_fsid.val[1] !=
    987  1.1.1.1.10.2       tls 				    new_mp->mnt_stat.f_fsid.val[1]) {
    988  1.1.1.1.10.2       tls 				    /* crossed a server mount point */
    989  1.1.1.1.10.2       tls 				    nd->nd_repstat = nfsvno_checkexp(new_mp,
    990  1.1.1.1.10.2       tls 					nd->nd_nam, &nes, &credanon);
    991  1.1.1.1.10.2       tls 				    if (!nd->nd_repstat)
    992  1.1.1.1.10.2       tls 					nd->nd_repstat = nfsd_excred(nd,
    993  1.1.1.1.10.2       tls 					    &nes, credanon);
    994  1.1.1.1.10.2       tls 				    if (credanon != NULL)
    995  1.1.1.1.10.2       tls 					crfree(credanon);
    996  1.1.1.1.10.2       tls 				    if (!nd->nd_repstat) {
    997  1.1.1.1.10.2       tls 					vpnes = nes;
    998  1.1.1.1.10.2       tls 					cur_fsid = new_mp->mnt_stat.f_fsid;
    999  1.1.1.1.10.2       tls 				    }
   1000  1.1.1.1.10.2       tls 				}
   1001  1.1.1.1.10.2       tls 				/* Lookup ops return a locked vnode */
   1002  1.1.1.1.10.2       tls 				NFSVOPUNLOCK(nvp, 0);
   1003  1.1.1.1.10.2       tls 			    }
   1004  1.1.1.1.10.2       tls 			    if (!nd->nd_repstat) {
   1005  1.1.1.1.10.2       tls 				    vrele(vp);
   1006  1.1.1.1.10.2       tls 				    vp = nvp;
   1007  1.1.1.1.10.2       tls 			    } else
   1008  1.1.1.1.10.2       tls 				    vrele(nvp);
   1009  1.1.1.1.10.2       tls 			}
   1010  1.1.1.1.10.2       tls 			if (nfsv4_opflag[op].modifyfs)
   1011  1.1.1.1.10.2       tls 				vn_finished_write(temp_mp);
   1012  1.1.1.1.10.2       tls 		    } else if (nfsv4_opflag[op].retfh == 2) {
   1013  1.1.1.1.10.2       tls 			if (vp == NULL || savevp == NULL) {
   1014  1.1.1.1.10.2       tls 				nd->nd_repstat = NFSERR_NOFILEHANDLE;
   1015  1.1.1.1.10.2       tls 				break;
   1016  1.1.1.1.10.2       tls 			} else if (cur_fsid.val[0] != save_fsid.val[0] ||
   1017  1.1.1.1.10.2       tls 			    cur_fsid.val[1] != save_fsid.val[1]) {
   1018  1.1.1.1.10.2       tls 				nd->nd_repstat = NFSERR_XDEV;
   1019  1.1.1.1.10.2       tls 				break;
   1020  1.1.1.1.10.2       tls 			}
   1021  1.1.1.1.10.2       tls 			if (nfsv4_opflag[op].modifyfs)
   1022  1.1.1.1.10.2       tls 				vn_start_write(savevp, &temp_mp, V_WAIT);
   1023  1.1.1.1.10.2       tls 			if (NFSVOPLOCK(savevp, LK_EXCLUSIVE) == 0) {
   1024  1.1.1.1.10.2       tls 				VREF(vp);
   1025  1.1.1.1.10.2       tls 				VREF(savevp);
   1026  1.1.1.1.10.2       tls 				error = (*(nfsrv4_ops2[op]))(nd, isdgram,
   1027  1.1.1.1.10.2       tls 				    savevp, vp, p, &savevpnes, &vpnes);
   1028  1.1.1.1.10.2       tls 			} else
   1029  1.1.1.1.10.2       tls 				nd->nd_repstat = NFSERR_PERM;
   1030  1.1.1.1.10.2       tls 			if (nfsv4_opflag[op].modifyfs)
   1031  1.1.1.1.10.2       tls 				vn_finished_write(temp_mp);
   1032  1.1.1.1.10.2       tls 		    } else {
   1033  1.1.1.1.10.2       tls 			if (nfsv4_opflag[op].retfh != 0)
   1034  1.1.1.1.10.2       tls 				panic("nfsrvd_compound");
   1035  1.1.1.1.10.2       tls 			if (nfsv4_opflag[op].needscfh) {
   1036  1.1.1.1.10.2       tls 				if (vp != NULL) {
   1037  1.1.1.1.10.3  jdolecek 					lktype = nfsv4_opflag[op].lktype;
   1038  1.1.1.1.10.3  jdolecek 					if (nfsv4_opflag[op].modifyfs) {
   1039  1.1.1.1.10.2       tls 						vn_start_write(vp, &temp_mp,
   1040  1.1.1.1.10.2       tls 						    V_WAIT);
   1041  1.1.1.1.10.3  jdolecek 						if (op == NFSV4OP_WRITE &&
   1042  1.1.1.1.10.3  jdolecek 						    MNT_SHARED_WRITES(temp_mp))
   1043  1.1.1.1.10.3  jdolecek 							lktype = LK_SHARED;
   1044  1.1.1.1.10.3  jdolecek 					}
   1045  1.1.1.1.10.3  jdolecek 					if (NFSVOPLOCK(vp, lktype) == 0)
   1046  1.1.1.1.10.2       tls 						VREF(vp);
   1047  1.1.1.1.10.2       tls 					else
   1048  1.1.1.1.10.2       tls 						nd->nd_repstat = NFSERR_PERM;
   1049  1.1.1.1.10.2       tls 				} else {
   1050  1.1.1.1.10.2       tls 					nd->nd_repstat = NFSERR_NOFILEHANDLE;
   1051  1.1.1.1.10.2       tls 					if (op == NFSV4OP_SETATTR) {
   1052  1.1.1.1.10.2       tls 						/*
   1053  1.1.1.1.10.2       tls 						 * Setattr reply requires a
   1054  1.1.1.1.10.2       tls 						 * bitmap even for errors like
   1055  1.1.1.1.10.2       tls 						 * these.
   1056  1.1.1.1.10.2       tls 						 */
   1057  1.1.1.1.10.2       tls 						NFSM_BUILD(tl, u_int32_t *,
   1058  1.1.1.1.10.2       tls 						    NFSX_UNSIGNED);
   1059  1.1.1.1.10.2       tls 						*tl = 0;
   1060  1.1.1.1.10.2       tls 					}
   1061  1.1.1.1.10.2       tls 					break;
   1062  1.1.1.1.10.2       tls 				}
   1063  1.1.1.1.10.2       tls 				if (nd->nd_repstat == 0)
   1064  1.1.1.1.10.2       tls 					error = (*(nfsrv4_ops0[op]))(nd,
   1065  1.1.1.1.10.2       tls 					    isdgram, vp, p, &vpnes);
   1066  1.1.1.1.10.2       tls 				if (nfsv4_opflag[op].modifyfs)
   1067  1.1.1.1.10.2       tls 					vn_finished_write(temp_mp);
   1068  1.1.1.1.10.2       tls 			} else {
   1069  1.1.1.1.10.2       tls 				error = (*(nfsrv4_ops0[op]))(nd, isdgram,
   1070  1.1.1.1.10.2       tls 				    NULL, p, &vpnes);
   1071  1.1.1.1.10.2       tls 			}
   1072  1.1.1.1.10.2       tls 		    }
   1073  1.1.1.1.10.3  jdolecek 		}
   1074  1.1.1.1.10.2       tls 		if (error) {
   1075  1.1.1.1.10.2       tls 			if (error == EBADRPC || error == NFSERR_BADXDR) {
   1076  1.1.1.1.10.2       tls 				nd->nd_repstat = NFSERR_BADXDR;
   1077  1.1.1.1.10.2       tls 			} else {
   1078  1.1.1.1.10.2       tls 				nd->nd_repstat = error;
   1079  1.1.1.1.10.2       tls 				printf("nfsv4 comperr0=%d\n", error);
   1080  1.1.1.1.10.2       tls 			}
   1081  1.1.1.1.10.2       tls 			error = 0;
   1082  1.1.1.1.10.2       tls 		}
   1083  1.1.1.1.10.3  jdolecek 
   1084  1.1.1.1.10.3  jdolecek 		if (statsinprog != 0) {
   1085  1.1.1.1.10.3  jdolecek 			nfsrvd_statend(op, /*bytes*/ 0, /*now*/ NULL,
   1086  1.1.1.1.10.3  jdolecek 			    /*then*/ &start_time);
   1087  1.1.1.1.10.3  jdolecek 			statsinprog = 0;
   1088  1.1.1.1.10.3  jdolecek 		}
   1089  1.1.1.1.10.3  jdolecek 
   1090  1.1.1.1.10.2       tls 		retops++;
   1091  1.1.1.1.10.2       tls 		if (nd->nd_repstat) {
   1092  1.1.1.1.10.2       tls 			*repp = nfsd_errmap(nd);
   1093  1.1.1.1.10.2       tls 			break;
   1094  1.1.1.1.10.2       tls 		} else {
   1095  1.1.1.1.10.2       tls 			*repp = 0;	/* NFS4_OK */
   1096  1.1.1.1.10.2       tls 		}
   1097  1.1.1.1.10.2       tls 	}
   1098  1.1.1.1.10.2       tls nfsmout:
   1099  1.1.1.1.10.3  jdolecek 	if (statsinprog != 0) {
   1100  1.1.1.1.10.3  jdolecek 		nfsrvd_statend(op, /*bytes*/ 0, /*now*/ NULL,
   1101  1.1.1.1.10.3  jdolecek 		    /*then*/ &start_time);
   1102  1.1.1.1.10.3  jdolecek 		statsinprog = 0;
   1103  1.1.1.1.10.3  jdolecek 	}
   1104  1.1.1.1.10.2       tls 	if (error) {
   1105  1.1.1.1.10.2       tls 		if (error == EBADRPC || error == NFSERR_BADXDR)
   1106  1.1.1.1.10.2       tls 			nd->nd_repstat = NFSERR_BADXDR;
   1107  1.1.1.1.10.2       tls 		else
   1108  1.1.1.1.10.2       tls 			printf("nfsv4 comperr1=%d\n", error);
   1109  1.1.1.1.10.2       tls 	}
   1110  1.1.1.1.10.2       tls 	if (taglen == -1) {
   1111  1.1.1.1.10.2       tls 		NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
   1112  1.1.1.1.10.2       tls 		*tl++ = 0;
   1113  1.1.1.1.10.2       tls 		*tl = 0;
   1114  1.1.1.1.10.2       tls 	} else {
   1115  1.1.1.1.10.2       tls 		*retopsp = txdr_unsigned(retops);
   1116  1.1.1.1.10.2       tls 	}
   1117  1.1.1.1.10.2       tls 	if (vp)
   1118  1.1.1.1.10.2       tls 		vrele(vp);
   1119  1.1.1.1.10.2       tls 	if (savevp)
   1120  1.1.1.1.10.2       tls 		vrele(savevp);
   1121  1.1.1.1.10.2       tls 	NFSLOCKV4ROOTMUTEX();
   1122  1.1.1.1.10.2       tls 	nfsv4_relref(&nfsv4rootfs_lock);
   1123  1.1.1.1.10.2       tls 	NFSUNLOCKV4ROOTMUTEX();
   1124  1.1.1.1.10.2       tls 
   1125  1.1.1.1.10.2       tls 	NFSEXITCODE2(0, nd);
   1126  1.1.1.1.10.2       tls }
   1127