1*14414594SDavid du Colombier /* 2*14414594SDavid du Colombier * Copyright (c) 1989, 1993, 1995 3*14414594SDavid du Colombier * The Regents of the University of California. All rights reserved. 4*14414594SDavid du Colombier * 5*14414594SDavid du Colombier * This code is derived from software contributed to Berkeley by 6*14414594SDavid du Colombier * Rick Macklem at The University of Guelph. 7*14414594SDavid du Colombier * 8*14414594SDavid du Colombier * Redistribution and use in source and binary forms, with or without 9*14414594SDavid du Colombier * modification, are permitted provided that the following conditions 10*14414594SDavid du Colombier * are met: 11*14414594SDavid du Colombier * 1. Redistributions of source code must retain the above copyright 12*14414594SDavid du Colombier * notice, this list of conditions and the following disclaimer. 13*14414594SDavid du Colombier * 2. Redistributions in binary form must reproduce the above copyright 14*14414594SDavid du Colombier * notice, this list of conditions and the following disclaimer in the 15*14414594SDavid du Colombier * documentation and/or other materials provided with the distribution. 16*14414594SDavid du Colombier * 3. All advertising materials mentioning features or use of this software 17*14414594SDavid du Colombier * must display the following acknowledgement: 18*14414594SDavid du Colombier * This product includes software developed by the University of 19*14414594SDavid du Colombier * California, Berkeley and its contributors. 20*14414594SDavid du Colombier * 4. Neither the name of the University nor the names of its contributors 21*14414594SDavid du Colombier * may be used to endorse or promote products derived from this software 22*14414594SDavid du Colombier * without specific prior written permission. 23*14414594SDavid du Colombier * 24*14414594SDavid du Colombier * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25*14414594SDavid du Colombier * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26*14414594SDavid du Colombier * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27*14414594SDavid du Colombier * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28*14414594SDavid du Colombier * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29*14414594SDavid du Colombier * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30*14414594SDavid du Colombier * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31*14414594SDavid du Colombier * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32*14414594SDavid du Colombier * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33*14414594SDavid du Colombier * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34*14414594SDavid du Colombier * SUCH DAMAGE. 35*14414594SDavid du Colombier * 36*14414594SDavid du Colombier * @(#)nfs.h 8.4 (Berkeley) 5/1/95 37*14414594SDavid du Colombier * $Id: nfs.h,v 1.44 1998/09/07 05:42:15 bde Exp $ 38*14414594SDavid du Colombier */ 39*14414594SDavid du Colombier 40*14414594SDavid du Colombier #ifndef _9FS_H_ 41*14414594SDavid du Colombier #define _9FS_H_ 42*14414594SDavid du Colombier 43*14414594SDavid du Colombier #ifdef KERNEL 44*14414594SDavid du Colombier #include "opt_u9fs.h" 45*14414594SDavid du Colombier #endif 46*14414594SDavid du Colombier 47*14414594SDavid du Colombier #define U9FS_FABLKSIZE 512 48*14414594SDavid du Colombier #define U9FS_PORT 17008 49*14414594SDavid du Colombier 50*14414594SDavid du Colombier /* 51*14414594SDavid du Colombier * U9FS mount option flags 52*14414594SDavid du Colombier */ 53*14414594SDavid du Colombier #define U9FSMNT_SOFT 0x00000001 /* soft mount (hard is default) */ 54*14414594SDavid du Colombier #define U9FSMNT_MAXGRPS 0x00000020 /* set maximum grouplist size */ 55*14414594SDavid du Colombier #define U9FSMNT_INT 0x00000040 /* allow interrupts on hard mount */ 56*14414594SDavid du Colombier #define U9FSMNT_KERB 0x00000400 /* Use Kerberos authentication */ 57*14414594SDavid du Colombier #define U9FSMNT_READAHEAD 0x00002000 /* set read ahead */ 58*14414594SDavid du Colombier 59*14414594SDavid du Colombier struct p9user { 60*14414594SDavid du Colombier uid_t p9_uid; 61*14414594SDavid du Colombier char p9_name[U9FS_NAMELEN]; 62*14414594SDavid du Colombier }; 63*14414594SDavid du Colombier 64*14414594SDavid du Colombier /* 65*14414594SDavid du Colombier * Arguments to mount 9FS 66*14414594SDavid du Colombier */ 67*14414594SDavid du Colombier #define U9FS_ARGSVERSION 1 /* change when nfs_args changes */ 68*14414594SDavid du Colombier struct u9fs_args { 69*14414594SDavid du Colombier int version; /* args structure version number */ 70*14414594SDavid du Colombier struct sockaddr *addr; /* file server address */ 71*14414594SDavid du Colombier int addrlen; /* length of address */ 72*14414594SDavid du Colombier int sotype; /* Socket type */ 73*14414594SDavid du Colombier int proto; /* and Protocol */ 74*14414594SDavid du Colombier int fhsize; /* Size, in bytes, of fh */ 75*14414594SDavid du Colombier int flags; /* flags */ 76*14414594SDavid du Colombier int wsize; /* write size in bytes */ 77*14414594SDavid du Colombier int rsize; /* read size in bytes */ 78*14414594SDavid du Colombier int readdirsize; /* readdir size in bytes */ 79*14414594SDavid du Colombier char *hostname; /* server's name */ 80*14414594SDavid du Colombier struct sockaddr * authaddr; 81*14414594SDavid du Colombier int authaddrlen; 82*14414594SDavid du Colombier int authsotype; 83*14414594SDavid du Colombier int authsoproto; 84*14414594SDavid du Colombier int nusers; 85*14414594SDavid du Colombier char uname[U9FS_NAMELEN]; 86*14414594SDavid du Colombier char key[U9AUTH_DESKEYLEN]; 87*14414594SDavid du Colombier struct p9user * users; 88*14414594SDavid du Colombier }; 89*14414594SDavid du Colombier 90*14414594SDavid du Colombier /* 91*14414594SDavid du Colombier * The u9fsnode is the u9fs equivalent to ufs's inode. Any similarity 92*14414594SDavid du Colombier * is purely coincidental. 93*14414594SDavid du Colombier * There is a unique u9fsnode allocated for each active file, 94*14414594SDavid du Colombier * each current directory, each mounted-on file, text file, and the root. 95*14414594SDavid du Colombier * An u9fsnode is 'named' by its file handle. (nget/u9fs_node.c) 96*14414594SDavid du Colombier * If this structure exceeds 256 bytes (it is currently 256 using 4.4BSD-Lite 97*14414594SDavid du Colombier * type definitions), file handles of > 32 bytes should probably be split out 98*14414594SDavid du Colombier * into a separate MALLOC()'d data structure. (Reduce the size of u9fsfh_t by 99*14414594SDavid du Colombier * changing the definition in u9fsproto.h of U9FS_SMALLFH.) 100*14414594SDavid du Colombier * NB: Hopefully the current order of the fields is such that everything will 101*14414594SDavid du Colombier * be well aligned and, therefore, tightly packed. 102*14414594SDavid du Colombier */ 103*14414594SDavid du Colombier struct u9fsnode { 104*14414594SDavid du Colombier LIST_ENTRY(u9fsnode) n_hash; /* Hash chain */ 105*14414594SDavid du Colombier u_quad_t n_size; /* Current size of file */ 106*14414594SDavid du Colombier u_quad_t n_lrev; /* Modify rev for lease */ 107*14414594SDavid du Colombier struct vattr n_vattr; /* Vnode attribute cache */ 108*14414594SDavid du Colombier time_t n_attrstamp; /* Attr. cache timestamp */ 109*14414594SDavid du Colombier u_int32_t n_mode; /* ACCESS mode cache */ 110*14414594SDavid du Colombier uid_t n_modeuid; /* credentials having mode */ 111*14414594SDavid du Colombier time_t n_modestamp; /* mode cache timestamp */ 112*14414594SDavid du Colombier time_t n_mtime; /* Prev modify time. */ 113*14414594SDavid du Colombier time_t n_ctime; /* Prev create time. */ 114*14414594SDavid du Colombier u_short *n_fid; /* U9FS FID */ 115*14414594SDavid du Colombier struct vnode *n_vnode; /* associated vnode */ 116*14414594SDavid du Colombier struct lockf *n_lockf; /* Locking record of file */ 117*14414594SDavid du Colombier int n_error; /* Save write error value */ 118*14414594SDavid du Colombier #if 0 119*14414594SDavid du Colombier union { 120*14414594SDavid du Colombier struct timespec nf_atim; /* Special file times */ 121*14414594SDavid du Colombier u9fsuint64 nd_cookieverf; /* Cookie verifier (dir only) */ 122*14414594SDavid du Colombier } n_un1; 123*14414594SDavid du Colombier union { 124*14414594SDavid du Colombier struct timespec nf_mtim; 125*14414594SDavid du Colombier off_t nd_direof; /* Dir. EOF offset cache */ 126*14414594SDavid du Colombier } n_un2; 127*14414594SDavid du Colombier union { 128*14414594SDavid du Colombier struct sillyrename *nf_silly; /* Ptr to silly rename struct */ 129*14414594SDavid du Colombier LIST_HEAD(, u9fsdmap) nd_cook; /* cookies */ 130*14414594SDavid du Colombier } n_un3; 131*14414594SDavid du Colombier #endif 132*14414594SDavid du Colombier short n_flag; /* Flag for locking.. */ 133*14414594SDavid du Colombier }; 134*14414594SDavid du Colombier 135*14414594SDavid du Colombier #define n_atim n_un1.nf_atim 136*14414594SDavid du Colombier #define n_mtim n_un2.nf_mtim 137*14414594SDavid du Colombier #define n_sillyrename n_un3.nf_silly 138*14414594SDavid du Colombier #define n_cookieverf n_un1.nd_cookieverf 139*14414594SDavid du Colombier #define n_direofoffset n_un2.nd_direof 140*14414594SDavid du Colombier #define n_cookies n_un3.nd_cook 141*14414594SDavid du Colombier 142*14414594SDavid du Colombier /* 143*14414594SDavid du Colombier * Flags for n_flag 144*14414594SDavid du Colombier */ 145*14414594SDavid du Colombier #define NFLUSHWANT 0x0001 /* Want wakeup from a flush in prog. */ 146*14414594SDavid du Colombier #define NFLUSHINPROG 0x0002 /* Avoid multiple calls to vinvalbuf() */ 147*14414594SDavid du Colombier #define NMODIFIED 0x0004 /* Might have a modified buffer in bio */ 148*14414594SDavid du Colombier #define NWRITEERR 0x0008 /* Flag write errors so close will know */ 149*14414594SDavid du Colombier #define NQU9FSNONCACHE 0x0020 /* Non-cachable lease */ 150*14414594SDavid du Colombier #define NQU9FSWRITE 0x0040 /* Write lease */ 151*14414594SDavid du Colombier #define NQU9FSEVICTED 0x0080 /* Has been evicted */ 152*14414594SDavid du Colombier #define NACC 0x0100 /* Special file accessed */ 153*14414594SDavid du Colombier #define NUPD 0x0200 /* Special file updated */ 154*14414594SDavid du Colombier #define NCHG 0x0400 /* Special file times changed */ 155*14414594SDavid du Colombier #define NLOCKED 0x0800 /* node is locked */ 156*14414594SDavid du Colombier #define NWANTED 0x0100 /* someone wants to lock */ 157*14414594SDavid du Colombier 158*14414594SDavid du Colombier /* 159*14414594SDavid du Colombier * Convert between u9fsnode pointers and vnode pointers 160*14414594SDavid du Colombier */ 161*14414594SDavid du Colombier #define VTOU9FS(vp) ((struct u9fsnode *)(vp)->v_data) 162*14414594SDavid du Colombier #define U9FSTOV(np) ((struct vnode *)(np)->n_vnode) 163*14414594SDavid du Colombier 164*14414594SDavid du Colombier /* 165*14414594SDavid du Colombier * Mount structure. 166*14414594SDavid du Colombier * One allocated on every U9FS mount. 167*14414594SDavid du Colombier * Holds U9FS specific information for mount. 168*14414594SDavid du Colombier */ 169*14414594SDavid du Colombier struct u9fsmount { 170*14414594SDavid du Colombier int nm_flag; /* Flags for soft/hard... */ 171*14414594SDavid du Colombier int nm_state; /* Internal state flags */ 172*14414594SDavid du Colombier struct mount *nm_mountp; /* Vfs structure for this filesystem */ 173*14414594SDavid du Colombier int nm_numgrps; /* Max. size of groupslist */ 174*14414594SDavid du Colombier u_short nm_fid; /* fid of root dir */ 175*14414594SDavid du Colombier struct socket *nm_so; /* Rpc socket */ 176*14414594SDavid du Colombier int nm_sotype; /* Type of socket */ 177*14414594SDavid du Colombier int nm_soproto; /* and protocol */ 178*14414594SDavid du Colombier int nm_soflags; /* pr_flags for socket protocol */ 179*14414594SDavid du Colombier struct sockaddr *nm_nam; /* Addr of server */ 180*14414594SDavid du Colombier int nm_sent; /* Request send count */ 181*14414594SDavid du Colombier int nm_cwnd; /* Request send window */ 182*14414594SDavid du Colombier int nm_rsize; /* Max size of read rpc */ 183*14414594SDavid du Colombier int nm_wsize; /* Max size of write rpc */ 184*14414594SDavid du Colombier int nm_readdirsize; /* Size of a readdir rpc */ 185*14414594SDavid du Colombier #if 0 186*14414594SDavid du Colombier struct vnode *nm_inprog; /* Vnode in prog by nqu9fs_clientd() */ 187*14414594SDavid du Colombier uid_t nm_authuid; /* Uid for authenticator */ 188*14414594SDavid du Colombier int nm_authtype; /* Authenticator type */ 189*14414594SDavid du Colombier int nm_authlen; /* and length */ 190*14414594SDavid du Colombier char *nm_authstr; /* Authenticator string */ 191*14414594SDavid du Colombier char *nm_verfstr; /* and the verifier */ 192*14414594SDavid du Colombier int nm_verflen; 193*14414594SDavid du Colombier u_char nm_verf[U9FSX_V3WRITEVERF]; /* V3 write verifier */ 194*14414594SDavid du Colombier U9FSKERBKEY_T nm_key; /* and the session key */ 195*14414594SDavid du Colombier int nm_numuids; /* Number of u9fsuid mappings */ 196*14414594SDavid du Colombier TAILQ_HEAD(, u9fsuid) nm_uidlruhead; /* Lists of u9fsuid mappings */ 197*14414594SDavid du Colombier LIST_HEAD(, u9fsuid) nm_uidhashtbl[U9FS_MUIDHASHSIZ]; 198*14414594SDavid du Colombier TAILQ_HEAD(, buf) nm_bufq; /* async io buffer queue */ 199*14414594SDavid du Colombier short nm_bufqlen; /* number of buffers in queue */ 200*14414594SDavid du Colombier short nm_bufqwant; /* process wants to add to the queue */ 201*14414594SDavid du Colombier int nm_bufqiods; /* number of iods processing queue */ 202*14414594SDavid du Colombier #endif 203*14414594SDavid du Colombier u_int64_t nm_maxfilesize; /* maximum file size */ 204*14414594SDavid du Colombier }; 205*14414594SDavid du Colombier 206*14414594SDavid du Colombier #ifdef KERNEL 207*14414594SDavid du Colombier 208*14414594SDavid du Colombier #ifdef MALLOC_DECLARE 209*14414594SDavid du Colombier MALLOC_DECLARE(M_U9FSHASH); 210*14414594SDavid du Colombier #endif 211*14414594SDavid du Colombier 212*14414594SDavid du Colombier /* 213*14414594SDavid du Colombier * Convert mount ptr to u9fsmount ptr. 214*14414594SDavid du Colombier */ 215*14414594SDavid du Colombier #define VFSTOU9FS(mp) ((struct u9fsmount *)((mp)->mnt_data)) 216*14414594SDavid du Colombier 217*14414594SDavid du Colombier #endif /* KERNEL */ 218*14414594SDavid du Colombier 219*14414594SDavid du Colombier #endif 220