1/*
2 * Copyright (c) 2000-2014 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, 1991, 1993
31 *	The Regents of the University of California.  All rights reserved.
32 *
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted provided that the following conditions
35 * are met:
36 * 1. Redistributions of source code must retain the above copyright
37 *    notice, this list of conditions and the following disclaimer.
38 * 2. Redistributions in binary form must reproduce the above copyright
39 *    notice, this list of conditions and the following disclaimer in the
40 *    documentation and/or other materials provided with the distribution.
41 * 3. All advertising materials mentioning features or use of this software
42 *    must display the following acknowledgement:
43 *	This product includes software developed by the University of
44 *	California, Berkeley and its contributors.
45 * 4. Neither the name of the University nor the names of its contributors
46 *    may be used to endorse or promote products derived from this software
47 *    without specific prior written permission.
48 *
49 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
50 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
51 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
52 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
53 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59 * SUCH DAMAGE.
60 *
61 *	@(#)mount.h	8.21 (Berkeley) 5/20/95
62 */
63/*
64 * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce
65 * support for mandatory and extensible security protections.  This notice
66 * is included in support of clause 2.2 (b) of the Apple Public License,
67 * Version 2.0.
68 */
69
70
71#ifndef _SYS_MOUNT_H_
72#define	_SYS_MOUNT_H_
73
74#include <sys/appleapiopts.h>
75#include <sys/cdefs.h>
76#include <sys/attr.h>		/* needed for vol_capabilities_attr_t */
77
78#ifndef KERNEL
79#include <stdint.h>
80#include <sys/ucred.h>
81#include <sys/queue.h>		/* XXX needed for user builds */
82#include <Availability.h>
83#else
84#include <sys/kernel_types.h>
85#include <uuid/uuid.h>
86#endif
87
88#include <sys/_types/_fsid_t.h> /* file system id type */
89
90/*
91 * file system statistics
92 */
93
94#define	MFSNAMELEN	15	/* length of fs type name, not inc. null */
95#define	MFSTYPENAMELEN	16	/* length of fs type name including null */
96
97#if __DARWIN_64_BIT_INO_T
98#define	MNAMELEN	MAXPATHLEN	/* length of buffer for returned name */
99#else /* ! __DARWIN_64_BIT_INO_T */
100#define	MNAMELEN	90		/* length of buffer for returned name */
101#endif /* __DARWIN_64_BIT_INO_T */
102
103#define __DARWIN_STRUCT_STATFS64 { \
104	uint32_t	f_bsize;	/* fundamental file system block size */ \
105	int32_t		f_iosize;	/* optimal transfer block size */ \
106	uint64_t	f_blocks;	/* total data blocks in file system */ \
107	uint64_t	f_bfree;	/* free blocks in fs */ \
108	uint64_t	f_bavail;	/* free blocks avail to non-superuser */ \
109	uint64_t	f_files;	/* total file nodes in file system */ \
110	uint64_t	f_ffree;	/* free file nodes in fs */ \
111	fsid_t		f_fsid;		/* file system id */ \
112	uid_t		f_owner;	/* user that mounted the filesystem */ \
113	uint32_t	f_type;		/* type of filesystem */ \
114	uint32_t	f_flags;	/* copy of mount exported flags */ \
115	uint32_t	f_fssubtype;	/* fs sub-type (flavor) */ \
116	char		f_fstypename[MFSTYPENAMELEN];	/* fs type name */ \
117	char		f_mntonname[MAXPATHLEN];	/* directory on which mounted */ \
118	char		f_mntfromname[MAXPATHLEN];	/* mounted filesystem */ \
119	uint32_t	f_reserved[8];	/* For future use */ \
120}
121
122#if !__DARWIN_ONLY_64_BIT_INO_T
123
124struct statfs64 __DARWIN_STRUCT_STATFS64;
125
126#endif /* !__DARWIN_ONLY_64_BIT_INO_T */
127
128#if __DARWIN_64_BIT_INO_T
129
130struct statfs __DARWIN_STRUCT_STATFS64;
131
132#else /* !__DARWIN_64_BIT_INO_T */
133
134/*
135 * LP64 - WARNING - must be kept in sync with struct user_statfs in mount_internal.h.
136 */
137struct statfs {
138	short	f_otype;		/* TEMPORARY SHADOW COPY OF f_type */
139	short	f_oflags;		/* TEMPORARY SHADOW COPY OF f_flags */
140	long	f_bsize;		/* fundamental file system block size */
141	long	f_iosize;		/* optimal transfer block size */
142	long	f_blocks;		/* total data blocks in file system */
143	long	f_bfree;		/* free blocks in fs */
144	long	f_bavail;		/* free blocks avail to non-superuser */
145	long	f_files;		/* total file nodes in file system */
146	long	f_ffree;		/* free file nodes in fs */
147	fsid_t	f_fsid;			/* file system id */
148	uid_t	f_owner;		/* user that mounted the filesystem */
149	short	f_reserved1;	/* spare for later */
150	short	f_type;			/* type of filesystem */
151	long	f_flags;		/* copy of mount exported flags */
152	long    f_reserved2[2];	/* reserved for future use */
153	char	f_fstypename[MFSNAMELEN]; /* fs type name */
154	char	f_mntonname[MNAMELEN];	/* directory on which mounted */
155	char	f_mntfromname[MNAMELEN];/* mounted filesystem */
156	char	f_reserved3;	/* For alignment */
157	long	f_reserved4[4];	/* For future use */
158};
159
160#endif /* __DARWIN_64_BIT_INO_T */
161
162#pragma pack(4)
163
164struct vfsstatfs {
165	uint32_t	f_bsize;	/* fundamental file system block size */
166	size_t		f_iosize;	/* optimal transfer block size */
167	uint64_t	f_blocks;	/* total data blocks in file system */
168	uint64_t	f_bfree;	/* free blocks in fs */
169	uint64_t	f_bavail;	/* free blocks avail to non-superuser */
170	uint64_t	f_bused;	/* free blocks avail to non-superuser */
171	uint64_t	f_files;	/* total file nodes in file system */
172	uint64_t	f_ffree;	/* free file nodes in fs */
173	fsid_t		f_fsid;		/* file system id */
174	uid_t		f_owner;	/* user that mounted the filesystem */
175	uint64_t	f_flags;	/* copy of mount exported flags */
176	char		f_fstypename[MFSTYPENAMELEN];/* fs type name inclus */
177	char		f_mntonname[MAXPATHLEN];/* directory on which mounted */
178	char		f_mntfromname[MAXPATHLEN];/* mounted filesystem */
179	uint32_t	f_fssubtype;     /* fs sub-type (flavor) */
180	void		*f_reserved[2];		/* For future use == 0 */
181};
182
183#pragma pack()
184
185#ifdef KERNEL
186/*
187 * Kernel level support for the VFS_GETATTR(), VFS_SETATTR() for use in
188 * implementation of filesystem KEXTs, and by the vfs_getattr() and
189 * vfs_setattr() KPIs.
190 */
191
192#define VFSATTR_INIT(s)			((s)->f_supported = (s)->f_active = 0LL)
193#define VFSATTR_SET_SUPPORTED(s, a)	((s)->f_supported |= VFSATTR_ ## a)
194#define VFSATTR_IS_SUPPORTED(s, a)	((s)->f_supported & VFSATTR_ ## a)
195#define VFSATTR_CLEAR_ACTIVE(s, a)	((s)->f_active &= ~VFSATTR_ ## a)
196#define VFSATTR_IS_ACTIVE(s, a)		((s)->f_active & VFSATTR_ ## a)
197#define VFSATTR_ALL_SUPPORTED(s)	(((s)->f_active & (s)->f_supported) == (s)->f_active)
198#define VFSATTR_WANTED(s, a)		((s)->f_active |= VFSATTR_ ## a)
199#define VFSATTR_RETURN(s, a, x)		do { (s)-> a = (x); VFSATTR_SET_SUPPORTED(s, a);} while(0)
200
201#define VFSATTR_f_objcount		(1LL<<  0)
202#define VFSATTR_f_filecount		(1LL<<  1)
203#define VFSATTR_f_dircount		(1LL<<  2)
204#define VFSATTR_f_maxobjcount		(1LL<<  3)
205#define VFSATTR_f_bsize			(1LL<< 4)
206#define VFSATTR_f_iosize		(1LL<<  5)
207#define VFSATTR_f_blocks		(1LL<<  6)
208#define VFSATTR_f_bfree			(1LL<<  7)
209#define VFSATTR_f_bavail		(1LL<<  8)
210#define VFSATTR_f_bused			(1LL<<  9)
211#define VFSATTR_f_files			(1LL<< 10)
212#define VFSATTR_f_ffree			(1LL<< 11)
213#define VFSATTR_f_fsid			(1LL<< 12)
214#define VFSATTR_f_owner			(1LL<< 13)
215#define VFSATTR_f_capabilities		(1LL<< 14)
216#define VFSATTR_f_attributes		(1LL<< 15)
217#define VFSATTR_f_create_time		(1LL<< 16)
218#define VFSATTR_f_modify_time		(1LL<< 17)
219#define VFSATTR_f_access_time		(1LL<< 18)
220#define VFSATTR_f_backup_time		(1LL<< 19)
221#define VFSATTR_f_fssubtype		(1LL<< 20)
222#define VFSATTR_f_vol_name		(1LL<< 21)
223#define VFSATTR_f_signature		(1LL<< 22)
224#define VFSATTR_f_carbon_fsid		(1LL<< 23)
225#define VFSATTR_f_uuid			(1LL<< 24)
226
227/*
228 * Argument structure.
229 */
230#pragma pack(4)
231/*
232 * Note: the size of the vfs_attr structure can change.
233 * A kext should only reference the fields that are
234 * marked as active; it should not depend on the actual
235 * size of the structure or attempt to copy it.
236 */
237struct vfs_attr {
238	uint64_t	f_supported;
239	uint64_t	f_active;
240
241	uint64_t	f_objcount;	/* number of filesystem objects in volume */
242	uint64_t	f_filecount;	/* ... files */
243	uint64_t	f_dircount;	/* ... directories */
244	uint64_t	f_maxobjcount;	/* maximum number of filesystem objects */
245
246	uint32_t	f_bsize;	/* block size for the below size values */
247	size_t		f_iosize;	/* optimal transfer block size */
248	uint64_t	f_blocks;	/* total data blocks in file system */
249	uint64_t	f_bfree;	/* free blocks in fs */
250	uint64_t	f_bavail;	/* free blocks avail to non-superuser */
251	uint64_t	f_bused;	/* blocks in use */
252	uint64_t	f_files;	/* total file nodes in file system */
253	uint64_t	f_ffree;	/* free file nodes in fs */
254	fsid_t		f_fsid;		/* file system id */
255	uid_t		f_owner;	/* user that mounted the filesystem */
256
257 	vol_capabilities_attr_t f_capabilities;
258	vol_attributes_attr_t f_attributes;
259
260	struct timespec	f_create_time;	/* creation time */
261	struct timespec	f_modify_time;	/* last modification time */
262	struct timespec f_access_time;	/* time of last access */
263	struct timespec	f_backup_time;	/* last backup time */
264
265	uint32_t	f_fssubtype;	/* filesystem subtype */
266
267	char		*f_vol_name;	/* volume name */
268
269	uint16_t	f_signature;	/* used for ATTR_VOL_SIGNATURE, Carbon's FSVolumeInfo.signature */
270	uint16_t	f_carbon_fsid;	/* same as Carbon's FSVolumeInfo.filesystemID */
271	uuid_t		f_uuid;		/* file system UUID (version 3 or 5), available in 10.6 and later */
272};
273
274#pragma pack()
275
276#endif	/* KERNEL */
277
278/*
279 * User specifiable flags.
280 *
281 * Unmount uses MNT_FORCE flag.
282 */
283#define	MNT_RDONLY	0x00000001	/* read only filesystem */
284#define	MNT_SYNCHRONOUS	0x00000002	/* file system written synchronously */
285#define	MNT_NOEXEC	0x00000004	/* can't exec from filesystem */
286#define	MNT_NOSUID	0x00000008	/* don't honor setuid bits on fs */
287#define	MNT_NODEV	0x00000010	/* don't interpret special files */
288#define	MNT_UNION	0x00000020	/* union with underlying filesystem */
289#define	MNT_ASYNC	0x00000040	/* file system written asynchronously */
290#define	MNT_CPROTECT	0x00000080	/* file system supports content protection */
291
292/*
293 * NFS export related mount flags.
294 */
295#define	MNT_EXPORTED	0x00000100	/* file system is exported */
296
297/*
298 * MAC labeled / "quarantined" flag
299 */
300#define MNT_QUARANTINE	0x00000400	/* file system is quarantined */
301
302/*
303 * Flags set by internal operations.
304 */
305#define	MNT_LOCAL	0x00001000	/* filesystem is stored locally */
306#define	MNT_QUOTA	0x00002000	/* quotas are enabled on filesystem */
307#define	MNT_ROOTFS	0x00004000	/* identifies the root filesystem */
308#define	MNT_DOVOLFS	0x00008000	/* FS supports volfs (deprecated flag in Mac OS X 10.5) */
309
310
311#define MNT_DONTBROWSE	0x00100000	/* file system is not appropriate path to user data */
312#define MNT_IGNORE_OWNERSHIP 0x00200000 /* VFS will ignore ownership information on filesystem objects */
313#define MNT_AUTOMOUNTED 0x00400000	/* filesystem was mounted by automounter */
314#define MNT_JOURNALED   0x00800000  	/* filesystem is journaled */
315#define MNT_NOUSERXATTR	0x01000000	/* Don't allow user extended attributes */
316#define MNT_DEFWRITE	0x02000000	/* filesystem should defer writes */
317#define MNT_MULTILABEL	0x04000000	/* MAC support for individual labels */
318#define MNT_NOATIME	0x10000000	/* disable update of file access time */
319#ifdef BSD_KERNEL_PRIVATE
320/* #define MNT_IMGSRC_BY_INDEX 0x20000000 see sys/imgsrc.h */
321#endif /* BSD_KERNEL_PRIVATE */
322
323/* backwards compatibility only */
324#define MNT_UNKNOWNPERMISSIONS MNT_IGNORE_OWNERSHIP
325
326
327/*
328 * XXX I think that this could now become (~(MNT_CMDFLAGS))
329 * but the 'mount' program may need changing to handle this.
330 */
331#define	MNT_VISFLAGMASK	(MNT_RDONLY	| MNT_SYNCHRONOUS | MNT_NOEXEC	| \
332			MNT_NOSUID	| MNT_NODEV	| MNT_UNION	| \
333			MNT_ASYNC	| MNT_EXPORTED	| MNT_QUARANTINE | \
334			MNT_LOCAL	| MNT_QUOTA | \
335			MNT_ROOTFS	| MNT_DOVOLFS	| MNT_DONTBROWSE | \
336			MNT_IGNORE_OWNERSHIP | MNT_AUTOMOUNTED | MNT_JOURNALED | \
337			MNT_NOUSERXATTR | MNT_DEFWRITE	| MNT_MULTILABEL | \
338			MNT_NOATIME | MNT_CPROTECT)
339/*
340 * External filesystem command modifier flags.
341 * Unmount can use the MNT_FORCE flag.
342 * XXX These are not STATES and really should be somewhere else.
343 * External filesystem control flags.
344 */
345#define	MNT_UPDATE	0x00010000	/* not a real mount, just an update */
346#define	MNT_NOBLOCK	0x00020000	/* don't block unmount if not responding */
347#define	MNT_RELOAD	0x00040000	/* reload filesystem data */
348#define	MNT_FORCE	0x00080000	/* force unmount or readonly change */
349#define MNT_CMDFLAGS	(MNT_UPDATE|MNT_NOBLOCK|MNT_RELOAD|MNT_FORCE)
350
351
352
353/*
354 * Sysctl CTL_VFS definitions.
355 *
356 * Second level identifier specifies which filesystem. Second level
357 * identifier VFS_GENERIC returns information about all filesystems.
358 */
359#define	VFS_GENERIC		0	/* generic filesystem information */
360#define VFS_NUMMNTOPS		1	/* int: total num of vfs mount/unmount operations */
361/*
362 * Third level identifiers for VFS_GENERIC are given below; third
363 * level identifiers for specific filesystems are given in their
364 * mount specific header files.
365 */
366#define VFS_MAXTYPENUM	1	/* int: highest defined filesystem type */
367#define VFS_CONF	2	/* struct: vfsconf for filesystem given
368				   as next argument */
369
370/*
371 * Flags for various system call interfaces.
372 *
373 * waitfor flags to vfs_sync() and getfsstat()
374 */
375#define MNT_WAIT	1	/* synchronized I/O file integrity completion */
376#define MNT_NOWAIT	2	/* start all I/O, but do not wait for it */
377#define	MNT_DWAIT	4	/* synchronized I/O data integrity completion */
378
379
380#ifndef KERNEL
381struct mount;
382typedef struct mount * mount_t;
383struct vnode;
384typedef struct vnode * vnode_t;
385#endif
386
387/* Reserved fields preserve binary compatibility */
388struct vfsconf {
389	uint32_t vfc_reserved1;		/* opaque */
390	char	vfc_name[MFSNAMELEN];	/* filesystem type name */
391	int	vfc_typenum;		/* historic filesystem type number */
392	int	vfc_refcount;		/* number mounted of this type */
393	int	vfc_flags;		/* permanent flags */
394	uint32_t vfc_reserved2;		/* opaque */
395	uint32_t vfc_reserved3;		/* opaque */
396};
397
398struct vfsidctl {
399	int		vc_vers;	/* should be VFSIDCTL_VERS1 (below) */
400	fsid_t		vc_fsid;	/* fsid to operate on. */
401	void		*vc_ptr;	/* pointer to data structure. */
402	size_t		vc_len;		/* sizeof said structure. */
403	u_int32_t	vc_spare[12];	/* spare (must be zero). */
404};
405
406
407/* vfsidctl API version. */
408#define VFS_CTL_VERS1	0x01
409
410#ifdef KERNEL
411struct user_vfsidctl {
412       int				vc_vers;        /* should be VFSIDCTL_VERS1 (below) */
413       fsid_t			vc_fsid;		/* fsid to operate on. */
414       user_addr_t 		vc_ptr __attribute((aligned(8)));	/* pointer to data structure. */
415       user_size_t 		vc_len;			/* sizeof said structure. */
416       u_int32_t		vc_spare[12];   /* spare (must be zero). */
417};
418
419struct user32_vfsidctl {
420       int				vc_vers;        /* should be VFSIDCTL_VERS1 (below) */
421       fsid_t			vc_fsid;		/* fsid to operate on. */
422       user32_addr_t 	vc_ptr;			/* pointer to data structure. */
423       user32_size_t 	vc_len;			/* sizeof said structure. */
424       u_int32_t		vc_spare[12];   /* spare (must be zero). */
425};
426
427union union_vfsidctl { /* the fields vc_vers and vc_fsid are compatible */
428		struct user32_vfsidctl vc32;
429		struct user_vfsidctl vc64;
430};
431
432#endif /* KERNEL */
433
434/*
435 * New style VFS sysctls, do not reuse/conflict with the namespace for
436 * private sysctls.
437 */
438#define VFS_CTL_STATFS	0x00010001	/* statfs */
439#define VFS_CTL_UMOUNT	0x00010002	/* unmount */
440#define VFS_CTL_QUERY	0x00010003	/* anything wrong? (vfsquery) */
441#define VFS_CTL_NEWADDR	0x00010004	/* reconnect to new address */
442#define VFS_CTL_TIMEO	0x00010005	/* set timeout for vfs notification */
443#define VFS_CTL_NOLOCKS	0x00010006	/* disable file locking */
444#define VFS_CTL_SADDR	0x00010007	/* get server address */
445#define VFS_CTL_DISC    0x00010008	/* server disconnected */
446#define VFS_CTL_SERVERINFO  0x00010009  /* information about fs server */
447#define VFS_CTL_NSTATUS 0x0001000A	/* netfs mount status */
448
449struct vfsquery {
450	u_int32_t	vq_flags;
451	u_int32_t	vq_spare[31];
452};
453
454struct vfs_server {
455     int32_t  vs_minutes;                       /* minutes until server goes down. */
456     u_int8_t vs_server_name[MAXHOSTNAMELEN*3]; /* UTF8 server name to display (null terminated) */
457};
458
459/*
460 * NetFS mount status - returned by VFS_CTL_NSTATUS
461 */
462struct netfs_status {
463	u_int32_t	ns_status;		// Current status of mount (vfsquery flags)
464	char		ns_mountopts[512];	// Significant mount options
465	uint32_t	ns_waittime;		// Time waiting for reply (sec)
466	uint32_t	ns_threadcount;		// Number of threads blocked on network calls
467	uint64_t	ns_threadids[0];	// Thread IDs of those blocked threads
468};
469
470/* vfsquery flags */
471#define VQ_NOTRESP	0x0001	/* server down */
472#define VQ_NEEDAUTH	0x0002	/* server bad auth */
473#define VQ_LOWDISK	0x0004	/* we're low on space */
474#define VQ_MOUNT	0x0008	/* new filesystem arrived */
475#define VQ_UNMOUNT	0x0010	/* filesystem has left */
476#define VQ_DEAD		0x0020	/* filesystem is dead, needs force unmount */
477#define VQ_ASSIST	0x0040	/* filesystem needs assistance from external program */
478#define VQ_NOTRESPLOCK	0x0080	/* server lockd down */
479#define VQ_UPDATE	0x0100	/* filesystem information has changed */
480#define VQ_VERYLOWDISK	0x0200	/* file system has *very* little disk space left */
481#define VQ_SYNCEVENT	0x0400	/* a sync just happened (not set by kernel starting Mac OS X 10.9) */
482#define VQ_SERVEREVENT  0x0800  /* server issued notification/warning */
483#define VQ_FLAG1000	0x1000	/* placeholder */
484#define VQ_FLAG2000	0x2000	/* placeholder */
485#define VQ_FLAG4000	0x4000	/* placeholder */
486#define VQ_FLAG8000	0x8000	/* placeholder */
487
488
489#ifdef KERNEL
490
491/* Structure for setting device IO parameters per mount point */
492struct vfsioattr {
493	u_int32_t	io_maxreadcnt;		/* Max. byte count for read */
494	u_int32_t	io_maxwritecnt;		/* Max. byte count for write */
495	u_int32_t	io_segreadcnt;		/* Max. segment count for read */
496	u_int32_t	io_segwritecnt;		/* Max. segment count for write */
497	u_int32_t	io_maxsegreadsize;	/* Max. segment read size  */
498	u_int32_t	io_maxsegwritesize;	/* Max. segment write size */
499	u_int32_t	io_devblocksize;	/* the underlying device block size */
500	u_int32_t	io_flags;			/* flags for underlying device */
501	void *		io_reserved[2];		/* extended attribute information */
502};
503
504#define VFS_IOATTR_FLAGS_FUA	0x01	/* Write-through cache supported */
505#define VFS_IOATTR_FLAGS_UNMAP		0x02	/* Unmap (trim) supported */
506
507/*
508 * Filesystem Registration information
509 */
510#define VFS_TBLTHREADSAFE		0x0001	/* Only threadsafe filesystems are supported */
511#define VFS_TBLFSNODELOCK		0x0002	/* Only threadsafe filesystems are supported */
512#define VFS_TBLNOTYPENUM		0x0008
513#define VFS_TBLLOCALVOL			0x0010
514#define VFS_TBL64BITREADY		0x0020
515#define VFS_TBLNATIVEXATTR		0x0040
516#define VFS_TBLDIRLINKS			0x0080
517#define VFS_TBLUNMOUNT_PREFLIGHT	0x0100	/* does a preflight check before unmounting */
518#define VFS_TBLGENERICMNTARGS		0x0200  /* force generic mount args for local fs */
519#define VFS_TBLREADDIR_EXTENDED		0x0400  /* fs supports VNODE_READDIR_EXTENDED */
520#define	VFS_TBLNOMACLABEL		0x1000
521#define VFS_TBLVNOP_PAGEINV2		0x2000
522#define VFS_TBLVNOP_PAGEOUTV2		0x4000
523#define VFS_TBLVNOP_NOUPDATEID_RENAME	0x8000	/* vfs should not call vnode_update_ident on rename */
524#if CONFIG_SECLUDED_RENAME
525#define	VFS_TBLVNOP_SECLUDE_RENAME 	0x10000
526#endif
527
528
529struct vfs_fsentry {
530	struct vfsops * vfe_vfsops;	/* vfs operations */
531	int		vfe_vopcnt;	/* # of vnodeopv_desc being registered (reg, spec, fifo ...) */
532	struct vnodeopv_desc ** vfe_opvdescs; /* null terminated;  */
533	int			vfe_fstypenum;	/* historic filesystem type number */
534	char		vfe_fsname[MFSNAMELEN];	/* filesystem type name */
535	uint32_t	vfe_flags;		/* defines the FS capabilities */
536    void *		vfe_reserv[2];	/* reserved for future use; set this to zero*/
537 };
538
539
540
541struct vfsops {
542	/*!
543	 @function vfs_mount
544	 @abstract Perform filesystem-specific operations required for mounting.
545	 @discussion Typical operations include setting the mount-specific data with vfs_setfsprivate().
546	 Note that if a mount call fails, the filesystem must clean up any state it has constructed, because
547	 vfs-level mount code will not clean it up.
548	 @param mp Mount structure for the newly mounted filesystem.
549	 @param devvp Device that the filesystem is mounted from.
550	 @param data Filesystem-specific data passed down from userspace.
551	 @param context Context to authenticate for mount.
552	 @return 0 for success, else an error code.  Once success is returned, the filesystem should be ready to go active;
553	 VFS will not ask again.
554	 */
555	int  (*vfs_mount)(struct mount *mp, vnode_t devvp, user_addr_t data, vfs_context_t context);
556
557	/*!
558	 @function vfs_start
559	 @abstract Mark a mount as ready to be used.
560	 @discussion After receiving this calldown, a filesystem will be hooked into the mount list and should expect
561	 calls down from the VFS layer.
562	 @param mp Mount structure being activated.
563	 @param flags Unused.
564	 @param context Context to authenticate for mount.
565	 @return Return value is ignored.
566	 */
567	int  (*vfs_start)(struct mount *mp, int flags, vfs_context_t context);
568
569	/*!
570	 @function vfs_unmount
571	 @abstract Perform filesystem-specific cleanup as part of unmount.
572	 @discussion If the unmount downcall succeeds, VFS considers itself authorized to destroy all
573	 state related to the mount.
574	 @param mp Mount structure to unmount.
575	 @param mntflags MNT_FORCE indicates that we wish to unmount even if there are active vnodes.
576	 @param context Context to authenticate for unmount.
577	 @return 0 for success, else an error code.
578	 */
579	int  (*vfs_unmount)(struct mount *mp, int mntflags, vfs_context_t context);
580
581	/*!
582	 @function vfs_root
583	 @abstract Get the root vnode of a filesystem.
584	 @discussion Upon success, should return with an iocount held on the root vnode which the caller will
585	 drop with vnode_put().
586	 @param mp Mount for which to get the root.
587	 @param vpp Destination for root vnode.
588	 @param context Context to authenticate for getting the root.
589	 @return 0 for success, else an error code.
590	 */
591	int  (*vfs_root)(struct mount *mp, struct vnode **vpp, vfs_context_t context);
592
593	/*!
594	 @function vfs_quotactl
595	 @abstract Manipulate quotas for a volume.
596	 @param mp Mount for which to manipulate quotas.
597	 @param cmds Detailed in "quotactl" manual page.
598	 @param uid Detailed in "quotactl" manual page.
599	 @param arg Detailed in "quotactl" manual page.
600	 @param context Context to authenticate for changing quotas.
601	 @return 0 for success, else an error code.
602	 */
603	int  (*vfs_quotactl)(struct mount *mp, int cmds, uid_t uid, caddr_t arg, vfs_context_t context);
604
605	/*!
606	 @function vfs_getattr
607	 @abstract Get filesystem attributes.
608	 @discussion See VFSATTR_RETURN, VFSATTR_ACTIVE, VFSATTR_SET_SUPPORTED, VFSATTR_WANTED macros.
609	 @param mp Mount for which to get parameters.
610	 @param vfa Container for specifying which attributes are desired and which attributes the filesystem
611	 supports, as well as for returning results.
612	 @param ctx Context to authenticate for getting filesystem attributes.
613	 @return 0 for success, else an error code.
614	 */
615	int  (*vfs_getattr)(struct mount *mp, struct vfs_attr *, vfs_context_t context);
616/*	int  (*vfs_statfs)(struct mount *mp, struct vfsstatfs *sbp, vfs_context_t context);*/
617
618	/*!
619	 @function vfs_sync
620	 @abstract Flush all filesystem data to backing store.
621	 @discussion vfs_sync will be called as part of the sync() system call and during unmount.
622	 @param mp Mountpoint to sync.
623	 @param waitfor MNT_WAIT: flush synchronously, waiting for all data to be written before returning. MNT_NOWAIT: start I/O but do not wait for it.
624	 @param ctx Context to authenticate for the sync.
625	 @return 0 for success, else an error code.
626	 */
627	int  (*vfs_sync)(struct mount *mp, int waitfor, vfs_context_t context);
628
629	/*!
630	 @function vfs_vget
631	 @abstract Get a vnode by file id (inode number).
632	 @discussion This routine is chiefly used to build paths to vnodes.  Result should be turned with an iocount that the
633	 caller will drop with vnode_put().
634	 @param mp Mount against which to look up inode number.
635	 @param ino File ID for desired file, as found through a readdir.
636	 @param vpp Destination for vnode.
637	 @return 0 for success, else an error code.
638	 */
639	int  (*vfs_vget)(struct mount *mp, ino64_t ino, struct vnode **vpp, vfs_context_t context);
640
641	/*!
642	 @function vfs_fhtovp
643	 @abstract Get the vnode corresponding to a file handle.
644	 @discussion Filesystems can return handles to files which are independent of their (transient) vnode identities.
645	 vfs_thtovp converts that persistent handle back to a vnode.  The vnode should be returned with an iocount which
646	 the caller will drop with vnode_put().
647	 @param mp Mount against which to look up file handle.
648	 @param fhlen Size of file handle structure, as returned by vfs_vptofh.
649	 @param fhp Pointer to handle.
650	 @param vpp Destination for vnode.
651	 @param ctx Context against which to authenticate the file-handle conversion.
652	 @return 0 for success, else an error code.
653	 */
654	int  (*vfs_fhtovp)(struct mount *mp, int fhlen, unsigned char *fhp, struct vnode **vpp,
655	                   vfs_context_t context);
656
657	/*!
658	 @function vfs_vptofh
659	 @abstract Get a persistent handle corresponding to a vnode.
660	 @param mp Mount against which to convert the vnode to a handle.
661	 @param fhlen Size of buffer provided for handle; set to size of actual handle returned.
662	 @param fhp Pointer to buffer in which to place handle data.
663	 @param ctx Context against which to authenticate the file-handle request.
664	 @return 0 for success, else an error code.
665	 */
666	int  (*vfs_vptofh)(struct vnode *vp, int *fhlen, unsigned char *fhp, vfs_context_t context);
667
668	/*!
669	 @function vfs_init
670	 @abstract Prepare a filesystem for having instances mounted.
671	 @discussion This routine is called once, before any particular instance of a filesystem
672	 is mounted; it allows the filesystem to initialize whatever global data structures
673	 are shared across all mounts.  If this returns successfully, a filesystem should be ready to have
674	 instances mounted.
675	 @param vfsconf Configuration information.  Currently, the only useful data are the filesystem name,
676	 typenum, and flags.  The flags field will be either 0 or MNT_LOCAL.  Many filesystems ignore this
677	 parameter.
678	 @return 0 for success, else an error code.
679	 */
680	int  (*vfs_init)(struct vfsconf *);
681
682	/*!
683	 @function vfs_sysctl
684	 @abstract Broad interface for querying and controlling filesystem.
685	 @discussion VFS defines VFS_CTL_QUERY as a generic status request which is answered
686	 with the VQ_* macros in a "struct vfsquery."
687	 A filesystem may also define implementation-specific commands.  See "man 3 sysctl"
688	 for the meaning of sysctl parameters.
689	 @param context Context against which to authenticate command.
690	 @return 0 for success, else an error code.
691	 */
692	int  (*vfs_sysctl)(int *, u_int, user_addr_t, size_t *, user_addr_t, size_t, vfs_context_t context);
693
694	/*!
695	 @function vfs_setattr
696	 @abstract Set filesystem attributes.
697	 @discussion The other side of the vfs_getattr coin.  Currently only called to set volume name.
698	 @param mp Mount on which to set attributes.
699	 @param vfa VFS attribute structure containing requested attributes to set and their values.  Currently
700	 will only be called with f_vol_name set.
701	 @param context Context against which to authenticate attribute change.
702	 @return 0 for success, else an error code.
703	 */
704	int  (*vfs_setattr)(struct mount *mp, struct vfs_attr *, vfs_context_t context);
705	void *vfs_reserved[7];
706};
707
708
709/*
710 * flags passed into vfs_iterate
711 */
712#ifdef PRIVATE
713#define VFS_ITERATE_TAIL_FIRST	(1 << 0)
714#define VFS_ITERATE_CB_DROPREF	(1 << 1)	// Callback will drop the iterref
715#endif /* PRIVATE */
716
717/*
718 * return values from callback
719 */
720#define VFS_RETURNED		0	/* done with vnode, reference can be dropped */
721#define VFS_RETURNED_DONE	1	/* done with vnode, reference can be dropped, terminate iteration */
722#define VFS_CLAIMED		2	/* don't drop reference */
723#define VFS_CLAIMED_DONE	3	/* don't drop reference, terminate iteration */
724
725
726__BEGIN_DECLS
727#ifdef BSD_KERNEL_PRIVATE
728extern int VFS_MOUNT(mount_t, vnode_t, user_addr_t, vfs_context_t);
729extern int VFS_START(mount_t, int, vfs_context_t);
730extern int VFS_UNMOUNT(mount_t, int, vfs_context_t);
731extern int VFS_ROOT(mount_t, vnode_t *, vfs_context_t);
732extern int VFS_QUOTACTL(mount_t, int, uid_t, caddr_t, vfs_context_t);
733extern int VFS_GETATTR(mount_t, struct vfs_attr *, vfs_context_t);
734extern int VFS_SETATTR(mount_t, struct vfs_attr *, vfs_context_t);
735extern int VFS_SYNC(mount_t, int, vfs_context_t);
736extern int VFS_VGET(mount_t, ino64_t, vnode_t *, vfs_context_t);
737extern int VFS_FHTOVP(mount_t, int, unsigned char *, vnode_t *, vfs_context_t);
738extern int VFS_VPTOFH(vnode_t, int *, unsigned char *, vfs_context_t);
739#endif /* BSD_KERNEL_PRIVATE */
740/*
741 * prototypes for exported VFS operations
742 */
743
744/*!
745  @function vfs_fsadd
746  @abstract Register a filesystem with VFS.
747  @discussion Typically called by a filesystem Kernel Extension when it is loaded.
748  @param vfe Filesystem information: table of vfs operations, list of vnode operation tables,
749  filesystem type number (can be omitted with VFS_TBLNOTYPENUM flag), name, flags.
750  @param handle Opaque handle which will be passed to vfs_fsremove.
751  @return 0 for success, else an error code.
752  */
753int vfs_fsadd(struct vfs_fsentry *, vfstable_t *);
754
755/*!
756  @function vfs_fsremove
757  @abstract Unregister a filesystem with VFS.
758  @discussion Typically called by a filesystem Kernel Extension when it is unloaded.
759  @param handle Handle which was returned by vfs_fsadd.
760  @return 0 for success, else an error code.
761  */
762int vfs_fsremove(vfstable_t);
763
764/*!
765  @function vfs_iterate
766  @abstract Iterate over all mountpoints with a callback.  Used, for example, by sync().
767  @param flags Unused.
768  @param callback Function which takes a mount and arbitrary passed-in "arg," and returns one of VFS_RETURNED_DONE or VFS_CLAIMED_DONE: end
769  iteration and return success.  VFS_RETURNED or VFS_CLAIMED: continue iterating. Anything else: continue iterating.
770  @param arg Arbitrary data to pass to callback.
771  @return 0 for success, else an error code.
772  */
773int	vfs_iterate(int, int (*)(struct mount *, void *), void *);
774
775/*!
776  @function vfs_init_io_attributes
777  @abstract Set I/O attributes on a mountpoint based on device properties.
778  @param devvp Block device vnode from which a filesystem is being mounted.
779  @param mp Mountpoint whose I/O parameters to initialize.
780  @return 0 for success, else an error code.
781  */
782int	vfs_init_io_attributes(vnode_t, mount_t);
783
784/*!
785  @function vfs_flags
786  @abstract Retrieve mount flags.
787  @discussion Results will be in the bitwise "OR" of MNT_VISFLAGMASK and MNT_CMDFLAGS.
788  @param mp Mount whose flags to grab.
789  @return Flags.
790  */
791uint64_t vfs_flags(mount_t);
792
793/*!
794  @function vfs_setflags
795  @abstract Set flags on a mount.
796  @discussion Sets mount flags to the bitwise "OR" of their current value and the specified bits. Often
797  used by a filesystem as part of the mount process.
798  @param mp Mount whose flags to set.
799  @param flags Flags to activate.  Must be in the bitwise "OR" of MNT_VISFLAGMASK and MNT_CMDFLAGS.
800  @return Flags.
801  */
802void	vfs_setflags(mount_t, uint64_t);
803
804/*!
805  @function vfs_clearflags
806  @abstract Clear flags on a mount.
807  @discussion Sets mount flags to the bitwise "AND" of their current value and the complement of the specified bits.
808  @param mp Mount whose flags to set.
809  @param flags Flags to deactivate.  Must be in the bitwise "OR" of MNT_VISFLAGMASK and MNT_CMDFLAGS.
810  @return void.
811  */
812void	vfs_clearflags(mount_t, uint64_t);
813
814/*!
815  @function vfs_issynchronous
816  @abstract Determine if writes to a filesystem occur synchronously.
817  @param mp Mount to test.
818  @return Nonzero if writes occur synchronously, else 0.
819  */
820int	vfs_issynchronous(mount_t);
821
822/*!
823  @function vfs_iswriteupgrade
824  @abstract Determine if a filesystem is mounted read-only but a request has been made to upgrade
825  to read-write.
826  @param mp Mount to test.
827  @return Nonzero if a request has been made to update from read-only to read-write, else 0.
828  */
829int	vfs_iswriteupgrade(mount_t);
830
831/*!
832  @function vfs_isupdate
833  @abstract Determine if a mount update is in progress.
834  @param mp Mount to test.
835  @return Nonzero if a mount update is in progress, 0 otherwise.
836  */
837int	vfs_isupdate(mount_t);
838
839/*!
840  @function vfs_isreload
841  @abstract Determine if a reload of filesystem data is in progress.  This can only be the case
842  for a read-only filesystem; all data is brought in from secondary storage.
843  @param mp Mount to test.
844  @return Nonzero if a request has been made to reload data, else 0.
845  */
846int	vfs_isreload(mount_t);
847
848/*!
849  @function vfs_isforce
850  @abstract Determine if a forced unmount is in progress.
851  @discussion A forced unmount invalidates open files.
852  @param mp Mount to test.
853  @return Nonzero if a request has been made to forcibly unmount, else 0.
854  */
855int	vfs_isforce(mount_t);
856
857/*!
858  @function vfs_isunmount
859  @abstract Determine if an unmount is in progress.
860  @discussion This is an unsynchronized snapshot of the mount state.  It should only be called
861  if the mount is known to be valid, e.g. there are known to be live files on that volume.
862  @param mp Mount to test.
863  @return Nonzero if an unmount is in progress, else zero.
864  */
865int 	vfs_isunmount(mount_t mp);
866
867/*!
868  @function vfs_isrdonly
869  @abstract Determine if a filesystem is mounted read-only.
870  @param mp Mount to test.
871  @return Nonzero if filesystem is mounted read-only, else 0.
872  */
873int	vfs_isrdonly(mount_t);
874
875/*!
876  @function vfs_isrdwr
877  @abstract Determine if a filesystem is mounted with writes enabled.
878  @param mp Mount to test.
879  @return Nonzero if filesystem is mounted read-write, else 0.
880  */
881int	vfs_isrdwr(mount_t);
882
883/*!
884  @function vfs_authopaque
885  @abstract Determine if a filesystem's authorization decisions occur remotely.
886  @param mp Mount to test.
887  @return Nonzero if filesystem authorization is controlled remotely, else 0.
888  */
889int	vfs_authopaque(mount_t);
890
891/*!
892  @function vfs_authopaqueaccess
893  @abstract Check if a filesystem is marked as having reliable remote VNOP_ACCESS support.
894  @param mp Mount to test.
895  @return Nonzero if VNOP_ACCESS is supported remotely, else 0.
896  */
897int	vfs_authopaqueaccess(mount_t);
898
899/*!
900  @function vfs_setauthopaque
901  @abstract Mark a filesystem as having authorization decisions controlled remotely.
902  @param mp Mount to mark.
903  @return void.
904  */
905void	vfs_setauthopaque(mount_t);
906
907/*!
908  @function vfs_setauthopaqueaccess
909  @abstract Mark a filesystem as having remote VNOP_ACCESS support.
910  @param mp Mount to mark.
911  @return void.
912  */
913void	vfs_setauthopaqueaccess(mount_t);
914
915/*!
916  @function vfs_clearauthopaque
917  @abstract Mark a filesystem as not having remote authorization decisions.
918  @param mp Mount to mark.
919  @return void.
920  */
921void	vfs_clearauthopaque(mount_t);
922
923/*!
924  @function vfs_clearauthopaque
925  @abstract Mark a filesystem as not having remote VNOP_ACCESS support.
926  @param mp Mount to mark.
927  @return void.
928  */
929void	vfs_clearauthopaqueaccess(mount_t);
930
931/*!
932  @function vfs_setextendedsecurity
933  @abstract Mark a filesystem as supporting security controls beyond POSIX permissions.
934  @discussion Specific controls include ACLs, file owner UUIDs, and group UUIDs.
935  @param mp Mount to test.
936  @return void.
937  */
938void	vfs_setextendedsecurity(mount_t);
939
940/*!
941  @function vfs_clearextendedsecurity
942  @abstract Mark a filesystem as NOT supporting security controls beyond POSIX permissions.
943  @discussion Specific controls include ACLs, file owner UUIDs, and group UUIDs.
944  @param mp Mount to test.
945  @return void.
946  */
947void	vfs_clearextendedsecurity(mount_t);
948
949/*!
950  @function vfs_setlocklocal
951  @abstract Mark a filesystem as using VFS-level advisory locking support.
952  @discussion Advisory locking operations will not call down to the filesystem if this flag is set.
953  @param mp Mount to mark.
954  @return void.
955  */
956void	vfs_setlocklocal(mount_t);
957
958/*!
959  @function vfs_authcache_ttl
960  @abstract Determine the time-to-live of cached authorized credentials for files in this filesystem.
961  @discussion If a filesystem is set to allow caching credentials, the VFS layer can authorize
962  previously-authorized actions from the same vfs_context_t without calling down to the filesystem (though
963  it will not deny based on the cache).
964  @param mp Mount for which to check cache lifetime.
965  @return  Cache lifetime in seconds.  CACHED_RIGHT_INFINITE_TTL indicates that credentials never expire.
966  */
967int	vfs_authcache_ttl(mount_t);
968
969/*!
970  @function vfs_setauthcache_ttl
971  @abstract Enable credential caching and set  time-to-live of cached authorized credentials for files in this filesystem.
972  @discussion If a filesystem is set to allow caching credentials, the VFS layer can authorize
973  previously-authorized actions from the same vfs_context_t without calling down to the filesystem (though
974  it will not deny based on the cache).
975  @param mp Mount for which to set cache lifetime.
976  @return void.
977  */
978void	vfs_setauthcache_ttl(mount_t, int);
979
980/*!
981  @function vfs_clearauthcache_ttl
982  @abstract Remove time-to-live controls for cached credentials on a filesytem.  Filesystems with remote authorization
983  decisions (opaque) will still have KAUTH_VNODE_SEARCH rights cached for a default of CACHED_LOOKUP_RIGHT_TTL seconds.
984  @param mp Mount for which to clear cache lifetime.
985  @return void.
986  */
987void	vfs_clearauthcache_ttl(mount_t);
988
989/*
990 * return value from vfs_cachedrights_ttl if
991 * neither MNTK_AUTH_OPAQUE | MNTK_AUTH_CACHE_TTL
992 * is set in mnt_kern_flag.. it indicates
993 * that no TTL is being applied to the vnode rights cache
994 */
995#define CACHED_RIGHT_INFINITE_TTL	~0
996
997/*!
998  @function vfs_maxsymlen
999  @abstract Get the maximum length of a symbolic link on a filesystem.
1000  @param mp Mount from which to get symlink length cap.
1001  @return Max symlink length.
1002  */
1003uint32_t vfs_maxsymlen(mount_t);
1004
1005/*!
1006  @function vfs_setmaxsymlen
1007  @abstract Set the maximum length of a symbolic link on a filesystem.
1008  @param mp Mount on which to set symlink length cap.
1009  @param symlen Length to set.
1010  @return Max symlink length.
1011  */
1012void	vfs_setmaxsymlen(mount_t, uint32_t);
1013
1014/*!
1015  @function vfs_fsprivate
1016  @abstract Get filesystem-private mount data.
1017  @discussion A filesystem generally has an internal mount structure which it attaches to the VFS-level mount structure
1018  as part of the mounting process.
1019  @param mp Mount for which to get private data.
1020  @return Private data.
1021  */
1022void *	vfs_fsprivate(mount_t);
1023
1024/*!
1025  @function vfs_setfsprivate
1026  @abstract Set filesystem-private mount data.
1027  @discussion A filesystem generally has an internal mount structure which it attaches to the VFS-level mount structure
1028  as part of the mounting process.
1029  @param mp Mount for which to set private data.
1030  @return Void.
1031  */
1032void	vfs_setfsprivate(mount_t, void *mntdata);
1033
1034/*!
1035  @function vfs_statfs
1036  @abstract Get information about filesystem status.
1037  @discussion Each filesystem has a struct vfsstatfs associated with it which is updated as events occur; this function
1038  returns a pointer to it.  Note that the data in the structure will continue to change over time and also that it may
1039  be quite stale of vfs_update_vfsstat has not been called recently.
1040  @param mp Mount for which to get vfsstatfs pointer.
1041  @return Pointer to vfsstatfs.
1042  */
1043struct vfsstatfs *	vfs_statfs(mount_t);
1044#define	VFS_USER_EVENT		0
1045#define	VFS_KERNEL_EVENT	1
1046
1047/*!
1048  @function vfs_update_vfsstat
1049  @abstract Update cached filesystem status information in the VFS mount structure.
1050  @discussion Each filesystem has a struct vfsstatfs associated with it which is updated as events occur; this function
1051  updates it so that the structure pointer returned by vfs_statfs() returns a pointer to fairly recent data.
1052  @param mp Mount for which to update cached status information.
1053  @param ctx Context to authenticate against for call down to filesystem.
1054  @param eventtype VFS_USER_EVENT: need for update is driven by user-level request; perform additional authentication.
1055  VFS_KERNEL_EVENT: need for update is driven by in-kernel events.  Skip extra authentication.
1056  @return 0 for success, or an error code for authentication failure or problem with call to filesystem to
1057  request information.
1058  */
1059int	vfs_update_vfsstat(mount_t, vfs_context_t, int eventtype);
1060
1061/*!
1062  @function vfs_typenum
1063  @abstract Get (archaic) filesystem type number.
1064  @discussion Filesystem type numbers are an old construct; most filesystems just get a number assigned based on
1065  the order in which they are registered with the system.
1066  @param mp Mount for which to get type number.
1067  @return Type number.
1068  */
1069int	vfs_typenum(mount_t);
1070
1071/*!
1072  @function vfs_name
1073  @abstract Copy filesystem name into a buffer.
1074  @discussion Get filesystem name; this refers to the filesystem type of which a mount is an instantiation,
1075  rather than a name specific to the mountpoint.
1076  @param mp Mount for which to get name.
1077  @param buffer Destination for name; length should be at least MFSNAMELEN.
1078  @return void.
1079  */
1080void	vfs_name(mount_t, char *);
1081
1082/*!
1083  @function vfs_devblocksize
1084  @abstract Get the block size of the device underlying a mount.
1085  @param mp Mount for which to get block size.
1086  @return Block size.
1087  */
1088int	vfs_devblocksize(mount_t);
1089
1090/*!
1091  @function vfs_ioattr
1092  @abstract Get I/O attributes associated with a mounpoint.
1093  @param mp Mount for which to get attributes.  If NULL, system defaults are filled into ioattrp.
1094  @param ioattrp Destination for results.
1095  @return void.
1096  */
1097void	vfs_ioattr(mount_t, struct vfsioattr *);
1098
1099/*!
1100  @function vfs_setioattr
1101  @abstract Set I/O attributes associated with a mounpoint.
1102  @param mp Mount for which to set attributes.
1103  @param ioattrp Structure containing I/O parameters; all fields must be filled in.
1104  @return void.
1105  */
1106void	vfs_setioattr(mount_t, struct vfsioattr *);
1107
1108/*!
1109  @function vfs_64bitready
1110  @abstract Check if the filesystem associated with a mountpoint is marked ready for interaction with 64-bit user processes.
1111  @param mp Mount to test.
1112  @return Nonzero if filesystem is ready for 64-bit; 0 otherwise.
1113  */
1114int 	vfs_64bitready(mount_t);
1115
1116
1117#define LK_NOWAIT 1
1118/*!
1119  @function vfs_busy
1120  @abstract "Busy" a mountpoint.
1121  @discussion vfs_busy() will "busy" a mountpoint, preventing unmounts from taking off, by taking its reader-writer lock
1122  in a shared manner.  If a mount is dead,
1123  it will fail; if an unmount is in progress, depending on flags, it will either fail immediately or block
1124  until the unmount completes (then failing if the unmount has succeeded, or potentially succeeding if unmounting failed).
1125  A successful vfs_busy() must be followed by a vfs_unbusy() to release the lock on the mount.
1126  @param mp Mount to busy.
1127  @param flags LK_NOWAIT: fail with ENOENT if an unmount is in progress.
1128  @return 0 for success, with a lock held; an error code otherwise, with no lock held.
1129  */
1130int	vfs_busy(mount_t, int);
1131
1132/*!
1133  @function vfs_unbusy
1134  @abstract "Unbusy" a mountpoint by releasing its read-write lock.
1135  @discussion A successful vfs_busy() must be followed by a vfs_unbusy() to release the lock on the mount.
1136  @param mp Mount to unbusy.
1137  @return void.
1138  */
1139void	vfs_unbusy(mount_t);
1140
1141/*!
1142  @function vfs_getnewfsid
1143  @abstract Generate a unique filesystem ID for a mount and store it in the mount structure.
1144  @discussion Filesystem IDs are returned as part of "struct statfs."  This function is typically
1145  called as part of file-system specific mount code (i.e. through VFS_MOUNT).
1146  @param mp Mount to set an ID for.
1147  @return void.
1148  */
1149void	vfs_getnewfsid(struct mount *);
1150
1151/*!
1152  @function vfs_getvfs
1153  @abstract Given a filesystem ID, look up a mount structure.
1154  @param fsid Filesystem ID to look up.
1155  @return Mountpoint if found, else NULL.  Note unmounting mountpoints can be returned.
1156  */
1157mount_t	vfs_getvfs(fsid_t *);
1158
1159/*!
1160  @function vfs_mountedon
1161  @abstract Check whether a given block device has a filesystem mounted on it.
1162  @discussion Note that this is NOT a check for a covered vnode (the directory upon which
1163  a filesystem is mounted)--it is a test for whether a block device is being used as the source
1164  of a filesystem.  Note that a block device marked as being mounted on cannot be opened.
1165  @param vp The vnode to test.
1166  @return EBUSY if vnode is indeed the source of a filesystem; 0 if it is not.
1167  */
1168int	vfs_mountedon(struct vnode *);
1169
1170/*!
1171  @function vfs_unmountbyfsid
1172  @abstract Find a filesystem by ID and unmount it.
1173  @param fsid ID of filesystem to unmount, as found through (for example) statfs.
1174  @param flags MNT_FORCE: forcibly invalidate files open on the mount (though in-flight I/O operations
1175  will be allowed to complete).
1176  @param ctx Context against which to authenticate unmount operation.
1177  @return 0 for succcess, nonero for failure.
1178  */
1179int	vfs_unmountbyfsid(fsid_t *, int, vfs_context_t);
1180
1181/*!
1182  @function vfs_event_signal
1183  @abstract Post a kqueue-style event on a filesystem (EVFILT_FS).
1184  @param fsid Unused.
1185  @param event Events to post.
1186  @param data Unused.
1187  @return void.
1188  */
1189void	vfs_event_signal(fsid_t *, u_int32_t, intptr_t);
1190/*!
1191  @function vfs_event_init
1192  @abstract This function should not be called by kexts.
1193  */
1194void	vfs_event_init(void); /* XXX We should not export this */
1195#ifdef KERNEL_PRIVATE
1196int	vfs_getbyid(fsid_t *fsid, ino64_t ino, vnode_t *vpp, vfs_context_t ctx);
1197int	vfs_getattr(mount_t mp, struct vfs_attr *vfa, vfs_context_t ctx);
1198int	vfs_setattr(mount_t mp, struct vfs_attr *vfa, vfs_context_t ctx);
1199int	vfs_extendedsecurity(mount_t);
1200mount_t	vfs_getvfs_by_mntonname(char *);
1201vnode_t vfs_vnodecovered(mount_t mp); /* Returns vnode with an iocount that must be released with vnode_put() */
1202vnode_t vfs_devvp(mount_t mp); /* Please see block comment with implementation */
1203int vfs_nativexattrs (mount_t mp); /* whether or not the FS supports EAs natively */
1204void *  vfs_mntlabel(mount_t mp); /* Safe to cast to "struct label*"; returns "void*" to limit dependence of mount.h on security headers.  */
1205void	vfs_setcompoundopen(mount_t mp);
1206uint64_t vfs_throttle_mask(mount_t mp);
1207
1208struct vnode_trigger_info;
1209
1210/*!
1211 @function vfs_addtrigger
1212 @abstract Create an "external" trigger vnode: look up a vnode and mark it as
1213 a trigger.  Can only safely be called in the context of a callback set by
1214 vfs_settriggercallback().  May only be used on a file which is not already
1215 marked as a trigger.
1216 @param relpath Path relative to root of mountpoint at which to mark trigger.
1217 @param vtip Information about trigger; analogous to "vnode_trigger_param"
1218 	argument to vnode_create.
1219 @param ctx Authorization context.
1220 */
1221int 	vfs_addtrigger(mount_t mp, const char *relpath, struct vnode_trigger_info *vtip, vfs_context_t ctx);
1222
1223
1224/*!
1225 @enum vfs_trigger_callback_op_t
1226 @abstract Operation to perform after an attempted unmount (successful or otherwise).
1227 @constant VTC_REPLACE Unmount failed: attempt to replace triggers.  Only valid
1228 	VFS operation to perform in this context is vfs_addtrigger().
1229 @constant VTC_RELEASE Unmount succeeded: release external triggering context.
1230 */
1231typedef enum {
1232	VTC_REPLACE,
1233	VTC_RELEASE
1234} vfs_trigger_callback_op_t;
1235
1236/*!
1237 @typedef vfs_trigger_callback_t
1238 @abstract Callback to be passed to vfs_settriggercallback() and invoked from
1239 	unmount context.
1240 @param mp Mountpoint on which unmount is occurring.
1241 @param op Operation (see vfs_trigger_callback_op_t)
1242 @param data Context passed to vfs_settriggercallback()
1243 @param ctx Authorization context in which unmount is occurring.
1244 */
1245typedef void vfs_trigger_callback_t(mount_t mp, vfs_trigger_callback_op_t op, void *data, vfs_context_t ctx);
1246
1247/*!
1248  @function vfs_settriggercallback
1249  @abstract Install a callback to be called after unmount attempts on a volume,
1250  to restore triggers for failed unmounts and release state for successful ones.
1251  @discussion Installs a callback which will be called in two situations: a
1252  failed unmount where vnodes may have been reclaimed and a successful unmount.
1253  Gives an external trigger-marking entity an opportunity to replace triggers
1254  which may have been reclaimed.  The callback can only be installed (not
1255  cleared), and only one callback can be installed.  The callback will be called
1256  with a read-write lock held on the mount point; in the VTC_REPLACE case, the
1257  <em>only</em> valid VFS operation to perform in the context of the callback is
1258  vfs_addtrigger() on the mountpoint in question.  This rwlock is held in order
1259  to attempt to provide some modicum of coverage from lookups which might find
1260  missing trigger vnodes and receive spurious ENOENTs.  Note that this
1261  protection is incomplete--current working directories, or traversals up into a
1262  volume via ".." may still find missing triggers.  As of this writing, no
1263  serialization mechanism exists to do better than this.
1264  When the "op" is VTC_RELEASE, the mountpoint is going away, and the only valid
1265  VFS operation is to free the  private data pointer if needed.  The callback
1266  will be called immediately, with VTC_REPLACE, from vfs_settriggercallback(),
1267  if installation is successful.
1268  @param fsid FSID for filesystem in question.
1269  @param vtc Callback pointer.
1270  @param data Context pointer to be passed to callback.
1271  @param flags Currently unused.
1272  @param ctx Authorization context.
1273  @return 0 for success.  EBUSY if a trigger has already been installed.
1274  */
1275int 	vfs_settriggercallback(fsid_t *fsid, vfs_trigger_callback_t vtc, void *data, uint32_t flags, vfs_context_t ctx);
1276
1277#endif	/* KERNEL_PRIVATE */
1278__END_DECLS
1279
1280#endif /* KERNEL */
1281
1282#ifndef KERNEL
1283
1284/*
1285 * Generic file handle
1286 */
1287#define	NFS_MAX_FH_SIZE		NFSV4_MAX_FH_SIZE
1288#define	NFSV4_MAX_FH_SIZE	128
1289#define	NFSV3_MAX_FH_SIZE	64
1290#define	NFSV2_MAX_FH_SIZE	32
1291struct fhandle {
1292	int		fh_len;				/* length of file handle */
1293	unsigned char	fh_data[NFS_MAX_FH_SIZE];	/* file handle value */
1294};
1295typedef struct fhandle	fhandle_t;
1296
1297
1298__BEGIN_DECLS
1299int	fhopen(const struct fhandle *, int);
1300int	fstatfs(int, struct statfs *) __DARWIN_INODE64(fstatfs);
1301#if !__DARWIN_ONLY_64_BIT_INO_T
1302int	fstatfs64(int, struct statfs64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
1303#endif /* !__DARWIN_ONLY_64_BIT_INO_T */
1304int	getfh(const char *, fhandle_t *);
1305int	getfsstat(struct statfs *, int, int) __DARWIN_INODE64(getfsstat);
1306#if !__DARWIN_ONLY_64_BIT_INO_T
1307int	getfsstat64(struct statfs64 *, int, int) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
1308#endif /* !__DARWIN_ONLY_64_BIT_INO_T */
1309int	getmntinfo(struct statfs **, int) __DARWIN_INODE64(getmntinfo);
1310#if !__DARWIN_ONLY_64_BIT_INO_T
1311int	getmntinfo64(struct statfs64 **, int) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
1312#endif /* !__DARWIN_ONLY_64_BIT_INO_T */
1313int	mount(const char *, const char *, int, void *);
1314int	statfs(const char *, struct statfs *) __DARWIN_INODE64(statfs);
1315#if !__DARWIN_ONLY_64_BIT_INO_T
1316int	statfs64(const char *, struct statfs64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
1317#endif /* !__DARWIN_ONLY_64_BIT_INO_T */
1318int	unmount(const char *, int);
1319int	getvfsbyname(const char *, struct vfsconf *);
1320__END_DECLS
1321
1322#endif /* KERNEL */
1323#endif /* !_SYS_MOUNT_H_ */
1324