1 /*- 2 * Copyright (c) 1989, 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 4. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)mount.h 8.21 (Berkeley) 5/20/95 30 * $FreeBSD: stable/9/sys/sys/mount.h 251897 2013-06-18 05:21:40Z scottl $ 31 */ 32 33 #ifndef _SYS_MOUNT_H_ 34 #define _SYS_MOUNT_H_ 35 36 #include <sys/ucred.h> 37 #include <sys/queue.h> 38 #ifdef _KERNEL 39 #include <sys/lock.h> 40 #include <sys/lockmgr.h> 41 #include <sys/_mutex.h> 42 #endif 43 44 /* 45 * NOTE: When changing statfs structure, mount structure, MNT_* flags or 46 * MNTK_* flags also update DDB show mount command in vfs_subr.c. 47 */ 48 49 typedef struct fsid { int32_t val[2]; } fsid_t; /* filesystem id type */ 50 51 /* 52 * File identifier. 53 * These are unique per filesystem on a single machine. 54 */ 55 #define MAXFIDSZ 16 56 57 struct fid { 58 u_short fid_len; /* length of data in bytes */ 59 u_short fid_data0; /* force longword alignment */ 60 char fid_data[MAXFIDSZ]; /* data (variable length) */ 61 }; 62 63 /* 64 * filesystem statistics 65 */ 66 #define MFSNAMELEN 16 /* length of type name including null */ 67 #define MNAMELEN 88 /* size of on/from name bufs */ 68 #define STATFS_VERSION 0x20030518 /* current version number */ 69 struct statfs { 70 uint32_t f_version; /* structure version number */ 71 uint32_t f_type; /* type of filesystem */ 72 uint64_t f_flags; /* copy of mount exported flags */ 73 uint64_t f_bsize; /* filesystem fragment size */ 74 uint64_t f_iosize; /* optimal transfer block size */ 75 uint64_t f_blocks; /* total data blocks in filesystem */ 76 uint64_t f_bfree; /* free blocks in filesystem */ 77 int64_t f_bavail; /* free blocks avail to non-superuser */ 78 uint64_t f_files; /* total file nodes in filesystem */ 79 int64_t f_ffree; /* free nodes avail to non-superuser */ 80 uint64_t f_syncwrites; /* count of sync writes since mount */ 81 uint64_t f_asyncwrites; /* count of async writes since mount */ 82 uint64_t f_syncreads; /* count of sync reads since mount */ 83 uint64_t f_asyncreads; /* count of async reads since mount */ 84 uint64_t f_spare[10]; /* unused spare */ 85 uint32_t f_namemax; /* maximum filename length */ 86 uid_t f_owner; /* user that mounted the filesystem */ 87 fsid_t f_fsid; /* filesystem id */ 88 char f_charspare[80]; /* spare string space */ 89 char f_fstypename[MFSNAMELEN]; /* filesystem type name */ 90 char f_mntfromname[MNAMELEN]; /* mounted filesystem */ 91 char f_mntonname[MNAMELEN]; /* directory on which mounted */ 92 }; 93 94 #ifdef _KERNEL 95 #define OMFSNAMELEN 16 /* length of fs type name, including null */ 96 #define OMNAMELEN (88 - 2 * sizeof(long)) /* size of on/from name bufs */ 97 98 /* XXX getfsstat.2 is out of date with write and read counter changes here. */ 99 /* XXX statfs.2 is out of date with read counter changes here. */ 100 struct ostatfs { 101 long f_spare2; /* placeholder */ 102 long f_bsize; /* fundamental filesystem block size */ 103 long f_iosize; /* optimal transfer block size */ 104 long f_blocks; /* total data blocks in filesystem */ 105 long f_bfree; /* free blocks in fs */ 106 long f_bavail; /* free blocks avail to non-superuser */ 107 long f_files; /* total file nodes in filesystem */ 108 long f_ffree; /* free file nodes in fs */ 109 fsid_t f_fsid; /* filesystem id */ 110 uid_t f_owner; /* user that mounted the filesystem */ 111 int f_type; /* type of filesystem */ 112 int f_flags; /* copy of mount exported flags */ 113 long f_syncwrites; /* count of sync writes since mount */ 114 long f_asyncwrites; /* count of async writes since mount */ 115 char f_fstypename[OMFSNAMELEN]; /* fs type name */ 116 char f_mntonname[OMNAMELEN]; /* directory on which mounted */ 117 long f_syncreads; /* count of sync reads since mount */ 118 long f_asyncreads; /* count of async reads since mount */ 119 short f_spares1; /* unused spare */ 120 char f_mntfromname[OMNAMELEN];/* mounted filesystem */ 121 short f_spares2; /* unused spare */ 122 /* 123 * XXX on machines where longs are aligned to 8-byte boundaries, there 124 * is an unnamed int32_t here. This spare was after the apparent end 125 * of the struct until we bit off the read counters from f_mntonname. 126 */ 127 long f_spare[2]; /* unused spare */ 128 }; 129 130 TAILQ_HEAD(vnodelst, vnode); 131 132 /* Mount options list */ 133 TAILQ_HEAD(vfsoptlist, vfsopt); 134 struct vfsopt { 135 TAILQ_ENTRY(vfsopt) link; 136 char *name; 137 void *value; 138 int len; 139 int pos; 140 int seen; 141 }; 142 143 /* 144 * Structure per mounted filesystem. Each mounted filesystem has an 145 * array of operations and an instance record. The filesystems are 146 * put on a doubly linked list. 147 * 148 * Lock reference: 149 * m - mountlist_mtx 150 * i - interlock 151 * v - vnode freelist mutex 152 * 153 * Unmarked fields are considered stable as long as a ref is held. 154 * 155 */ 156 struct mount { 157 struct mtx mnt_mtx; /* mount structure interlock */ 158 int mnt_gen; /* struct mount generation */ 159 #define mnt_startzero mnt_list 160 TAILQ_ENTRY(mount) mnt_list; /* (m) mount list */ 161 struct vfsops *mnt_op; /* operations on fs */ 162 struct vfsconf *mnt_vfc; /* configuration info */ 163 struct vnode *mnt_vnodecovered; /* vnode we mounted on */ 164 struct vnode *mnt_syncer; /* syncer vnode */ 165 int mnt_ref; /* (i) Reference count */ 166 struct vnodelst mnt_nvnodelist; /* (i) list of vnodes */ 167 int mnt_nvnodelistsize; /* (i) # of vnodes */ 168 struct vnodelst mnt_activevnodelist; /* (v) list of active vnodes */ 169 int mnt_activevnodelistsize;/* (v) # of active vnodes */ 170 int mnt_writeopcount; /* (i) write syscalls pending */ 171 int mnt_kern_flag; /* (i) kernel only flags */ 172 uint64_t mnt_flag; /* (i) flags shared with user */ 173 u_int mnt_pad_noasync; 174 struct vfsoptlist *mnt_opt; /* current mount options */ 175 struct vfsoptlist *mnt_optnew; /* new options passed to fs */ 176 int mnt_maxsymlinklen; /* max size of short symlink */ 177 struct statfs mnt_stat; /* cache of filesystem stats */ 178 struct ucred *mnt_cred; /* credentials of mounter */ 179 void * mnt_data; /* private data */ 180 time_t mnt_time; /* last time written*/ 181 int mnt_iosize_max; /* max size for clusters, etc */ 182 struct netexport *mnt_export; /* export list */ 183 struct label *mnt_label; /* MAC label for the fs */ 184 u_int mnt_hashseed; /* Random seed for vfs_hash */ 185 int mnt_lockref; /* (i) Lock reference count */ 186 int mnt_secondary_writes; /* (i) # of secondary writes */ 187 int mnt_secondary_accwrites;/* (i) secondary wr. starts */ 188 struct thread *mnt_susp_owner; /* (i) thread owning suspension */ 189 #define mnt_endzero mnt_gjprovider 190 char *mnt_gjprovider; /* gjournal provider name */ 191 struct lock mnt_explock; /* vfs_export walkers lock */ 192 TAILQ_ENTRY(mount) mnt_upper_link; /* (m) we in the all uppers */ 193 TAILQ_HEAD(, mount) mnt_uppers; /* (m) upper mounts over us*/ 194 }; 195 196 /* 197 * Definitions for MNT_VNODE_FOREACH_ALL. 198 */ 199 struct vnode *__mnt_vnode_next_all(struct vnode **mvp, struct mount *mp); 200 struct vnode *__mnt_vnode_first_all(struct vnode **mvp, struct mount *mp); 201 void __mnt_vnode_markerfree_all(struct vnode **mvp, struct mount *mp); 202 203 #define MNT_VNODE_FOREACH_ALL(vp, mp, mvp) \ 204 for (vp = __mnt_vnode_first_all(&(mvp), (mp)); \ 205 (vp) != NULL; vp = __mnt_vnode_next_all(&(mvp), (mp))) 206 207 #define MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp) \ 208 do { \ 209 MNT_ILOCK(mp); \ 210 __mnt_vnode_markerfree_all(&(mvp), (mp)); \ 211 /* MNT_IUNLOCK(mp); -- done in above function */ \ 212 mtx_assert(MNT_MTX(mp), MA_NOTOWNED); \ 213 } while (0) 214 215 /* 216 * Definitions for MNT_VNODE_FOREACH_ACTIVE. 217 */ 218 struct vnode *__mnt_vnode_next_active(struct vnode **mvp, struct mount *mp); 219 struct vnode *__mnt_vnode_first_active(struct vnode **mvp, struct mount *mp); 220 void __mnt_vnode_markerfree_active(struct vnode **mvp, struct mount *); 221 222 #define MNT_VNODE_FOREACH_ACTIVE(vp, mp, mvp) \ 223 for (vp = __mnt_vnode_first_active(&(mvp), (mp)); \ 224 (vp) != NULL; vp = __mnt_vnode_next_active(&(mvp), (mp))) 225 226 #define MNT_VNODE_FOREACH_ACTIVE_ABORT(mp, mvp) \ 227 __mnt_vnode_markerfree_active(&(mvp), (mp)) 228 229 /* 230 * Definitions for MNT_VNODE_FOREACH. 231 * 232 * This interface has been deprecated in favor of MNT_VNODE_FOREACH_ALL. 233 */ 234 struct vnode *__mnt_vnode_next(struct vnode **mvp, struct mount *mp); 235 struct vnode *__mnt_vnode_first(struct vnode **mvp, struct mount *mp); 236 void __mnt_vnode_markerfree(struct vnode **mvp, struct mount *mp); 237 238 #define MNT_VNODE_FOREACH(vp, mp, mvp) \ 239 for (vp = __mnt_vnode_first(&(mvp), (mp)); \ 240 (vp) != NULL; vp = __mnt_vnode_next(&(mvp), (mp))) 241 242 #define MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp) \ 243 __mnt_vnode_markerfree(&(mvp), (mp)) 244 245 #define MNT_VNODE_FOREACH_ABORT(mp, mvp) \ 246 do { \ 247 MNT_ILOCK(mp); \ 248 MNT_VNODE_FOREACH_ABORT_ILOCKED(mp, mvp); \ 249 MNT_IUNLOCK(mp); \ 250 } while (0) 251 252 #define MNT_ILOCK(mp) mtx_lock(&(mp)->mnt_mtx) 253 #define MNT_ITRYLOCK(mp) mtx_trylock(&(mp)->mnt_mtx) 254 #define MNT_IUNLOCK(mp) mtx_unlock(&(mp)->mnt_mtx) 255 #define MNT_MTX(mp) (&(mp)->mnt_mtx) 256 #define MNT_REF(mp) (mp)->mnt_ref++ 257 #define MNT_REL(mp) do { \ 258 KASSERT((mp)->mnt_ref > 0, ("negative mnt_ref")); \ 259 (mp)->mnt_ref--; \ 260 if ((mp)->mnt_ref == 0) \ 261 wakeup((mp)); \ 262 } while (0) 263 264 #endif /* _KERNEL */ 265 266 /* 267 * User specifiable flags, stored in mnt_flag. 268 */ 269 #define MNT_RDONLY 0x0000000000000001ULL /* read only filesystem */ 270 #define MNT_SYNCHRONOUS 0x0000000000000002ULL /* fs written synchronously */ 271 #define MNT_NOEXEC 0x0000000000000004ULL /* can't exec from filesystem */ 272 #define MNT_NOSUID 0x0000000000000008ULL /* don't honor setuid fs bits */ 273 #define MNT_NFS4ACLS 0x0000000000000010ULL /* enable NFS version 4 ACLs */ 274 #define MNT_UNION 0x0000000000000020ULL /* union with underlying fs */ 275 #define MNT_ASYNC 0x0000000000000040ULL /* fs written asynchronously */ 276 #define MNT_SUIDDIR 0x0000000000100000ULL /* special SUID dir handling */ 277 #define MNT_SOFTDEP 0x0000000000200000ULL /* using soft updates */ 278 #define MNT_NOSYMFOLLOW 0x0000000000400000ULL /* do not follow symlinks */ 279 #define MNT_GJOURNAL 0x0000000002000000ULL /* GEOM journal support enabled */ 280 #define MNT_MULTILABEL 0x0000000004000000ULL /* MAC support for objects */ 281 #define MNT_ACLS 0x0000000008000000ULL /* ACL support enabled */ 282 #define MNT_NOATIME 0x0000000010000000ULL /* dont update file access time */ 283 #define MNT_NOCLUSTERR 0x0000000040000000ULL /* disable cluster read */ 284 #define MNT_NOCLUSTERW 0x0000000080000000ULL /* disable cluster write */ 285 #define MNT_SUJ 0x0000000100000000ULL /* using journaled soft updates */ 286 287 /* 288 * NFS export related mount flags. 289 */ 290 #define MNT_EXRDONLY 0x0000000000000080ULL /* exported read only */ 291 #define MNT_EXPORTED 0x0000000000000100ULL /* filesystem is exported */ 292 #define MNT_DEFEXPORTED 0x0000000000000200ULL /* exported to the world */ 293 #define MNT_EXPORTANON 0x0000000000000400ULL /* anon uid mapping for all */ 294 #define MNT_EXKERB 0x0000000000000800ULL /* exported with Kerberos */ 295 #define MNT_EXPUBLIC 0x0000000020000000ULL /* public export (WebNFS) */ 296 297 /* 298 * Flags set by internal operations, 299 * but visible to the user. 300 * XXX some of these are not quite right.. (I've never seen the root flag set) 301 */ 302 #define MNT_LOCAL 0x0000000000001000ULL /* filesystem is stored locally */ 303 #define MNT_QUOTA 0x0000000000002000ULL /* quotas are enabled on fs */ 304 #define MNT_ROOTFS 0x0000000000004000ULL /* identifies the root fs */ 305 #define MNT_USER 0x0000000000008000ULL /* mounted by a user */ 306 #define MNT_IGNORE 0x0000000000800000ULL /* do not show entry in df */ 307 308 /* 309 * Mask of flags that are visible to statfs(). 310 * XXX I think that this could now become (~(MNT_CMDFLAGS)) 311 * but the 'mount' program may need changing to handle this. 312 */ 313 #define MNT_VISFLAGMASK (MNT_RDONLY | MNT_SYNCHRONOUS | MNT_NOEXEC | \ 314 MNT_NOSUID | MNT_UNION | MNT_SUJ | \ 315 MNT_ASYNC | MNT_EXRDONLY | MNT_EXPORTED | \ 316 MNT_DEFEXPORTED | MNT_EXPORTANON| MNT_EXKERB | \ 317 MNT_LOCAL | MNT_USER | MNT_QUOTA | \ 318 MNT_ROOTFS | MNT_NOATIME | MNT_NOCLUSTERR| \ 319 MNT_NOCLUSTERW | MNT_SUIDDIR | MNT_SOFTDEP | \ 320 MNT_IGNORE | MNT_EXPUBLIC | MNT_NOSYMFOLLOW | \ 321 MNT_GJOURNAL | MNT_MULTILABEL | MNT_ACLS | \ 322 MNT_NFS4ACLS) 323 324 /* Mask of flags that can be updated. */ 325 #define MNT_UPDATEMASK (MNT_NOSUID | MNT_NOEXEC | \ 326 MNT_SYNCHRONOUS | MNT_UNION | MNT_ASYNC | \ 327 MNT_NOATIME | \ 328 MNT_NOSYMFOLLOW | MNT_IGNORE | \ 329 MNT_NOCLUSTERR | MNT_NOCLUSTERW | MNT_SUIDDIR | \ 330 MNT_ACLS | MNT_USER | MNT_NFS4ACLS) 331 332 /* 333 * External filesystem command modifier flags. 334 * Unmount can use the MNT_FORCE flag. 335 * XXX: These are not STATES and really should be somewhere else. 336 * XXX: MNT_BYFSID collides with MNT_ACLS, but because MNT_ACLS is only used for 337 * mount(2) and MNT_BYFSID is only used for unmount(2) it's harmless. 338 */ 339 #define MNT_UPDATE 0x0000000000010000ULL /* not real mount, just update */ 340 #define MNT_DELEXPORT 0x0000000000020000ULL /* delete export host lists */ 341 #define MNT_RELOAD 0x0000000000040000ULL /* reload filesystem data */ 342 #define MNT_FORCE 0x0000000000080000ULL /* force unmount or readonly */ 343 #define MNT_SNAPSHOT 0x0000000001000000ULL /* snapshot the filesystem */ 344 #define MNT_BYFSID 0x0000000008000000ULL /* specify filesystem by ID. */ 345 #define MNT_CMDFLAGS (MNT_UPDATE | MNT_DELEXPORT | MNT_RELOAD | \ 346 MNT_FORCE | MNT_SNAPSHOT | MNT_BYFSID) 347 /* 348 * Internal filesystem control flags stored in mnt_kern_flag. 349 * 350 * MNTK_UNMOUNT locks the mount entry so that name lookup cannot proceed 351 * past the mount point. This keeps the subtree stable during mounts 352 * and unmounts. 353 * 354 * MNTK_UNMOUNTF permits filesystems to detect a forced unmount while 355 * dounmount() is still waiting to lock the mountpoint. This allows 356 * the filesystem to cancel operations that might otherwise deadlock 357 * with the unmount attempt (used by NFS). 358 * 359 * MNTK_NOINSMNTQ is strict subset of MNTK_UNMOUNT. They are separated 360 * to allow for failed unmount attempt to restore the syncer vnode for 361 * the mount. 362 */ 363 #define MNTK_UNMOUNTF 0x00000001 /* forced unmount in progress */ 364 #define MNTK_ASYNC 0x00000002 /* filtered async flag */ 365 #define MNTK_SOFTDEP 0x00000004 /* async disabled by softdep */ 366 #define MNTK_NOINSMNTQ 0x00000008 /* insmntque is not allowed */ 367 #define MNTK_DRAINING 0x00000010 /* lock draining is happening */ 368 #define MNTK_REFEXPIRE 0x00000020 /* refcount expiring is happening */ 369 #define MNTK_EXTENDED_SHARED 0x00000040 /* Allow shared locking for more ops */ 370 #define MNTK_SHARED_WRITES 0x00000080 /* Allow shared locking for writes */ 371 #define MNTK_NO_IOPF 0x00000100 /* Disallow page faults during reads 372 and writes. Filesystem shall properly 373 handle i/o state on EFAULT. */ 374 #define MNTK_VGONE_UPPER 0x00000200 375 #define MNTK_VGONE_WAITER 0x00000400 376 #define MNTK_LOOKUP_EXCL_DOTDOT 0x00000800 377 #define MNTK_MARKER 0x00001000 378 #define MNTK_UNMAPPED_BUFS 0x00002000 379 #define MNTK_NOASYNC 0x00800000 /* disable async */ 380 #define MNTK_UNMOUNT 0x01000000 /* unmount in progress */ 381 #define MNTK_MWAIT 0x02000000 /* waiting for unmount to finish */ 382 #define MNTK_SUSPEND 0x08000000 /* request write suspension */ 383 #define MNTK_SUSPEND2 0x04000000 /* block secondary writes */ 384 #define MNTK_SUSPENDED 0x10000000 /* write operations are suspended */ 385 #define MNTK_MPSAFE 0x20000000 /* Filesystem is MPSAFE. */ 386 #define MNTK_LOOKUP_SHARED 0x40000000 /* FS supports shared lock lookups */ 387 #define MNTK_NOKNOTE 0x80000000 /* Don't send KNOTEs from VOP hooks */ 388 389 #define MNT_SHARED_WRITES(mp) (((mp) != NULL) && \ 390 ((mp)->mnt_kern_flag & MNTK_SHARED_WRITES)) 391 392 /* 393 * Sysctl CTL_VFS definitions. 394 * 395 * Second level identifier specifies which filesystem. Second level 396 * identifier VFS_VFSCONF returns information about all filesystems. 397 * Second level identifier VFS_GENERIC is non-terminal. 398 */ 399 #define VFS_VFSCONF 0 /* get configured filesystems */ 400 #define VFS_GENERIC 0 /* generic filesystem information */ 401 /* 402 * Third level identifiers for VFS_GENERIC are given below; third 403 * level identifiers for specific filesystems are given in their 404 * mount specific header files. 405 */ 406 #define VFS_MAXTYPENUM 1 /* int: highest defined filesystem type */ 407 #define VFS_CONF 2 /* struct: vfsconf for filesystem given 408 as next argument */ 409 410 /* 411 * Flags for various system call interfaces. 412 * 413 * waitfor flags to vfs_sync() and getfsstat() 414 */ 415 #define MNT_WAIT 1 /* synchronously wait for I/O to complete */ 416 #define MNT_NOWAIT 2 /* start all I/O, but do not wait for it */ 417 #define MNT_LAZY 3 /* push data not written by filesystem syncer */ 418 #define MNT_SUSPEND 4 /* Suspend file system after sync */ 419 420 /* 421 * Generic file handle 422 */ 423 struct fhandle { 424 fsid_t fh_fsid; /* Filesystem id of mount point */ 425 struct fid fh_fid; /* Filesys specific id */ 426 }; 427 typedef struct fhandle fhandle_t; 428 429 /* 430 * Old export arguments without security flavor list 431 */ 432 struct oexport_args { 433 int ex_flags; /* export related flags */ 434 uid_t ex_root; /* mapping for root uid */ 435 struct xucred ex_anon; /* mapping for anonymous user */ 436 struct sockaddr *ex_addr; /* net address to which exported */ 437 u_char ex_addrlen; /* and the net address length */ 438 struct sockaddr *ex_mask; /* mask of valid bits in saddr */ 439 u_char ex_masklen; /* and the smask length */ 440 char *ex_indexfile; /* index file for WebNFS URLs */ 441 }; 442 443 /* 444 * Export arguments for local filesystem mount calls. 445 */ 446 #define MAXSECFLAVORS 5 447 struct export_args { 448 int ex_flags; /* export related flags */ 449 uid_t ex_root; /* mapping for root uid */ 450 struct xucred ex_anon; /* mapping for anonymous user */ 451 struct sockaddr *ex_addr; /* net address to which exported */ 452 u_char ex_addrlen; /* and the net address length */ 453 struct sockaddr *ex_mask; /* mask of valid bits in saddr */ 454 u_char ex_masklen; /* and the smask length */ 455 char *ex_indexfile; /* index file for WebNFS URLs */ 456 int ex_numsecflavors; /* security flavor count */ 457 int ex_secflavors[MAXSECFLAVORS]; /* list of security flavors */ 458 }; 459 460 /* 461 * Structure holding information for a publicly exported filesystem 462 * (WebNFS). Currently the specs allow just for one such filesystem. 463 */ 464 struct nfs_public { 465 int np_valid; /* Do we hold valid information */ 466 fhandle_t np_handle; /* Filehandle for pub fs (internal) */ 467 struct mount *np_mount; /* Mountpoint of exported fs */ 468 char *np_index; /* Index file */ 469 }; 470 471 /* 472 * Filesystem configuration information. One of these exists for each 473 * type of filesystem supported by the kernel. These are searched at 474 * mount time to identify the requested filesystem. 475 * 476 * XXX: Never change the first two arguments! 477 */ 478 struct vfsconf { 479 u_int vfc_version; /* ABI version number */ 480 char vfc_name[MFSNAMELEN]; /* filesystem type name */ 481 struct vfsops *vfc_vfsops; /* filesystem operations vector */ 482 int vfc_typenum; /* historic filesystem type number */ 483 int vfc_refcount; /* number mounted of this type */ 484 int vfc_flags; /* permanent flags */ 485 struct vfsoptdecl *vfc_opts; /* mount options */ 486 TAILQ_ENTRY(vfsconf) vfc_list; /* list of vfscons */ 487 }; 488 489 /* Userland version of the struct vfsconf. */ 490 struct xvfsconf { 491 struct vfsops *vfc_vfsops; /* filesystem operations vector */ 492 char vfc_name[MFSNAMELEN]; /* filesystem type name */ 493 int vfc_typenum; /* historic filesystem type number */ 494 int vfc_refcount; /* number mounted of this type */ 495 int vfc_flags; /* permanent flags */ 496 struct vfsconf *vfc_next; /* next in list */ 497 }; 498 499 #ifndef BURN_BRIDGES 500 struct ovfsconf { 501 void *vfc_vfsops; 502 char vfc_name[32]; 503 int vfc_index; 504 int vfc_refcount; 505 int vfc_flags; 506 }; 507 #endif 508 509 /* 510 * NB: these flags refer to IMPLEMENTATION properties, not properties of 511 * any actual mounts; i.e., it does not make sense to change the flags. 512 */ 513 #define VFCF_STATIC 0x00010000 /* statically compiled into kernel */ 514 #define VFCF_NETWORK 0x00020000 /* may get data over the network */ 515 #define VFCF_READONLY 0x00040000 /* writes are not implemented */ 516 #define VFCF_SYNTHETIC 0x00080000 /* data does not represent real files */ 517 #define VFCF_LOOPBACK 0x00100000 /* aliases some other mounted FS */ 518 #define VFCF_UNICODE 0x00200000 /* stores file names as Unicode */ 519 #define VFCF_JAIL 0x00400000 /* can be mounted from within a jail */ 520 #define VFCF_DELEGADMIN 0x00800000 /* supports delegated administration */ 521 #define VFCF_SBDRY 0x01000000 /* defer stop requests */ 522 523 typedef uint32_t fsctlop_t; 524 525 struct vfsidctl { 526 int vc_vers; /* should be VFSIDCTL_VERS1 (below) */ 527 fsid_t vc_fsid; /* fsid to operate on */ 528 char vc_fstypename[MFSNAMELEN]; 529 /* type of fs 'nfs' or '*' */ 530 fsctlop_t vc_op; /* operation VFS_CTL_* (below) */ 531 void *vc_ptr; /* pointer to data structure */ 532 size_t vc_len; /* sizeof said structure */ 533 u_int32_t vc_spare[12]; /* spare (must be zero) */ 534 }; 535 536 /* vfsidctl API version. */ 537 #define VFS_CTL_VERS1 0x01 538 539 /* 540 * New style VFS sysctls, do not reuse/conflict with the namespace for 541 * private sysctls. 542 * All "global" sysctl ops have the 33rd bit set: 543 * 0x...1.... 544 * Private sysctl ops should have the 33rd bit unset. 545 */ 546 #define VFS_CTL_QUERY 0x00010001 /* anything wrong? (vfsquery) */ 547 #define VFS_CTL_TIMEO 0x00010002 /* set timeout for vfs notification */ 548 #define VFS_CTL_NOLOCKS 0x00010003 /* disable file locking */ 549 550 struct vfsquery { 551 u_int32_t vq_flags; 552 u_int32_t vq_spare[31]; 553 }; 554 555 /* vfsquery flags */ 556 #define VQ_NOTRESP 0x0001 /* server down */ 557 #define VQ_NEEDAUTH 0x0002 /* server bad auth */ 558 #define VQ_LOWDISK 0x0004 /* we're low on space */ 559 #define VQ_MOUNT 0x0008 /* new filesystem arrived */ 560 #define VQ_UNMOUNT 0x0010 /* filesystem has left */ 561 #define VQ_DEAD 0x0020 /* filesystem is dead, needs force unmount */ 562 #define VQ_ASSIST 0x0040 /* filesystem needs assistance from external 563 program */ 564 #define VQ_NOTRESPLOCK 0x0080 /* server lockd down */ 565 #define VQ_FLAG0100 0x0100 /* placeholder */ 566 #define VQ_FLAG0200 0x0200 /* placeholder */ 567 #define VQ_FLAG0400 0x0400 /* placeholder */ 568 #define VQ_FLAG0800 0x0800 /* placeholder */ 569 #define VQ_FLAG1000 0x1000 /* placeholder */ 570 #define VQ_FLAG2000 0x2000 /* placeholder */ 571 #define VQ_FLAG4000 0x4000 /* placeholder */ 572 #define VQ_FLAG8000 0x8000 /* placeholder */ 573 574 #ifdef _KERNEL 575 /* Point a sysctl request at a vfsidctl's data. */ 576 #define VCTLTOREQ(vc, req) \ 577 do { \ 578 (req)->newptr = (vc)->vc_ptr; \ 579 (req)->newlen = (vc)->vc_len; \ 580 (req)->newidx = 0; \ 581 } while (0) 582 #endif 583 584 struct iovec; 585 struct uio; 586 587 #ifdef _KERNEL 588 589 /* 590 * vfs_busy specific flags and mask. 591 */ 592 #define MBF_NOWAIT 0x01 593 #define MBF_MNTLSTLOCK 0x02 594 #define MBF_MASK (MBF_NOWAIT | MBF_MNTLSTLOCK) 595 596 #ifdef MALLOC_DECLARE 597 MALLOC_DECLARE(M_MOUNT); 598 #endif 599 extern int maxvfsconf; /* highest defined filesystem type */ 600 extern int nfs_mount_type; /* vfc_typenum for nfs, or -1 */ 601 602 TAILQ_HEAD(vfsconfhead, vfsconf); 603 extern struct vfsconfhead vfsconf; 604 605 /* 606 * Operations supported on mounted filesystem. 607 */ 608 struct mount_args; 609 struct nameidata; 610 struct sysctl_req; 611 struct mntarg; 612 613 typedef int vfs_cmount_t(struct mntarg *ma, void *data, uint64_t flags); 614 typedef int vfs_unmount_t(struct mount *mp, int mntflags); 615 typedef int vfs_root_t(struct mount *mp, int flags, struct vnode **vpp); 616 typedef int vfs_quotactl_t(struct mount *mp, int cmds, uid_t uid, void *arg); 617 typedef int vfs_statfs_t(struct mount *mp, struct statfs *sbp); 618 typedef int vfs_sync_t(struct mount *mp, int waitfor); 619 typedef int vfs_vget_t(struct mount *mp, ino_t ino, int flags, 620 struct vnode **vpp); 621 typedef int vfs_fhtovp_t(struct mount *mp, struct fid *fhp, 622 int flags, struct vnode **vpp); 623 typedef int vfs_checkexp_t(struct mount *mp, struct sockaddr *nam, 624 int *extflagsp, struct ucred **credanonp, 625 int *numsecflavors, int **secflavors); 626 typedef int vfs_init_t(struct vfsconf *); 627 typedef int vfs_uninit_t(struct vfsconf *); 628 typedef int vfs_extattrctl_t(struct mount *mp, int cmd, 629 struct vnode *filename_vp, int attrnamespace, 630 const char *attrname); 631 typedef int vfs_mount_t(struct mount *mp); 632 typedef int vfs_sysctl_t(struct mount *mp, fsctlop_t op, 633 struct sysctl_req *req); 634 typedef void vfs_susp_clean_t(struct mount *mp); 635 typedef void vfs_notify_lowervp_t(struct mount *mp, struct vnode *lowervp); 636 637 struct vfsops { 638 vfs_mount_t *vfs_mount; 639 vfs_cmount_t *vfs_cmount; 640 vfs_unmount_t *vfs_unmount; 641 vfs_root_t *vfs_root; 642 vfs_quotactl_t *vfs_quotactl; 643 vfs_statfs_t *vfs_statfs; 644 vfs_sync_t *vfs_sync; 645 vfs_vget_t *vfs_vget; 646 vfs_fhtovp_t *vfs_fhtovp; 647 vfs_checkexp_t *vfs_checkexp; 648 vfs_init_t *vfs_init; 649 vfs_uninit_t *vfs_uninit; 650 vfs_extattrctl_t *vfs_extattrctl; 651 vfs_sysctl_t *vfs_sysctl; 652 vfs_susp_clean_t *vfs_susp_clean; 653 vfs_notify_lowervp_t *vfs_reclaim_lowervp; 654 vfs_notify_lowervp_t *vfs_unlink_lowervp; 655 }; 656 657 vfs_statfs_t __vfs_statfs; 658 659 #define VFS_NEEDSGIANT_(MP) \ 660 ((MP) != NULL && ((MP)->mnt_kern_flag & MNTK_MPSAFE) == 0) 661 662 #define VFS_NEEDSGIANT(MP) __extension__ \ 663 ({ \ 664 struct mount *_mp; \ 665 _mp = (MP); \ 666 VFS_NEEDSGIANT_(_mp); \ 667 }) 668 669 #define VFS_LOCK_GIANT(MP) __extension__ \ 670 ({ \ 671 int _locked; \ 672 struct mount *_mp; \ 673 _mp = (MP); \ 674 if (VFS_NEEDSGIANT_(_mp)) { \ 675 mtx_lock(&Giant); \ 676 _locked = 1; \ 677 } else \ 678 _locked = 0; \ 679 _locked; \ 680 }) 681 #define VFS_UNLOCK_GIANT(locked) do \ 682 { \ 683 if ((locked)) \ 684 mtx_unlock(&Giant); \ 685 } while (0) 686 #define VFS_ASSERT_GIANT(MP) do \ 687 { \ 688 struct mount *_mp; \ 689 _mp = (MP); \ 690 if (VFS_NEEDSGIANT_(_mp)) \ 691 mtx_assert(&Giant, MA_OWNED); \ 692 } while (0) 693 694 #define VFS_PROLOGUE(MP) do { \ 695 int _enable_stops; \ 696 \ 697 _enable_stops = ((MP) != NULL && \ 698 ((MP)->mnt_vfc->vfc_flags & VFCF_SBDRY) && sigdeferstop()) 699 700 #define VFS_EPILOGUE(MP) \ 701 if (_enable_stops) \ 702 sigallowstop(); \ 703 } while (0) 704 705 #define VFS_MOUNT(MP) ({ \ 706 int _rc; \ 707 \ 708 VFS_PROLOGUE(MP); \ 709 _rc = (*(MP)->mnt_op->vfs_mount)(MP); \ 710 VFS_EPILOGUE(MP); \ 711 _rc; }) 712 713 #define VFS_UNMOUNT(MP, FORCE) ({ \ 714 int _rc; \ 715 \ 716 VFS_PROLOGUE(MP); \ 717 _rc = (*(MP)->mnt_op->vfs_unmount)(MP, FORCE); \ 718 VFS_EPILOGUE(MP); \ 719 _rc; }) 720 721 #define VFS_ROOT(MP, FLAGS, VPP) ({ \ 722 int _rc; \ 723 \ 724 VFS_PROLOGUE(MP); \ 725 _rc = (*(MP)->mnt_op->vfs_root)(MP, FLAGS, VPP); \ 726 VFS_EPILOGUE(MP); \ 727 _rc; }) 728 729 #define VFS_QUOTACTL(MP, C, U, A) ({ \ 730 int _rc; \ 731 \ 732 VFS_PROLOGUE(MP); \ 733 _rc = (*(MP)->mnt_op->vfs_quotactl)(MP, C, U, A); \ 734 VFS_EPILOGUE(MP); \ 735 _rc; }) 736 737 #define VFS_STATFS(MP, SBP) ({ \ 738 int _rc; \ 739 \ 740 VFS_PROLOGUE(MP); \ 741 _rc = __vfs_statfs((MP), (SBP)); \ 742 VFS_EPILOGUE(MP); \ 743 _rc; }) 744 745 #define VFS_SYNC(MP, WAIT) ({ \ 746 int _rc; \ 747 \ 748 VFS_PROLOGUE(MP); \ 749 _rc = (*(MP)->mnt_op->vfs_sync)(MP, WAIT); \ 750 VFS_EPILOGUE(MP); \ 751 _rc; }) 752 753 #define VFS_VGET(MP, INO, FLAGS, VPP) ({ \ 754 int _rc; \ 755 \ 756 VFS_PROLOGUE(MP); \ 757 _rc = (*(MP)->mnt_op->vfs_vget)(MP, INO, FLAGS, VPP); \ 758 VFS_EPILOGUE(MP); \ 759 _rc; }) 760 761 #define VFS_FHTOVP(MP, FIDP, FLAGS, VPP) ({ \ 762 int _rc; \ 763 \ 764 VFS_PROLOGUE(MP); \ 765 _rc = (*(MP)->mnt_op->vfs_fhtovp)(MP, FIDP, FLAGS, VPP); \ 766 VFS_EPILOGUE(MP); \ 767 _rc; }) 768 769 #define VFS_CHECKEXP(MP, NAM, EXFLG, CRED, NUMSEC, SEC) ({ \ 770 int _rc; \ 771 \ 772 VFS_PROLOGUE(MP); \ 773 _rc = (*(MP)->mnt_op->vfs_checkexp)(MP, NAM, EXFLG, CRED, NUMSEC,\ 774 SEC); \ 775 VFS_EPILOGUE(MP); \ 776 _rc; }) 777 778 #define VFS_EXTATTRCTL(MP, C, FN, NS, N) ({ \ 779 int _rc; \ 780 \ 781 VFS_PROLOGUE(MP); \ 782 _rc = (*(MP)->mnt_op->vfs_extattrctl)(MP, C, FN, NS, N); \ 783 VFS_EPILOGUE(MP); \ 784 _rc; }) 785 786 #define VFS_SYSCTL(MP, OP, REQ) ({ \ 787 int _rc; \ 788 \ 789 VFS_PROLOGUE(MP); \ 790 _rc = (*(MP)->mnt_op->vfs_sysctl)(MP, OP, REQ); \ 791 VFS_EPILOGUE(MP); \ 792 _rc; }) 793 794 #define VFS_SUSP_CLEAN(MP) do { \ 795 if (*(MP)->mnt_op->vfs_susp_clean != NULL) { \ 796 VFS_PROLOGUE(MP); \ 797 (*(MP)->mnt_op->vfs_susp_clean)(MP); \ 798 VFS_EPILOGUE(MP); \ 799 } \ 800 } while (0) 801 802 #define VFS_RECLAIM_LOWERVP(MP, VP) do { \ 803 if (*(MP)->mnt_op->vfs_reclaim_lowervp != NULL) { \ 804 VFS_PROLOGUE(MP); \ 805 (*(MP)->mnt_op->vfs_reclaim_lowervp)((MP), (VP)); \ 806 VFS_EPILOGUE(MP); \ 807 } \ 808 } while (0) 809 810 #define VFS_UNLINK_LOWERVP(MP, VP) do { \ 811 if (*(MP)->mnt_op->vfs_unlink_lowervp != NULL) { \ 812 VFS_PROLOGUE(MP); \ 813 (*(MP)->mnt_op->vfs_unlink_lowervp)((MP), (VP)); \ 814 VFS_EPILOGUE(MP); \ 815 } \ 816 } while (0) 817 818 #define VFS_KNOTE_LOCKED(vp, hint) do \ 819 { \ 820 if (((vp)->v_vflag & VV_NOKNOTE) == 0) \ 821 VN_KNOTE((vp), (hint), KNF_LISTLOCKED); \ 822 } while (0) 823 824 #define VFS_KNOTE_UNLOCKED(vp, hint) do \ 825 { \ 826 if (((vp)->v_vflag & VV_NOKNOTE) == 0) \ 827 VN_KNOTE((vp), (hint), 0); \ 828 } while (0) 829 830 #define VFS_NOTIFY_UPPER_RECLAIM 1 831 #define VFS_NOTIFY_UPPER_UNLINK 2 832 833 #include <sys/module.h> 834 835 /* 836 * Version numbers. 837 */ 838 #define VFS_VERSION_00 0x19660120 839 #define VFS_VERSION VFS_VERSION_00 840 841 #define VFS_SET(vfsops, fsname, flags) \ 842 static struct vfsconf fsname ## _vfsconf = { \ 843 .vfc_version = VFS_VERSION, \ 844 .vfc_name = #fsname, \ 845 .vfc_vfsops = &vfsops, \ 846 .vfc_typenum = -1, \ 847 .vfc_flags = flags, \ 848 }; \ 849 static moduledata_t fsname ## _mod = { \ 850 #fsname, \ 851 vfs_modevent, \ 852 & fsname ## _vfsconf \ 853 }; \ 854 DECLARE_MODULE(fsname, fsname ## _mod, SI_SUB_VFS, SI_ORDER_MIDDLE) 855 856 extern char *mountrootfsname; 857 858 /* 859 * exported vnode operations 860 */ 861 862 int dounmount(struct mount *, int, struct thread *); 863 864 int kernel_mount(struct mntarg *ma, uint64_t flags); 865 int kernel_vmount(int flags, ...); 866 struct mntarg *mount_arg(struct mntarg *ma, const char *name, const void *val, int len); 867 struct mntarg *mount_argb(struct mntarg *ma, int flag, const char *name); 868 struct mntarg *mount_argf(struct mntarg *ma, const char *name, const char *fmt, ...); 869 struct mntarg *mount_argsu(struct mntarg *ma, const char *name, const void *val, int len); 870 void statfs_scale_blocks(struct statfs *sf, long max_size); 871 struct vfsconf *vfs_byname(const char *); 872 struct vfsconf *vfs_byname_kld(const char *, struct thread *td, int *); 873 void vfs_mount_destroy(struct mount *); 874 void vfs_event_signal(fsid_t *, u_int32_t, intptr_t); 875 void vfs_freeopts(struct vfsoptlist *opts); 876 void vfs_deleteopt(struct vfsoptlist *opts, const char *name); 877 int vfs_buildopts(struct uio *auio, struct vfsoptlist **options); 878 int vfs_flagopt(struct vfsoptlist *opts, const char *name, uint64_t *w, 879 uint64_t val); 880 int vfs_getopt(struct vfsoptlist *, const char *, void **, int *); 881 int vfs_getopt_pos(struct vfsoptlist *opts, const char *name); 882 char *vfs_getopts(struct vfsoptlist *, const char *, int *error); 883 int vfs_copyopt(struct vfsoptlist *, const char *, void *, int); 884 int vfs_filteropt(struct vfsoptlist *, const char **legal); 885 void vfs_opterror(struct vfsoptlist *opts, const char *fmt, ...); 886 int vfs_scanopt(struct vfsoptlist *opts, const char *name, const char *fmt, ...); 887 int vfs_setopt(struct vfsoptlist *opts, const char *name, void *value, 888 int len); 889 int vfs_setopt_part(struct vfsoptlist *opts, const char *name, void *value, 890 int len); 891 int vfs_setopts(struct vfsoptlist *opts, const char *name, 892 const char *value); 893 int vfs_setpublicfs /* set publicly exported fs */ 894 (struct mount *, struct netexport *, struct export_args *); 895 void vfs_msync(struct mount *, int); 896 int vfs_busy(struct mount *, int); 897 int vfs_export /* process mount export info */ 898 (struct mount *, struct export_args *); 899 void vfs_allocate_syncvnode(struct mount *); 900 void vfs_deallocate_syncvnode(struct mount *); 901 int vfs_donmount(struct thread *td, uint64_t fsflags, 902 struct uio *fsoptions); 903 void vfs_getnewfsid(struct mount *); 904 struct cdev *vfs_getrootfsid(struct mount *); 905 struct mount *vfs_getvfs(fsid_t *); /* return vfs given fsid */ 906 struct mount *vfs_busyfs(fsid_t *); 907 int vfs_modevent(module_t, int, void *); 908 void vfs_mount_error(struct mount *, const char *, ...); 909 void vfs_mountroot(void); /* mount our root filesystem */ 910 void vfs_mountedfrom(struct mount *, const char *from); 911 void vfs_notify_upper(struct vnode *, int); 912 void vfs_oexport_conv(const struct oexport_args *oexp, 913 struct export_args *exp); 914 void vfs_ref(struct mount *); 915 void vfs_rel(struct mount *); 916 struct mount *vfs_mount_alloc(struct vnode *, struct vfsconf *, const char *, 917 struct ucred *); 918 int vfs_suser(struct mount *, struct thread *); 919 void vfs_unbusy(struct mount *); 920 void vfs_unmountall(void); 921 extern TAILQ_HEAD(mntlist, mount) mountlist; /* mounted filesystem list */ 922 extern struct mtx mountlist_mtx; 923 extern struct nfs_public nfs_pub; 924 925 /* 926 * Declarations for these vfs default operations are located in 927 * kern/vfs_default.c, they should be used instead of making "dummy" 928 * functions or casting entries in the VFS op table to "enopnotsupp()". 929 */ 930 vfs_root_t vfs_stdroot; 931 vfs_quotactl_t vfs_stdquotactl; 932 vfs_statfs_t vfs_stdstatfs; 933 vfs_sync_t vfs_stdsync; 934 vfs_sync_t vfs_stdnosync; 935 vfs_vget_t vfs_stdvget; 936 vfs_fhtovp_t vfs_stdfhtovp; 937 vfs_checkexp_t vfs_stdcheckexp; 938 vfs_init_t vfs_stdinit; 939 vfs_uninit_t vfs_stduninit; 940 vfs_extattrctl_t vfs_stdextattrctl; 941 vfs_sysctl_t vfs_stdsysctl; 942 943 #else /* !_KERNEL */ 944 945 #include <sys/cdefs.h> 946 947 struct stat; 948 949 __BEGIN_DECLS 950 int fhopen(const struct fhandle *, int); 951 int fhstat(const struct fhandle *, struct stat *); 952 int fhstatfs(const struct fhandle *, struct statfs *); 953 int fstatfs(int, struct statfs *); 954 int getfh(const char *, fhandle_t *); 955 int getfsstat(struct statfs *, long, int); 956 int getmntinfo(struct statfs **, int); 957 int lgetfh(const char *, fhandle_t *); 958 int mount(const char *, const char *, int, void *); 959 int nmount(struct iovec *, unsigned int, int); 960 int statfs(const char *, struct statfs *); 961 int unmount(const char *, int); 962 963 /* C library stuff */ 964 int getvfsbyname(const char *, struct xvfsconf *); 965 __END_DECLS 966 967 #endif /* _KERNEL */ 968 969 #endif /* !_SYS_MOUNT_H_ */ 970