1/* 2 * Copyright (c) 2000-2007 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ 29/* 30 * Copyright (c) 1989, 1993 31 * The Regents of the University of California. All rights reserved. 32 * 33 * This code is derived from software contributed to Berkeley by 34 * Rick Macklem at The University of Guelph. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 1. Redistributions of source code must retain the above copyright 40 * notice, this list of conditions and the following disclaimer. 41 * 2. Redistributions in binary form must reproduce the above copyright 42 * notice, this list of conditions and the following disclaimer in the 43 * documentation and/or other materials provided with the distribution. 44 * 3. All advertising materials mentioning features or use of this software 45 * must display the following acknowledgement: 46 * This product includes software developed by the University of 47 * California, Berkeley and its contributors. 48 * 4. Neither the name of the University nor the names of its contributors 49 * may be used to endorse or promote products derived from this software 50 * without specific prior written permission. 51 * 52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 55 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 62 * SUCH DAMAGE. 63 * 64 * @(#)nfsmount.h 8.3 (Berkeley) 3/30/95 65 * FreeBSD-Id: nfsmount.h,v 1.13 1997/08/16 19:16:05 wollman Exp $ 66 */ 67 68 69#ifndef _NFS_NFSMOUNT_H_ 70#define _NFS_NFSMOUNT_H_ 71 72#include <sys/appleapiopts.h> 73 74#ifdef __APPLE_API_PRIVATE 75 76/* 77 * NFS mount file system attributes 78 */ 79struct nfs_fsattr { 80 uint32_t nfsa_flags; /* file system flags */ 81 uint32_t nfsa_lease; /* lease time in seconds */ 82 uint32_t nfsa_maxname; /* maximum filename size */ 83 uint32_t nfsa_maxlink; /* maximum # links */ 84 uint32_t nfsa_bsize; /* block size */ 85 uint32_t nfsa_pad; /* UNUSED */ 86 uint64_t nfsa_maxfilesize; /* maximum file size */ 87 uint64_t nfsa_maxread; /* maximum read size */ 88 uint64_t nfsa_maxwrite; /* maximum write size */ 89 uint64_t nfsa_files_avail; /* file slots available */ 90 uint64_t nfsa_files_free; /* file slots free */ 91 uint64_t nfsa_files_total; /* file slots total */ 92 uint64_t nfsa_space_avail; /* disk space available */ 93 uint64_t nfsa_space_free; /* disk space free */ 94 uint64_t nfsa_space_total; /* disk space total */ 95 uint32_t nfsa_supp_attr[NFS_ATTR_BITMAP_LEN]; /* attributes supported on this file system */ 96 uint32_t nfsa_bitmap[NFS_ATTR_BITMAP_LEN]; /* valid attributes */ 97}; 98#define NFS_FSFLAG_LINK 0x00000001 99#define NFS_FSFLAG_SYMLINK 0x00000002 100#define NFS_FSFLAG_UNIQUE_FH 0x00000004 101#define NFS_FSFLAG_ACL 0x00000008 102#define NFS_FSFLAG_SET_TIME 0x00000010 103#define NFS_FSFLAG_CASE_INSENSITIVE 0x00000020 104#define NFS_FSFLAG_CASE_PRESERVING 0x00000040 105#define NFS_FSFLAG_CHOWN_RESTRICTED 0x00000080 106#define NFS_FSFLAG_HOMOGENEOUS 0x00000100 107#define NFS_FSFLAG_NO_TRUNC 0x00000200 108#define NFS_FSFLAG_FHTYPE_MASK 0xFF000000 109#define NFS_FSFLAG_FHTYPE_SHIFT 24 110 111/* 112 * function table for calling version-specific NFS functions 113 */ 114struct nfs_funcs { 115 int (*nf_mount)(struct nfsmount *, vfs_context_t, struct user_nfs_args *, nfsnode_t *); 116 int (*nf_update_statfs)(struct nfsmount *, vfs_context_t); 117 int (*nf_getquota)(struct nfsmount *, vfs_context_t, u_long, int, struct dqblk *); 118 int (*nf_access_rpc)(nfsnode_t, u_long *, vfs_context_t); 119 int (*nf_getattr_rpc)(nfsnode_t, mount_t, u_char *, size_t, vfs_context_t, struct nfs_vattr *, u_int64_t *); 120 int (*nf_setattr_rpc)(nfsnode_t, struct vnode_attr *, vfs_context_t, int); 121 int (*nf_read_rpc_async)(nfsnode_t, off_t, size_t, thread_t, kauth_cred_t, struct nfsreq_cbinfo *, struct nfsreq **); 122 int (*nf_read_rpc_async_finish)(nfsnode_t, struct nfsreq *, struct uio *, size_t *, int *); 123 int (*nf_readlink_rpc)(nfsnode_t, char *, uint32_t *, vfs_context_t); 124 int (*nf_write_rpc_async)(nfsnode_t, struct uio *, size_t, thread_t, kauth_cred_t, int, struct nfsreq_cbinfo *, struct nfsreq **); 125 int (*nf_write_rpc_async_finish)(nfsnode_t, struct nfsreq *, int *, size_t *, uint64_t *); 126 int (*nf_commit_rpc)(nfsnode_t, uint64_t, uint64_t, kauth_cred_t); 127 int (*nf_lookup_rpc_async)(nfsnode_t, char *, int, vfs_context_t, struct nfsreq **); 128 int (*nf_lookup_rpc_async_finish)(nfsnode_t, vfs_context_t, struct nfsreq *, u_int64_t *, fhandle_t *, struct nfs_vattr *); 129 int (*nf_remove_rpc)(nfsnode_t, char *, int, thread_t, kauth_cred_t); 130 int (*nf_rename_rpc)(nfsnode_t, char *, int, nfsnode_t, char *, int, vfs_context_t); 131}; 132 133/* 134 * Mount structure. 135 * One allocated on every NFS mount. 136 * Holds NFS specific information for mount. 137 */ 138struct nfsmount { 139 lck_mtx_t nm_lock; /* nfs mount lock */ 140 int nm_flag; /* Flags for soft/hard... */ 141 int nm_state; /* Internal state flags */ 142 int nm_vers; /* NFS version */ 143 struct nfs_funcs *nm_funcs; /* version-specific functions */ 144 mount_t nm_mountp; /* VFS structure for this filesystem */ 145 nfsnode_t nm_dnp; /* root directory nfsnode pointer */ 146 int nm_numgrps; /* Max. size of groupslist */ 147 TAILQ_HEAD(, nfs_gss_clnt_ctx) nm_gsscl; /* GSS user contexts */ 148 int nm_timeo; /* Init timer for NFSMNT_DUMBTIMR */ 149 int nm_retry; /* Max retries */ 150 int nm_rsize; /* Max size of read rpc */ 151 int nm_wsize; /* Max size of write rpc */ 152 int nm_biosize; /* buffer I/O size */ 153 int nm_readdirsize; /* Size of a readdir rpc */ 154 int nm_readahead; /* Num. of blocks to readahead */ 155 int nm_acregmin; /* reg file min attr cache timeout */ 156 int nm_acregmax; /* reg file max attr cache timeout */ 157 int nm_acdirmin; /* dir min attr cache timeout */ 158 int nm_acdirmax; /* dir max attr cache timeout */ 159 uint32_t nm_auth; /* security mechanism flavor */ 160 /* mount info */ 161 uint32_t nm_fsattrstamp; /* timestamp for fs attrs */ 162 struct nfs_fsattr nm_fsattr; /* file system attributes */ 163 uint64_t nm_verf; /* v3/v4 write verifier */ 164 union { 165 struct { /* v2/v3 specific fields */ 166 u_short rqport; /* cached rquota port */ 167 uint32_t rqportstamp; /* timestamp of rquota port */ 168 } v3; 169 struct { /* v4 specific fields */ 170 uint64_t clientid; /* client ID */ 171 uint64_t mounttime; /* mount verifier */ 172 thread_call_t renew_timer; /* RENEW timer call */ 173 } v4; 174 } nm_un; 175 /* async I/O queue */ 176 struct nfs_reqqhead nm_resendq; /* async I/O resend queue */ 177 struct nfs_reqqhead nm_iodq; /* async I/O request queue */ 178 struct nfsiod *nm_niod; /* nfsiod processing this mount */ 179 TAILQ_ENTRY(nfsmount) nm_iodlink; /* chain of mounts awaiting nfsiod */ 180 int nm_asyncwrites; /* outstanding async I/O writes */ 181 /* socket state */ 182 int nm_sotype; /* Type of socket */ 183 int nm_soproto; /* and protocol */ 184 mbuf_t nm_nam; /* Address of server */ 185 u_short nm_sockflags; /* socket state flags */ 186 socket_t nm_so; /* RPC socket */ 187 int nm_reconnect_start; /* reconnect start time */ 188 int nm_tprintf_initial_delay; /* delay first "server down" */ 189 int nm_tprintf_delay; /* delay between "server down" */ 190 int nm_srtt[4]; /* Timers for RPCs */ 191 int nm_sdrtt[4]; 192 int nm_timeouts; /* Request timeouts */ 193 union { 194 struct { 195 int sent; /* Request send count */ 196 int cwnd; /* Request congestion window */ 197 struct nfs_reqqhead cwndq; /* requests waiting on cwnd */ 198 } udp; 199 struct { 200 u_int32_t mleft;/* marker bytes remaining */ 201 u_int32_t fleft;/* fragment bytes remaining */ 202 u_int32_t len; /* length of RPC record */ 203 mbuf_t m; /* mbufs for current record */ 204 mbuf_t mlast; 205 } tcp; 206 } nm_sockstate; 207 TAILQ_ENTRY(nfsmount) nm_pokeq; /* mount poke queue chain */ 208 thread_t nm_sockthd; /* socket thread for this mount */ 209}; 210 211/* 212 * NFS mount state flags (nm_state) 213 */ 214#define NFSSTA_JUKEBOXTIMEO 0x00001000 /* experienced a jukebox timeout */ 215#define NFSSTA_LOCKTIMEO 0x00002000 /* experienced a lock req timeout */ 216#define NFSSTA_MOUNTED 0x00004000 /* completely mounted */ 217#define NFSSTA_LOCKSWORK 0x00008000 /* lock ops have worked. */ 218#define NFSSTA_TIMEO 0x00010000 /* experienced a timeout. */ 219#define NFSSTA_FORCE 0x00020000 /* doing a forced unmount. */ 220#define NFSSTA_HASWRITEVERF 0x00040000 /* Has write verifier for V3 */ 221#define NFSSTA_GOTPATHCONF 0x00080000 /* Got the V3 pathconf info */ 222#define NFSSTA_GOTFSINFO 0x00100000 /* Got the V3 fsinfo */ 223#define NFSSTA_SNDLOCK 0x01000000 /* Send socket lock */ 224#define NFSSTA_WANTSND 0x02000000 /* Want above */ 225 226/* flags for nm_sockflags */ 227#define NMSOCK_READY 0x0001 /* socket is ready for use */ 228#define NMSOCK_CONNECTING 0x0002 /* socket is being connect()ed */ 229#define NMSOCK_SETUP 0x0004 /* socket/connection is being set up */ 230#define NMSOCK_UNMOUNT 0x0008 /* unmounted, no more socket activity */ 231#define NMSOCK_LASTFRAG 0x0010 /* on last fragment of RPC record */ 232#define NMSOCK_POKE 0x0020 /* socket needs to be poked */ 233#define NMSOCK_UPCALL 0x0040 /* socket upcall in progress */ 234 235/* aliases for socket state variables */ 236#define nm_sent nm_sockstate.udp.sent 237#define nm_cwnd nm_sockstate.udp.cwnd 238#define nm_cwndq nm_sockstate.udp.cwndq 239#define nm_markerleft nm_sockstate.tcp.mleft 240#define nm_fragleft nm_sockstate.tcp.fleft 241#define nm_reclen nm_sockstate.tcp.len 242#define nm_m nm_sockstate.tcp.m 243#define nm_mlast nm_sockstate.tcp.mlast 244 245/* aliases for version-specific fields */ 246#define nm_rqport nm_un.v3.rqport 247#define nm_rqportstamp nm_un.v3.rqportstamp 248#define nm_clientid nm_un.v4.clientid 249#define nm_mounttime nm_un.v4.mounttime 250#define nm_renew_timer nm_un.v4.renew_timer 251 252#if defined(KERNEL) 253/* 254 * Macros to convert from various things to mount structures. 255 */ 256#define VFSTONFS(mp) ((mp) ? ((struct nfsmount *)vfs_fsprivate(mp)) : NULL) 257#define VTONMP(vp) VFSTONFS(vnode_mount(vp)) 258#define NFSTONMP(np) VTONMP(NFSTOV(np)) 259#define NFSTOMP(np) (vnode_mount(NFSTOV(np))) 260 261#endif /* KERNEL */ 262 263#endif /* __APPLE_API_PRIVATE */ 264#endif /* _NFS_NFSMOUNT_H_ */ 265