]> git.saurik.com Git - apple/xnu.git/blame - bsd/sys/mount.h
xnu-1699.24.8.tar.gz
[apple/xnu.git] / bsd / sys / mount.h
CommitLineData
1c79356b 1/*
060df5ea 2 * Copyright (c) 2000-2010 Apple Inc. All rights reserved.
5d5c5d0d 3 *
2d21ac55 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
1c79356b 5 *
2d21ac55
A
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.
8f6c56a5 14 *
2d21ac55
A
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
8f6c56a5
A
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
2d21ac55
A
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.
8f6c56a5 25 *
2d21ac55 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
1c79356b
A
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 */
2d21ac55
A
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
1c79356b
A
70
71#ifndef _SYS_MOUNT_H_
72#define _SYS_MOUNT_H_
73
9bccf70c 74#include <sys/appleapiopts.h>
91447636
A
75#include <sys/cdefs.h>
76#include <sys/attr.h> /* needed for vol_capabilities_attr_t */
77
1c79356b 78#ifndef KERNEL
91447636 79#include <stdint.h>
1c79356b 80#include <sys/ucred.h>
91447636 81#include <sys/queue.h> /* XXX needed for user builds */
593a1d5f 82#include <Availability.h>
91447636
A
83#else
84#include <sys/kernel_types.h>
b0d623f7 85#include <uuid/uuid.h>
1c79356b 86#endif
1c79356b
A
87
88typedef struct fsid { int32_t val[2]; } fsid_t; /* file system id type */
89
1c79356b
A
90/*
91 * file system statistics
92 */
93
94#define MFSNAMELEN 15 /* length of fs type name, not inc. null */
2d21ac55 95#define MFSTYPENAMELEN 16 /* length of fs type name including null */
b0d623f7
A
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 */
1c79356b 102
2d21ac55
A
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
593a1d5f
A
122#if !__DARWIN_ONLY_64_BIT_INO_T
123
2d21ac55
A
124struct statfs64 __DARWIN_STRUCT_STATFS64;
125
593a1d5f
A
126#endif /* !__DARWIN_ONLY_64_BIT_INO_T */
127
2d21ac55
A
128#if __DARWIN_64_BIT_INO_T
129
130struct statfs __DARWIN_STRUCT_STATFS64;
131
132#else /* !__DARWIN_64_BIT_INO_T */
133
91447636
A
134/*
135 * LP64 - WARNING - must be kept in sync with struct user_statfs in mount_internal.h.
136 */
1c79356b
A
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 */
2d21ac55 151 long f_flags; /* copy of mount exported flags */
1c79356b
A
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 */
1c79356b
A
156 char f_reserved3; /* For alignment */
157 long f_reserved4[4]; /* For future use */
1c79356b
A
158};
159
2d21ac55 160#endif /* __DARWIN_64_BIT_INO_T */
91447636 161
0c530ab8 162#pragma pack(4)
91447636
A
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
0c530ab8 183#pragma pack()
91447636 184
2d21ac55
A
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
91447636
A
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)
b0d623f7 225#define VFSATTR_f_uuid (1LL<< 24)
91447636 226
1c79356b 227/*
2d21ac55 228 * Argument structure.
1c79356b 229 */
0c530ab8 230#pragma pack(4)
b0d623f7
A
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 */
91447636
A
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 */
b0d623f7 271 uuid_t f_uuid; /* file system UUID (version 3 or 5), available in 10.6 and later */
1c79356b 272};
91447636 273
0c530ab8 274#pragma pack()
1c79356b 275
2d21ac55
A
276#endif /* KERNEL */
277
1c79356b
A
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 */
d1ecb069 290#define MNT_CPROTECT 0x00000080 /* file system supports content protection */
1c79356b
A
291
292/*
293 * NFS export related mount flags.
294 */
1c79356b 295#define MNT_EXPORTED 0x00000100 /* file system is exported */
1c79356b 296
2d21ac55
A
297/*
298 * MAC labeled / "quarantined" flag
299 */
300#define MNT_QUARANTINE 0x00000400 /* file system is quarantined */
301
1c79356b
A
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 */
2d21ac55
A
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 */
6d2010ae
A
319#ifdef BSD_KERNEL_PRIVATE
320/* #define MNT_IMGSRC_BY_INDEX 0x20000000 see sys/imgsrc.h */
321#endif /* BSD_KERNEL_PRIVATE */
2d21ac55
A
322
323/* backwards compatibility only */
324#define MNT_UNKNOWNPERMISSIONS MNT_IGNORE_OWNERSHIP
325
1c79356b
A
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 | \
2d21ac55
A
333 MNT_ASYNC | MNT_EXPORTED | MNT_QUARANTINE | \
334 MNT_LOCAL | MNT_QUOTA | \
1c79356b 335 MNT_ROOTFS | MNT_DOVOLFS | MNT_DONTBROWSE | \
2d21ac55 336 MNT_IGNORE_OWNERSHIP | MNT_AUTOMOUNTED | MNT_JOURNALED | \
6d2010ae
A
337 MNT_NOUSERXATTR | MNT_DEFWRITE | MNT_MULTILABEL | \
338 MNT_NOATIME | MNT_CPROTECT)
1c79356b
A
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 */
1c79356b
A
346#define MNT_RELOAD 0x00040000 /* reload filesystem data */
347#define MNT_FORCE 0x00080000 /* force unmount or readonly change */
91447636
A
348#define MNT_CMDFLAGS (MNT_UPDATE|MNT_RELOAD|MNT_FORCE)
349
350
1c79356b 351
1c79356b
A
352/*
353 * Sysctl CTL_VFS definitions.
354 *
355 * Second level identifier specifies which filesystem. Second level
356 * identifier VFS_GENERIC returns information about all filesystems.
357 */
358#define VFS_GENERIC 0 /* generic filesystem information */
359#define VFS_NUMMNTOPS 1 /* int: total num of vfs mount/unmount operations */
360/*
361 * Third level identifiers for VFS_GENERIC are given below; third
362 * level identifiers for specific filesystems are given in their
363 * mount specific header files.
364 */
365#define VFS_MAXTYPENUM 1 /* int: highest defined filesystem type */
366#define VFS_CONF 2 /* struct: vfsconf for filesystem given
367 as next argument */
91447636 368#define VFS_SET_PACKAGE_EXTS 3 /* set package extension list */
55e303ae 369
1c79356b
A
370/*
371 * Flags for various system call interfaces.
372 *
373 * waitfor flags to vfs_sync() and getfsstat()
374 */
b0d623f7 375#define MNT_WAIT 1 /* synchronized I/O file integrity completion */
1c79356b 376#define MNT_NOWAIT 2 /* start all I/O, but do not wait for it */
b0d623f7 377#define MNT_DWAIT 4 /* synchronized I/O data integrity completion */
1c79356b 378
1c79356b 379
91447636
A
380#ifndef KERNEL
381struct mount;
382typedef struct mount * mount_t;
383struct vnode;
384typedef struct vnode * vnode_t;
385#endif
1c79356b 386
b0d623f7 387/* Reserved fields preserve binary compatibility */
1c79356b 388struct vfsconf {
b0d623f7 389 uint32_t vfc_reserved1; /* opaque */
1c79356b
A
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 */
b0d623f7
A
394 uint32_t vfc_reserved2; /* opaque */
395 uint32_t vfc_reserved3; /* opaque */
1c79356b
A
396};
397
55e303ae
A
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
91447636 406
55e303ae
A
407/* vfsidctl API version. */
408#define VFS_CTL_VERS1 0x01
409
91447636 410#ifdef KERNEL
91447636
A
411struct user_vfsidctl {
412 int vc_vers; /* should be VFSIDCTL_VERS1 (below) */
413 fsid_t vc_fsid; /* fsid to operate on. */
0c530ab8 414 user_addr_t vc_ptr __attribute((aligned(8))); /* pointer to data structure. */
91447636
A
415 user_size_t vc_len; /* sizeof said structure. */
416 u_int32_t vc_spare[12]; /* spare (must be zero). */
417};
418
b0d623f7
A
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
91447636
A
432#endif /* KERNEL */
433
55e303ae
A
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 */
e5568f75 443#define VFS_CTL_NOLOCKS 0x00010006 /* disable file locking */
6d2010ae 444#define VFS_CTL_SADDR 0x00010007 /* get server address */
55e303ae
A
445
446struct vfsquery {
447 u_int32_t vq_flags;
448 u_int32_t vq_spare[31];
449};
450
451/* vfsquery flags */
452#define VQ_NOTRESP 0x0001 /* server down */
453#define VQ_NEEDAUTH 0x0002 /* server bad auth */
454#define VQ_LOWDISK 0x0004 /* we're low on space */
455#define VQ_MOUNT 0x0008 /* new filesystem arrived */
456#define VQ_UNMOUNT 0x0010 /* filesystem has left */
457#define VQ_DEAD 0x0020 /* filesystem is dead, needs force unmount */
91447636 458#define VQ_ASSIST 0x0040 /* filesystem needs assistance from external program */
e5568f75 459#define VQ_NOTRESPLOCK 0x0080 /* server lockd down */
91447636 460#define VQ_UPDATE 0x0100 /* filesystem information has changed */
b0d623f7
A
461#define VQ_VERYLOWDISK 0x0200 /* file system has *very* little disk space left */
462#define VQ_SYNCEVENT 0x0400 /* a sync just happened */
55e303ae
A
463#define VQ_FLAG0800 0x0800 /* placeholder */
464#define VQ_FLAG1000 0x1000 /* placeholder */
465#define VQ_FLAG2000 0x2000 /* placeholder */
466#define VQ_FLAG4000 0x4000 /* placeholder */
467#define VQ_FLAG8000 0x8000 /* placeholder */
468
55e303ae 469
9bccf70c 470#ifdef KERNEL
1c79356b 471
91447636
A
472/* Structure for setting device IO parameters per mount point */
473struct vfsioattr {
474 u_int32_t io_maxreadcnt; /* Max. byte count for read */
475 u_int32_t io_maxwritecnt; /* Max. byte count for write */
476 u_int32_t io_segreadcnt; /* Max. segment count for read */
477 u_int32_t io_segwritecnt; /* Max. segment count for write */
478 u_int32_t io_maxsegreadsize; /* Max. segment read size */
479 u_int32_t io_maxsegwritesize; /* Max. segment write size */
480 u_int32_t io_devblocksize; /* the underlying device block size */
2d21ac55
A
481 u_int32_t io_flags; /* flags for underlying device */
482 void * io_reserved[2]; /* extended attribute information */
91447636
A
483};
484
060df5ea
A
485#define VFS_IOATTR_FLAGS_FUA 0x01 /* Write-through cache supported */
486#define VFS_IOATTR_FLAGS_UNMAP 0x02 /* Unmap (trim) supported */
1c79356b
A
487
488/*
91447636 489 * Filesystem Registration information
1c79356b 490 */
2d21ac55
A
491#define VFS_TBLTHREADSAFE 0x0001
492#define VFS_TBLFSNODELOCK 0x0002
493#define VFS_TBLNOTYPENUM 0x0008
494#define VFS_TBLLOCALVOL 0x0010
495#define VFS_TBL64BITREADY 0x0020
496#define VFS_TBLNATIVEXATTR 0x0040
497#define VFS_TBLDIRLINKS 0x0080
498#define VFS_TBLUNMOUNT_PREFLIGHT 0x0100 /* does a preflight check before unmounting */
499#define VFS_TBLGENERICMNTARGS 0x0200 /* force generic mount args for local fs */
500#define VFS_TBLREADDIR_EXTENDED 0x0400 /* fs supports VNODE_READDIR_EXTENDED */
501#define VFS_TBLNOMACLABEL 0x1000
b0d623f7
A
502#define VFS_TBLVNOP_PAGEINV2 0x2000
503#define VFS_TBLVNOP_PAGEOUTV2 0x4000
504
91447636
A
505
506struct vfs_fsentry {
507 struct vfsops * vfe_vfsops; /* vfs operations */
508 int vfe_vopcnt; /* # of vnodeopv_desc being registered (reg, spec, fifo ...) */
509 struct vnodeopv_desc ** vfe_opvdescs; /* null terminated; */
510 int vfe_fstypenum; /* historic filesystem type number */
511 char vfe_fsname[MFSNAMELEN]; /* filesystem type name */
512 uint32_t vfe_flags; /* defines the FS capabilities */
513 void * vfe_reserv[2]; /* reserved for future use; set this to zero*/
514 };
515
516
1c79356b
A
517
518struct vfsops {
b0d623f7
A
519 /*!
520 @function vfs_mount
521 @abstract Perform filesystem-specific operations required for mounting.
522 @discussion Typical operations include setting the mount-specific data with vfs_setfsprivate().
523 Note that if a mount call fails, the filesystem must clean up any state it has constructed, because
524 vfs-level mount code will not clean it up.
525 @param mp Mount structure for the newly mounted filesystem.
526 @param devvp Device that the filesystem is mounted from.
527 @param data Filesystem-specific data passed down from userspace.
528 @param context Context to authenticate for mount.
529 @return 0 for success, else an error code. Once success is returned, the filesystem should be ready to go active;
530 VFS will not ask again.
531 */
91447636 532 int (*vfs_mount)(struct mount *mp, vnode_t devvp, user_addr_t data, vfs_context_t context);
b0d623f7
A
533
534 /*!
535 @function vfs_start
536 @abstract Mark a mount as ready to be used.
537 @discussion After receiving this calldown, a filesystem will be hooked into the mount list and should expect
538 calls down from the VFS layer.
539 @param mp Mount structure being activated.
540 @param flags Unused.
541 @param context Context to authenticate for mount.
542 @return Return value is ignored.
543 */
91447636 544 int (*vfs_start)(struct mount *mp, int flags, vfs_context_t context);
b0d623f7
A
545
546 /*!
547 @function vfs_unmount
548 @abstract Perform filesystem-specific cleanup as part of unmount.
549 @discussion If the unmount downcall succeeds, VFS considers itself authorized to destroy all
550 state related to the mount.
551 @param mp Mount structure to unmount.
552 @param mntflags MNT_FORCE indicates that we wish to unmount even if there are active vnodes.
553 @param context Context to authenticate for unmount.
554 @return 0 for success, else an error code.
555 */
91447636 556 int (*vfs_unmount)(struct mount *mp, int mntflags, vfs_context_t context);
b0d623f7
A
557
558 /*!
559 @function vfs_root
560 @abstract Get the root vnode of a filesystem.
561 @discussion Upon success, should return with an iocount held on the root vnode which the caller will
562 drop with vnode_put().
563 @param mp Mount for which to get the root.
564 @param vpp Destination for root vnode.
565 @param context Context to authenticate for getting the root.
566 @return 0 for success, else an error code.
567 */
91447636 568 int (*vfs_root)(struct mount *mp, struct vnode **vpp, vfs_context_t context);
b0d623f7
A
569
570 /*!
571 @function vfs_quotactl
572 @abstract Manipulate quotas for a volume.
573 @param mp Mount for which to manipulate quotas.
574 @param cmds Detailed in "quotactl" manual page.
575 @param uid Detailed in "quotactl" manual page.
576 @param arg Detailed in "quotactl" manual page.
577 @param context Context to authenticate for changing quotas.
578 @return 0 for success, else an error code.
579 */
91447636 580 int (*vfs_quotactl)(struct mount *mp, int cmds, uid_t uid, caddr_t arg, vfs_context_t context);
b0d623f7
A
581
582 /*!
583 @function vfs_getattr
584 @abstract Get filesystem attributes.
585 @discussion See VFSATTR_RETURN, VFSATTR_ACTIVE, VFSATTR_SET_SUPPORTED, VFSATTR_WANTED macros.
586 @param mp Mount for which to get parameters.
587 @param vfa Container for specifying which attributes are desired and which attributes the filesystem
588 supports, as well as for returning results.
589 @param ctx Context to authenticate for getting filesystem attributes.
590 @return 0 for success, else an error code.
591 */
91447636
A
592 int (*vfs_getattr)(struct mount *mp, struct vfs_attr *, vfs_context_t context);
593/* int (*vfs_statfs)(struct mount *mp, struct vfsstatfs *sbp, vfs_context_t context);*/
b0d623f7
A
594
595 /*!
596 @function vfs_sync
597 @abstract Flush all filesystem data to backing store.
598 @discussion vfs_sync will be called as part of the sync() system call and during unmount.
599 @param mp Mountpoint to sync.
600 @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.
601 @param ctx Context to authenticate for the sync.
602 @return 0 for success, else an error code.
603 */
91447636 604 int (*vfs_sync)(struct mount *mp, int waitfor, vfs_context_t context);
b0d623f7
A
605
606 /*!
607 @function vfs_vget
608 @abstract Get a vnode by file id (inode number).
609 @discussion This routine is chiefly used to build paths to vnodes. Result should be turned with an iocount that the
610 caller will drop with vnode_put().
611 @param mp Mount against which to look up inode number.
612 @param ino File ID for desired file, as found through a readdir.
613 @param vpp Destination for vnode.
614 @return 0 for success, else an error code.
615 */
91447636 616 int (*vfs_vget)(struct mount *mp, ino64_t ino, struct vnode **vpp, vfs_context_t context);
b0d623f7
A
617
618 /*!
619 @function vfs_fhtovp
620 @abstract Get the vnode corresponding to a file handle.
621 @discussion Filesystems can return handles to files which are independent of their (transient) vnode identities.
622 vfs_thtovp converts that persistent handle back to a vnode. The vnode should be returned with an iocount which
623 the caller will drop with vnode_put().
624 @param mp Mount against which to look up file handle.
625 @param fhlen Size of file handle structure, as returned by vfs_vptofh.
626 @param fhp Pointer to handle.
627 @param vpp Destination for vnode.
628 @param ctx Context against which to authenticate the file-handle conversion.
629 @return 0 for success, else an error code.
630 */
91447636
A
631 int (*vfs_fhtovp)(struct mount *mp, int fhlen, unsigned char *fhp, struct vnode **vpp,
632 vfs_context_t context);
b0d623f7
A
633
634 /*!
635 @function vfs_vptofh
636 @abstract Get a persistent handle corresponding to a vnode.
637 @param mp Mount against which to convert the vnode to a handle.
638 @param fhlen Size of buffer provided for handle; set to size of actual handle returned.
639 @param fhp Pointer to buffer in which to place handle data.
640 @param ctx Context against which to authenticate the file-handle request.
641 @return 0 for success, else an error code.
642 */
91447636 643 int (*vfs_vptofh)(struct vnode *vp, int *fhlen, unsigned char *fhp, vfs_context_t context);
b0d623f7
A
644
645 /*!
646 @function vfs_init
647 @abstract Prepare a filesystem for having instances mounted.
648 @discussion This routine is called once, before any particular instance of a filesystem
649 is mounted; it allows the filesystem to initialize whatever global data structures
650 are shared across all mounts. If this returns successfully, a filesystem should be ready to have
651 instances mounted.
652 @param vfsconf Configuration information. Currently, the only useful data are the filesystem name,
653 typenum, and flags. The flags field will be either 0 or MNT_LOCAL. Many filesystems ignore this
654 parameter.
655 @return 0 for success, else an error code.
656 */
91447636 657 int (*vfs_init)(struct vfsconf *);
b0d623f7
A
658
659 /*!
660 @function vfs_sysctl
661 @abstract Broad interface for querying and controlling filesystem.
662 @discussion VFS defines VFS_CTL_QUERY as a generic status request which is answered
663 with the VQ_* macros in a "struct vfsquery."
664 A filesystem may also define implementation-specific commands. See "man 3 sysctl"
665 for the meaning of sysctl parameters.
666 @param context Context against which to authenticate command.
667 @return 0 for success, else an error code.
668 */
91447636 669 int (*vfs_sysctl)(int *, u_int, user_addr_t, size_t *, user_addr_t, size_t, vfs_context_t context);
b0d623f7
A
670
671 /*!
672 @function vfs_setattr
673 @abstract Set filesystem attributes.
674 @discussion The other side of the vfs_getattr coin. Currently only called to set volume name.
675 @param mp Mount on which to set attributes.
676 @param vfa VFS attribute structure containing requested attributes to set and their values. Currently
677 will only be called with f_vol_name set.
678 @param context Context against which to authenticate attribute change.
679 @return 0 for success, else an error code.
680 */
91447636
A
681 int (*vfs_setattr)(struct mount *mp, struct vfs_attr *, vfs_context_t context);
682 void *vfs_reserved[7];
1c79356b
A
683};
684
1c79356b
A
685
686/*
91447636 687 * flags passed into vfs_iterate
1c79356b 688 */
6d2010ae
A
689#ifdef PRIVATE
690#define VFS_ITERATE_TAIL_FIRST (1 << 0)
691#endif /* PRIVATE */
1c79356b
A
692
693/*
91447636 694 * return values from callback
1c79356b 695 */
91447636
A
696#define VFS_RETURNED 0 /* done with vnode, reference can be dropped */
697#define VFS_RETURNED_DONE 1 /* done with vnode, reference can be dropped, terminate iteration */
698#define VFS_CLAIMED 2 /* don't drop reference */
699#define VFS_CLAIMED_DONE 3 /* don't drop reference, terminate iteration */
1c79356b 700
91447636
A
701
702__BEGIN_DECLS
b0d623f7 703#ifdef BSD_KERNEL_PRIVATE
91447636
A
704extern int VFS_MOUNT(mount_t, vnode_t, user_addr_t, vfs_context_t);
705extern int VFS_START(mount_t, int, vfs_context_t);
706extern int VFS_UNMOUNT(mount_t, int, vfs_context_t);
707extern int VFS_ROOT(mount_t, vnode_t *, vfs_context_t);
708extern int VFS_QUOTACTL(mount_t, int, uid_t, caddr_t, vfs_context_t);
2d21ac55
A
709extern int VFS_GETATTR(mount_t, struct vfs_attr *, vfs_context_t);
710extern int VFS_SETATTR(mount_t, struct vfs_attr *, vfs_context_t);
91447636
A
711extern int VFS_SYNC(mount_t, int, vfs_context_t);
712extern int VFS_VGET(mount_t, ino64_t, vnode_t *, vfs_context_t);
713extern int VFS_FHTOVP(mount_t, int, unsigned char *, vnode_t *, vfs_context_t);
714extern int VFS_VPTOFH(vnode_t, int *, unsigned char *, vfs_context_t);
b0d623f7
A
715#endif /* BSD_KERNEL_PRIVATE */
716/*
717 * prototypes for exported VFS operations
718 */
91447636 719
b0d623f7
A
720/*!
721 @function vfs_fsadd
722 @abstract Register a filesystem with VFS.
723 @discussion Typically called by a filesystem Kernel Extension when it is loaded.
724 @param vfe Filesystem information: table of vfs operations, list of vnode operation tables,
725 filesystem type number (can be omitted with VFS_TBLNOTYPENUM flag), name, flags.
726 @param handle Opaque handle which will be passed to vfs_fsremove.
727 @return 0 for success, else an error code.
728 */
91447636 729int vfs_fsadd(struct vfs_fsentry *, vfstable_t *);
b0d623f7
A
730
731/*!
732 @function vfs_fsremove
733 @abstract Unregister a filesystem with VFS.
734 @discussion Typically called by a filesystem Kernel Extension when it is unloaded.
735 @param handle Handle which was returned by vfs_fsadd.
736 @return 0 for success, else an error code.
737 */
91447636 738int vfs_fsremove(vfstable_t);
b0d623f7
A
739
740/*!
741 @function vfs_iterate
742 @abstract Iterate over all mountpoints with a callback. Used, for example, by sync().
743 @param flags Unused.
744 @param callback Function which takes a mount and arbitrary passed-in "arg," and returns one of VFS_RETURNED_DONE or VFS_CLAIMED_DONE: end
745 iteration and return success. VFS_RETURNED or VFS_CLAIMED: continue iterating. Anything else: continue iterating.
746 @param arg Arbitrary data to pass to callback.
747 @return 0 for success, else an error code.
748 */
91447636
A
749int vfs_iterate(int, int (*)(struct mount *, void *), void *);
750
b0d623f7
A
751/*!
752 @function vfs_init_io_attributes
753 @abstract Set I/O attributes on a mountpoint based on device properties.
754 @param devvp Block device vnode from which a filesystem is being mounted.
755 @param mp Mountpoint whose I/O parameters to initialize.
756 @return 0 for success, else an error code.
757 */
758int vfs_init_io_attributes(vnode_t, mount_t);
759
760/*!
761 @function vfs_flags
762 @abstract Retrieve mount flags.
763 @discussion Results will be in the bitwise "OR" of MNT_VISFLAGMASK and MNT_CMDFLAGS.
764 @param mp Mount whose flags to grab.
765 @return Flags.
766 */
91447636 767uint64_t vfs_flags(mount_t);
b0d623f7
A
768
769/*!
770 @function vfs_setflags
771 @abstract Set flags on a mount.
772 @discussion Sets mount flags to the bitwise "OR" of their current value and the specified bits. Often
773 used by a filesystem as part of the mount process.
774 @param mp Mount whose flags to set.
775 @param flags Flags to activate. Must be in the bitwise "OR" of MNT_VISFLAGMASK and MNT_CMDFLAGS.
776 @return Flags.
777 */
91447636 778void vfs_setflags(mount_t, uint64_t);
b0d623f7
A
779
780/*!
781 @function vfs_clearflags
782 @abstract Clear flags on a mount.
783 @discussion Sets mount flags to the bitwise "AND" of their current value and the complement of the specified bits.
784 @param mp Mount whose flags to set.
785 @param flags Flags to deactivate. Must be in the bitwise "OR" of MNT_VISFLAGMASK and MNT_CMDFLAGS.
786 @return void.
787 */
91447636
A
788void vfs_clearflags(mount_t, uint64_t);
789
b0d623f7
A
790/*!
791 @function vfs_issynchronous
792 @abstract Determine if writes to a filesystem occur synchronously.
793 @param mp Mount to test.
794 @return Nonzero if writes occur synchronously, else 0.
795 */
91447636 796int vfs_issynchronous(mount_t);
b0d623f7
A
797
798/*!
799 @function vfs_iswriteupgrade
800 @abstract Determine if a filesystem is mounted read-only but a request has been made to upgrade
801 to read-write.
802 @param mp Mount to test.
803 @return Nonzero if a request has been made to update from read-only to read-write, else 0.
804 */
91447636 805int vfs_iswriteupgrade(mount_t);
b0d623f7
A
806
807/*!
808 @function vfs_isupdate
809 @abstract Determine if a mount update is in progress.
810 @param mp Mount to test.
811 @return Nonzero if a mount update is in progress, 0 otherwise.
812 */
91447636 813int vfs_isupdate(mount_t);
b0d623f7
A
814
815/*!
816 @function vfs_isreload
817 @abstract Determine if a reload of filesystem data is in progress. This can only be the case
818 for a read-only filesystem; all data is brought in from secondary storage.
819 @param mp Mount to test.
820 @return Nonzero if a request has been made to reload data, else 0.
821 */
91447636 822int vfs_isreload(mount_t);
b0d623f7
A
823
824/*!
825 @function vfs_isforce
826 @abstract Determine if a forced unmount is in progress.
827 @discussion A forced unmount invalidates open files.
828 @param mp Mount to test.
829 @return Nonzero if a request has been made to forcibly unmount, else 0.
830 */
91447636 831int vfs_isforce(mount_t);
b0d623f7
A
832
833/*!
834 @function vfs_isunmount
835 @abstract Determine if an unmount is in progress.
836 @discussion This is an unsynchronized snapshot of the mount state. It should only be called
837 if the mount is known to be valid, e.g. there are known to be live files on that volume.
838 @param mp Mount to test.
839 @return Nonzero if an unmount is in progress, else zero.
840 */
841int vfs_isunmount(mount_t mp);
842
843/*!
844 @function vfs_isrdonly
845 @abstract Determine if a filesystem is mounted read-only.
846 @param mp Mount to test.
847 @return Nonzero if filesystem is mounted read-only, else 0.
848 */
91447636 849int vfs_isrdonly(mount_t);
b0d623f7
A
850
851/*!
852 @function vfs_isrdwr
853 @abstract Determine if a filesystem is mounted with writes enabled.
854 @param mp Mount to test.
855 @return Nonzero if filesystem is mounted read-write, else 0.
856 */
91447636 857int vfs_isrdwr(mount_t);
b0d623f7
A
858
859/*!
860 @function vfs_authopaque
861 @abstract Determine if a filesystem's authorization decisions occur remotely.
862 @param mp Mount to test.
863 @return Nonzero if filesystem authorization is controlled remotely, else 0.
864 */
91447636 865int vfs_authopaque(mount_t);
b0d623f7
A
866
867/*!
868 @function vfs_authopaqueaccess
869 @abstract Check if a filesystem is marked as having reliable remote VNOP_ACCESS support.
870 @param mp Mount to test.
871 @return Nonzero if VNOP_ACCESS is supported remotely, else 0.
872 */
91447636 873int vfs_authopaqueaccess(mount_t);
b0d623f7
A
874
875/*!
876 @function vfs_setauthopaque
877 @abstract Mark a filesystem as having authorization decisions controlled remotely.
878 @param mp Mount to mark.
879 @return void.
880 */
91447636 881void vfs_setauthopaque(mount_t);
b0d623f7
A
882
883/*!
884 @function vfs_setauthopaqueaccess
885 @abstract Mark a filesystem as having remote VNOP_ACCESS support.
886 @param mp Mount to mark.
887 @return void.
888 */
91447636 889void vfs_setauthopaqueaccess(mount_t);
b0d623f7
A
890
891/*!
892 @function vfs_clearauthopaque
893 @abstract Mark a filesystem as not having remote authorization decisions.
894 @param mp Mount to mark.
895 @return void.
896 */
91447636 897void vfs_clearauthopaque(mount_t);
b0d623f7
A
898
899/*!
900 @function vfs_clearauthopaque
901 @abstract Mark a filesystem as not having remote VNOP_ACCESS support.
902 @param mp Mount to mark.
903 @return void.
904 */
91447636 905void vfs_clearauthopaqueaccess(mount_t);
b0d623f7
A
906
907/*!
908 @function vfs_setextendedsecurity
909 @abstract Mark a filesystem as supporting security controls beyond POSIX permissions.
910 @discussion Specific controls include ACLs, file owner UUIDs, and group UUIDs.
911 @param mp Mount to test.
912 @return void.
913 */
91447636 914void vfs_setextendedsecurity(mount_t);
b0d623f7
A
915
916/*!
917 @function vfs_clearextendedsecurity
918 @abstract Mark a filesystem as NOT supporting security controls beyond POSIX permissions.
919 @discussion Specific controls include ACLs, file owner UUIDs, and group UUIDs.
920 @param mp Mount to test.
921 @return void.
922 */
91447636 923void vfs_clearextendedsecurity(mount_t);
b0d623f7
A
924
925/*!
926 @function vfs_setlocklocal
927 @abstract Mark a filesystem as using VFS-level advisory locking support.
928 @discussion Advisory locking operations will not call down to the filesystem if this flag is set.
929 @param mp Mount to mark.
930 @return void.
931 */
91447636 932void vfs_setlocklocal(mount_t);
b0d623f7
A
933
934/*!
935 @function vfs_authcache_ttl
936 @abstract Determine the time-to-live of cached authorized credentials for files in this filesystem.
937 @discussion If a filesystem is set to allow caching credentials, the VFS layer can authorize
938 previously-authorized actions from the same vfs_context_t without calling down to the filesystem (though
939 it will not deny based on the cache).
940 @param mp Mount for which to check cache lifetime.
941 @return Cache lifetime in seconds. CACHED_RIGHT_INFINITE_TTL indicates that credentials never expire.
942 */
2d21ac55 943int vfs_authcache_ttl(mount_t);
b0d623f7
A
944
945/*!
946 @function vfs_setauthcache_ttl
947 @abstract Enable credential caching and set time-to-live of cached authorized credentials for files in this filesystem.
948 @discussion If a filesystem is set to allow caching credentials, the VFS layer can authorize
949 previously-authorized actions from the same vfs_context_t without calling down to the filesystem (though
950 it will not deny based on the cache).
951 @param mp Mount for which to set cache lifetime.
952 @return void.
953 */
2d21ac55 954void vfs_setauthcache_ttl(mount_t, int);
b0d623f7
A
955
956/*!
957 @function vfs_clearauthcache_ttl
958 @abstract Remove time-to-live controls for cached credentials on a filesytem. Filesystems with remote authorization
959 decisions (opaque) will still have KAUTH_VNODE_SEARCH rights cached for a default of CACHED_LOOKUP_RIGHT_TTL seconds.
960 @param mp Mount for which to clear cache lifetime.
961 @return void.
962 */
2d21ac55 963void vfs_clearauthcache_ttl(mount_t);
91447636 964
2d21ac55
A
965/*
966 * return value from vfs_cachedrights_ttl if
967 * neither MNTK_AUTH_OPAQUE | MNTK_AUTH_CACHE_TTL
968 * is set in mnt_kern_flag.. it indicates
969 * that no TTL is being applied to the vnode rights cache
970 */
971#define CACHED_RIGHT_INFINITE_TTL ~0
91447636 972
b0d623f7
A
973/*!
974 @function vfs_maxsymlen
975 @abstract Get the maximum length of a symbolic link on a filesystem.
976 @param mp Mount from which to get symlink length cap.
977 @return Max symlink length.
978 */
91447636 979uint32_t vfs_maxsymlen(mount_t);
b0d623f7
A
980
981/*!
982 @function vfs_setmaxsymlen
983 @abstract Set the maximum length of a symbolic link on a filesystem.
984 @param mp Mount on which to set symlink length cap.
985 @param symlen Length to set.
986 @return Max symlink length.
987 */
91447636 988void vfs_setmaxsymlen(mount_t, uint32_t);
b0d623f7
A
989
990/*!
991 @function vfs_fsprivate
992 @abstract Get filesystem-private mount data.
993 @discussion A filesystem generally has an internal mount structure which it attaches to the VFS-level mount structure
994 as part of the mounting process.
995 @param mp Mount for which to get private data.
996 @return Private data.
997 */
91447636 998void * vfs_fsprivate(mount_t);
b0d623f7
A
999
1000/*!
1001 @function vfs_setfsprivate
1002 @abstract Set filesystem-private mount data.
1003 @discussion A filesystem generally has an internal mount structure which it attaches to the VFS-level mount structure
1004 as part of the mounting process.
1005 @param mp Mount for which to set private data.
1006 @return Void.
1007 */
91447636
A
1008void vfs_setfsprivate(mount_t, void *mntdata);
1009
b0d623f7
A
1010/*!
1011 @function vfs_statfs
1012 @abstract Get information about filesystem status.
1013 @discussion Each filesystem has a struct vfsstatfs associated with it which is updated as events occur; this function
1014 returns a pointer to it. Note that the data in the structure will continue to change over time and also that it may
1015 be quite stale of vfs_update_vfsstat has not been called recently.
1016 @param mp Mount for which to get vfsstatfs pointer.
1017 @return Pointer to vfsstatfs.
1018 */
91447636 1019struct vfsstatfs * vfs_statfs(mount_t);
2d21ac55
A
1020#define VFS_USER_EVENT 0
1021#define VFS_KERNEL_EVENT 1
b0d623f7
A
1022
1023/*!
1024 @function vfs_update_vfsstat
1025 @abstract Update cached filesystem status information in the VFS mount structure.
1026 @discussion Each filesystem has a struct vfsstatfs associated with it which is updated as events occur; this function
1027 updates it so that the structure pointer returned by vfs_statfs() returns a pointer to fairly recent data.
1028 @param mp Mount for which to update cached status information.
1029 @param ctx Context to authenticate against for call down to filesystem.
1030 @param eventtype VFS_USER_EVENT: need for update is driven by user-level request; perform additional authentication.
1031 VFS_KERNEL_EVENT: need for update is driven by in-kernel events. Skip extra authentication.
1032 @return 0 for success, or an error code for authentication failure or problem with call to filesystem to
1033 request information.
1034 */
2d21ac55 1035int vfs_update_vfsstat(mount_t, vfs_context_t, int eventtype);
91447636 1036
b0d623f7
A
1037/*!
1038 @function vfs_typenum
1039 @abstract Get (archaic) filesystem type number.
1040 @discussion Filesystem type numbers are an old construct; most filesystems just get a number assigned based on
1041 the order in which they are registered with the system.
1042 @param mp Mount for which to get type number.
1043 @return Type number.
1044 */
91447636 1045int vfs_typenum(mount_t);
b0d623f7
A
1046
1047/*!
1048 @function vfs_name
1049 @abstract Copy filesystem name into a buffer.
1050 @discussion Get filesystem name; this refers to the filesystem type of which a mount is an instantiation,
1051 rather than a name specific to the mountpoint.
1052 @param mp Mount for which to get name.
1053 @param buffer Destination for name; length should be at least MFSNAMELEN.
1054 @return void.
1055 */
91447636 1056void vfs_name(mount_t, char *);
b0d623f7
A
1057
1058/*!
1059 @function vfs_devblocksize
1060 @abstract Get the block size of the device underlying a mount.
1061 @param mp Mount for which to get block size.
1062 @return Block size.
1063 */
91447636 1064int vfs_devblocksize(mount_t);
b0d623f7
A
1065
1066/*!
1067 @function vfs_ioattr
1068 @abstract Get I/O attributes associated with a mounpoint.
1069 @param mp Mount for which to get attributes. If NULL, system defaults are filled into ioattrp.
1070 @param ioattrp Destination for results.
1071 @return void.
1072 */
91447636 1073void vfs_ioattr(mount_t, struct vfsioattr *);
b0d623f7
A
1074
1075/*!
1076 @function vfs_setioattr
1077 @abstract Set I/O attributes associated with a mounpoint.
1078 @param mp Mount for which to set attributes.
1079 @param ioattrp Structure containing I/O parameters; all fields must be filled in.
1080 @return void.
1081 */
91447636 1082void vfs_setioattr(mount_t, struct vfsioattr *);
b0d623f7
A
1083
1084/*!
1085 @function vfs_64bitready
1086 @abstract Check if the filesystem associated with a mountpoint is marked ready for interaction with 64-bit user processes.
1087 @param mp Mount to test.
1088 @return Nonzero if filesystem is ready for 64-bit; 0 otherwise.
1089 */
91447636
A
1090int vfs_64bitready(mount_t);
1091
1092
2d21ac55 1093#define LK_NOWAIT 1
b0d623f7
A
1094/*!
1095 @function vfs_busy
1096 @abstract "Busy" a mountpoint.
1097 @discussion vfs_busy() will "busy" a mountpoint, preventing unmounts from taking off, by taking its reader-writer lock
1098 in a shared manner. If a mount is dead,
1099 it will fail; if an unmount is in progress, depending on flags, it will either fail immediately or block
1100 until the unmount completes (then failing if the unmount has succeeded, or potentially succeeding if unmounting failed).
1101 A successful vfs_busy() must be followed by a vfs_unbusy() to release the lock on the mount.
1102 @param mp Mount to busy.
1103 @param flags LK_NOWAIT: fail with ENOENT if an unmount is in progress.
1104 @return 0 for success, with a lock held; an error code otherwise, with no lock held.
1105 */
91447636 1106int vfs_busy(mount_t, int);
b0d623f7
A
1107
1108/*!
1109 @function vfs_unbusy
1110 @abstract "Unbusy" a mountpoint by releasing its read-write lock.
1111 @discussion A successful vfs_busy() must be followed by a vfs_unbusy() to release the lock on the mount.
1112 @param mp Mount to unbusy.
1113 @return void.
1114 */
91447636
A
1115void vfs_unbusy(mount_t);
1116
b0d623f7
A
1117/*!
1118 @function vfs_getnewfsid
1119 @abstract Generate a unique filesystem ID for a mount and store it in the mount structure.
1120 @discussion Filesystem IDs are returned as part of "struct statfs." This function is typically
1121 called as part of file-system specific mount code (i.e. through VFS_MOUNT).
1122 @param mp Mount to set an ID for.
1123 @return void.
1124 */
91447636 1125void vfs_getnewfsid(struct mount *);
b0d623f7
A
1126
1127/*!
1128 @function vfs_getvfs
1129 @abstract Given a filesystem ID, look up a mount structure.
1130 @param fsid Filesystem ID to look up.
1131 @return Mountpoint if found, else NULL. Note unmounting mountpoints can be returned.
1132 */
91447636 1133mount_t vfs_getvfs(fsid_t *);
b0d623f7
A
1134
1135/*!
1136 @function vfs_mountedon
1137 @abstract Check whether a given block device has a filesystem mounted on it.
1138 @discussion Note that this is NOT a check for a covered vnode (the directory upon which
1139 a filesystem is mounted)--it is a test for whether a block device is being used as the source
1140 of a filesystem. Note that a block device marked as being mounted on cannot be opened.
1141 @param vp The vnode to test.
1142 @return EBUSY if vnode is indeed the source of a filesystem; 0 if it is not.
1143 */
91447636 1144int vfs_mountedon(struct vnode *);
b0d623f7
A
1145
1146/*!
1147 @function vfs_unmountbyfsid
1148 @abstract Find a filesystem by ID and unmount it.
1149 @param fsid ID of filesystem to unmount, as found through (for example) statfs.
1150 @param flags MNT_FORCE: forcibly invalidate files open on the mount (though in-flight I/O operations
1151 will be allowed to complete).
1152 @param ctx Context against which to authenticate unmount operation.
1153 @return 0 for succcess, nonero for failure.
1154 */
2d21ac55 1155int vfs_unmountbyfsid(fsid_t *, int, vfs_context_t);
91447636 1156
b0d623f7
A
1157/*!
1158 @function vfs_event_signal
1159 @abstract Post a kqueue-style event on a filesystem (EVFILT_FS).
1160 @param fsid Unused.
1161 @param event Events to post.
1162 @param data Unused.
1163 @return void.
1164 */
55e303ae 1165void vfs_event_signal(fsid_t *, u_int32_t, intptr_t);
b0d623f7
A
1166/*!
1167 @function vfs_event_init
1168 @abstract This function should not be called by kexts.
1169 */
1170void vfs_event_init(void); /* XXX We should not export this */
1171#ifdef KERNEL_PRIVATE
6d2010ae 1172int vfs_getbyid(fsid_t *fsid, ino64_t ino, vnode_t *vpp, vfs_context_t ctx);
b0d623f7
A
1173int vfs_getattr(mount_t mp, struct vfs_attr *vfa, vfs_context_t ctx);
1174int vfs_setattr(mount_t mp, struct vfs_attr *vfa, vfs_context_t ctx);
1175int vfs_extendedsecurity(mount_t);
1176mount_t vfs_getvfs_by_mntonname(char *);
1177void vfs_markdependency(mount_t);
1178vnode_t vfs_vnodecovered(mount_t mp); /* Returns vnode with an iocount that must be released with vnode_put() */
6d2010ae
A
1179vnode_t vfs_devvp(mount_t mp); /* Please see block comment with implementation */
1180void * vfs_mntlabel(mount_t mp); /* Safe to cast to "struct label*"; returns "void*" to limit dependence of mount.h on security headers. */
d1ecb069 1181void vfs_setunmountpreflight(mount_t mp);
6d2010ae
A
1182void vfs_setcompoundopen(mount_t mp);
1183uint64_t vfs_throttle_mask(mount_t mp);
1184
1185struct vnode_trigger_info;
1186
1187/*!
1188 @function vfs_addtrigger
1189 @abstract Create an "external" trigger vnode: look up a vnode and mark it as
1190 a trigger. Can only safely be called in the context of a callback set by
1191 vfs_settriggercallback(). May only be used on a file which is not already
1192 marked as a trigger.
1193 @param relpath Path relative to root of mountpoint at which to mark trigger.
1194 @param vtip Information about trigger; analogous to "vnode_trigger_param"
1195 argument to vnode_create.
1196 @param ctx Authorization context.
1197 */
1198int vfs_addtrigger(mount_t mp, const char *relpath, struct vnode_trigger_info *vtip, vfs_context_t ctx);
1199
1200
1201/*!
1202 @enum vfs_trigger_callback_op_t
1203 @abstract Operation to perform after an attempted unmount (successful or otherwise).
1204 @constant VTC_REPLACE Unmount failed: attempt to replace triggers. Only valid
1205 VFS operation to perform in this context is vfs_addtrigger().
1206 @constant VTC_RELEASE Unmount succeeded: release external triggering context.
1207 */
1208typedef enum {
1209 VTC_REPLACE,
1210 VTC_RELEASE
1211} vfs_trigger_callback_op_t;
1212
1213/*!
1214 @typedef vfs_trigger_callback_t
1215 @abstract Callback to be passed to vfs_settriggercallback() and invoked from
1216 unmount context.
1217 @param mp Mountpoint on which unmount is occurring.
1218 @param op Operation (see vfs_trigger_callback_op_t)
1219 @param data Context passed to vfs_settriggercallback()
1220 @param ctx Authorization context in which unmount is occurring.
1221 */
1222typedef void vfs_trigger_callback_t(mount_t mp, vfs_trigger_callback_op_t op, void *data, vfs_context_t ctx);
1223
1224/*!
1225 @function vfs_settriggercallback
1226 @abstract Install a callback to be called after unmount attempts on a volume,
1227 to restore triggers for failed unmounts and release state for successful ones.
1228 @discussion Installs a callback which will be called in two situations: a
1229 failed unmount where vnodes may have been reclaimed and a successful unmount.
1230 Gives an external trigger-marking entity an opportunity to replace triggers
1231 which may have been reclaimed. The callback can only be installed (not
1232 cleared), and only one callback can be installed. The callback will be called
1233 with a read-write lock held on the mount point; in the VTC_REPLACE case, the
1234 <em>only</em> valid VFS operation to perform in the context of the callback is
1235 vfs_addtrigger() on the mountpoint in question. This rwlock is held in order
1236 to attempt to provide some modicum of coverage from lookups which might find
1237 missing trigger vnodes and receive spurious ENOENTs. Note that this
1238 protection is incomplete--current working directories, or traversals up into a
1239 volume via ".." may still find missing triggers. As of this writing, no
1240 serialization mechanism exists to do better than this.
1241 When the "op" is VTC_RELEASE, the mountpoint is going away, and the only valid
1242 VFS operation is to free the private data pointer if needed. The callback
1243 will be called immediately, with VTC_REPLACE, from vfs_settriggercallback(),
1244 if installation is successful.
1245 @param fsid FSID for filesystem in question.
1246 @param vtc Callback pointer.
1247 @param data Context pointer to be passed to callback.
1248 @param flags Currently unused.
1249 @param ctx Authorization context.
1250 @return 0 for success. EBUSY if a trigger has already been installed.
1251 */
1252int vfs_settriggercallback(fsid_t *fsid, vfs_trigger_callback_t vtc, void *data, uint32_t flags, vfs_context_t ctx);
1253
b0d623f7 1254#endif /* KERNEL_PRIVATE */
91447636
A
1255__END_DECLS
1256
1257#endif /* KERNEL */
1c79356b 1258
91447636
A
1259#ifndef KERNEL
1260
1261/*
1262 * Generic file handle
1263 */
2d21ac55
A
1264#define NFS_MAX_FH_SIZE NFSV4_MAX_FH_SIZE
1265#define NFSV4_MAX_FH_SIZE 128
1266#define NFSV3_MAX_FH_SIZE 64
91447636
A
1267#define NFSV2_MAX_FH_SIZE 32
1268struct fhandle {
1269 int fh_len; /* length of file handle */
1270 unsigned char fh_data[NFS_MAX_FH_SIZE]; /* file handle value */
1271};
1272typedef struct fhandle fhandle_t;
1c79356b 1273
1c79356b
A
1274
1275__BEGIN_DECLS
91447636 1276int fhopen(const struct fhandle *, int);
2d21ac55 1277int fstatfs(int, struct statfs *) __DARWIN_INODE64(fstatfs);
593a1d5f
A
1278#if !__DARWIN_ONLY_64_BIT_INO_T
1279int fstatfs64(int, struct statfs64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
1280#endif /* !__DARWIN_ONLY_64_BIT_INO_T */
91447636 1281int getfh(const char *, fhandle_t *);
2d21ac55 1282int getfsstat(struct statfs *, int, int) __DARWIN_INODE64(getfsstat);
593a1d5f
A
1283#if !__DARWIN_ONLY_64_BIT_INO_T
1284int getfsstat64(struct statfs64 *, int, int) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
1285#endif /* !__DARWIN_ONLY_64_BIT_INO_T */
2d21ac55 1286int getmntinfo(struct statfs **, int) __DARWIN_INODE64(getmntinfo);
593a1d5f
A
1287#if !__DARWIN_ONLY_64_BIT_INO_T
1288int getmntinfo64(struct statfs64 **, int) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
1289#endif /* !__DARWIN_ONLY_64_BIT_INO_T */
91447636 1290int mount(const char *, const char *, int, void *);
2d21ac55 1291int statfs(const char *, struct statfs *) __DARWIN_INODE64(statfs);
593a1d5f
A
1292#if !__DARWIN_ONLY_64_BIT_INO_T
1293int statfs64(const char *, struct statfs64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA);
1294#endif /* !__DARWIN_ONLY_64_BIT_INO_T */
91447636
A
1295int unmount(const char *, int);
1296int getvfsbyname(const char *, struct vfsconf *);
1c79356b
A
1297__END_DECLS
1298
1299#endif /* KERNEL */
1300#endif /* !_SYS_MOUNT_H_ */