xref: /xnu-8796.121.2/bsd/sys/fsctl.h (revision c54f35ca767986246321eb901baf8f5ff7923f6a)
1 /*
2  * Copyright (c) 2000-2020 Apple Computer, 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) 1982, 1986, 1990, 1993, 1994
31  *	The Regents of the University of California.  All rights reserved.
32  * (c) UNIX System Laboratories, Inc.
33  * All or some portions of this file are derived from material licensed
34  * to the University of California by American Telephone and Telegraph
35  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
36  * the permission of UNIX System Laboratories, Inc.
37  *
38  * Redistribution and use in source and binary forms, with or without
39  * modification, are permitted provided that the following conditions
40  * are met:
41  * 1. Redistributions of source code must retain the above copyright
42  *    notice, this list of conditions and the following disclaimer.
43  * 2. Redistributions in binary form must reproduce the above copyright
44  *    notice, this list of conditions and the following disclaimer in the
45  *    documentation and/or other materials provided with the distribution.
46  * 3. All advertising materials mentioning features or use of this software
47  *    must display the following acknowledgement:
48  *	This product includes software developed by the University of
49  *	California, Berkeley and its contributors.
50  * 4. Neither the name of the University nor the names of its contributors
51  *    may be used to endorse or promote products derived from this software
52  *    without specific prior written permission.
53  *
54  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
55  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
56  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
57  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
58  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
59  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
60  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
61  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
62  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
63  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
64  * SUCH DAMAGE.
65  *
66  *	@(#)fsctl.h	8.6 (Berkeley) 3/28/94
67  */
68 
69 #ifndef _SYS_FSCTL_H_
70 #define _SYS_FSCTL_H_
71 
72 #include <sys/ioccom.h>
73 #include <sys/mount.h>
74 
75 #ifdef XNU_KERNEL_PRIVATE
76 
77 /* Userland structs for namespace handler */
78 typedef struct user64_namespace_handler_info {
79 	user64_addr_t  token;
80 	user64_addr_t  flags;
81 	user64_addr_t  fdptr;
82 } user64_namespace_handler_info;
83 
84 typedef struct user32_namespace_handler_info {
85 	user32_addr_t  token;
86 	user32_addr_t  flags;
87 	user32_addr_t  fdptr;
88 } user32_namespace_handler_info;
89 
90 
91 /* Kernel-internal of namespace handler info */
92 typedef struct namespace_handler_info {
93 	user_addr_t  token;
94 	user_addr_t  flags;
95 	user_addr_t  fdptr;
96 } namespace_handler_info;
97 
98 
99 /* Userland structs for extended namespace handler */
100 typedef struct user64_namespace_handler_info_ext {
101 	user64_addr_t  token;
102 	user64_addr_t  flags;
103 	user64_addr_t  fdptr;
104 	user64_addr_t  infoptr;
105 } user64_namespace_handler_info_ext;
106 
107 typedef struct user32_namespace_handler_info_ext {
108 	user32_addr_t  token;
109 	user32_addr_t  flags;
110 	user32_addr_t  fdptr;
111 	user32_addr_t  infoptr;
112 } user32_namespace_handler_info_ext;
113 
114 
115 /* Kernel-internal of extended namespace handler */
116 typedef struct namespace_handler_info_ext {
117 	user_addr_t  token;
118 	user_addr_t  flags;
119 	user_addr_t  fdptr;
120 	user_addr_t  infoptr;
121 } namespace_handler_info_ext;
122 
123 /* Size-Augmented namespace_handler_info */
124 /* 64 bit userland*/
125 typedef struct user64_namespace_handler_data {
126 	user64_addr_t token;
127 	user64_addr_t flags;
128 	user64_addr_t fdptr;
129 	user64_addr_t infoptr;
130 	user64_addr_t objid;
131 	user64_addr_t reserved1;
132 	user64_addr_t reserved2;
133 	user64_addr_t reserved3;
134 } user64_namespace_handler_data;
135 
136 /*32 bit userland*/
137 typedef struct user32_namespace_handler_data {
138 	user32_addr_t token;
139 	user32_addr_t flags;
140 	user32_addr_t fdptr;
141 	user32_addr_t infoptr;
142 	user32_addr_t objid;
143 	user32_addr_t reserved1;
144 	user32_addr_t reserved2;
145 	user32_addr_t reserved3;
146 } user32_namespace_handler_data;
147 
148 /* kernel-internal */
149 typedef struct namespace_handler_data {
150 	user_addr_t token;
151 	user_addr_t flags;
152 	user_addr_t fdptr;
153 	user_addr_t infoptr;
154 	user_addr_t objid;
155 	user_addr_t reserved1;
156 	user_addr_t reserved2;
157 	user_addr_t reserved3;
158 } namespace_handler_data;
159 
160 
161 extern int resolve_nspace_item_ext(struct vnode *vp, uint64_t op, void *arg);
162 
163 #else
164 
165 typedef struct namespace_handler_info {
166 	int32_t    *token;
167 	int64_t    *flags;
168 	int32_t    *fdptr;
169 } namespace_handler_info;
170 
171 typedef struct namespace_handler_info_ext {
172 	int32_t    *token;
173 	int64_t    *flags;
174 	int32_t    *fdptr;
175 	int64_t    *infoptr;     // for snapshot write events, the kernel puts an offset/length pair here
176 } namespace_handler_info_ext;
177 
178 typedef struct namespace_handler_data {
179 	int32_t *token;
180 	int64_t *flags;
181 	int32_t *fdptr;
182 	int64_t *infoptr;     // for snapshot write events, the kernel puts an offset/length pair here
183 	int64_t *objid;
184 	uint32_t *reserved1;
185 	uint32_t *reserved2;
186 	uint32_t *reserved3;
187 } namespace_handler_data;
188 
189 #endif /* XNU_KERNEL_PRIVATE */
190 
191 #ifdef KERNEL_PRIVATE
192 
193 #define NSPACE_REARM_NO_ARG ((void *)1)
194 int resolve_nspace_item(struct vnode *vp, uint64_t op);
195 int vfs_materialize_file(struct vnode *vp, uint64_t op, int64_t offset, int64_t size);
196 int vfs_materialize_dir(struct vnode *vp, uint64_t op, char *file_name, size_t namelen);
197 int nspace_snapshot_event(vnode_t vp, time_t ctime, uint64_t op_type, void *arg);
198 
199 #endif // defined(KERNEL_PRIVATE)
200 
201 #define NAMESPACE_HANDLER_READ_OP             0x0001
202 #define NAMESPACE_HANDLER_WRITE_OP            0x0002
203 #define NAMESPACE_HANDLER_DELETE_OP           0x0004
204 #define NAMESPACE_HANDLER_TRUNCATE_OP         0x0008
205 #define NAMESPACE_HANDLER_RENAME_OP           0x0010
206 #define NAMESPACE_HANDLER_METADATA_WRITE_OP   0x0020
207 #define NAMESPACE_HANDLER_METADATA_DELETE_OP  0x0040
208 #define NAMESPACE_HANDLER_METADATA_MOD        0x0080
209 // #define NAMESPACE_HANDLER_OP_DO_NOT_USE    0x0100   // SNAPSHOT_EVENT uses this value
210 #define NAMESPACE_HANDLER_LINK_CREATE         0x0200
211 #define NAMESPACE_HANDLER_RENAME_SUCCESS_OP   0x0400
212 #define NAMESPACE_HANDLER_RENAME_FAILED_OP    0x0800
213 
214 #define NAMESPACE_HANDLER_NSPACE_EVENT        0x1000
215 #define NAMESPACE_HANDLER_SNAPSHOT_EVENT      0x0100
216 #define NAMESPACE_HANDLER_TRACK_EVENT         0x2000
217 
218 #define NAMESPACE_HANDLER_LOOKUP_OP           0x4000
219 
220 #define NAMESPACE_HANDLER_EVENT_TYPE_MASK (NAMESPACE_HANDLER_NSPACE_EVENT | NAMESPACE_HANDLER_SNAPSHOT_EVENT | NAMESPACE_HANDLER_TRACK_EVENT)
221 
222 
223 typedef int32_t nspace_handler_info[2];
224 typedef char fstypename_t[MFSTYPENAMELEN];
225 
226 #ifdef KERNEL
227 
228 typedef struct user64_package_ext_info {
229 	user64_addr_t strings;
230 	uint32_t      num_entries;
231 	uint32_t      max_width;
232 } user64_package_ext_info;
233 
234 typedef struct user32_package_ext_info {
235 	user32_addr_t strings;
236 	uint32_t      num_entries;
237 	uint32_t      max_width;
238 } user32_package_ext_info;
239 
240 #endif  // KERNEL
241 
242 typedef struct package_ext_info {
243 	const char *strings;
244 	uint32_t    num_entries;
245 	uint32_t    max_width;
246 } package_ext_info;
247 
248 /* Disk conditioner configuration */
249 typedef struct disk_conditioner_info {
250 	int enabled;
251 	uint64_t access_time_usec; // maximum latency until transfer begins
252 	uint64_t read_throughput_mbps; // maximum throughput for reads
253 	uint64_t write_throughput_mbps; // maximum throughput for writes
254 	int is_ssd; // behave like an SSD
255 
256 	/* revision 2 */
257 	uint32_t ioqueue_depth;
258 	uint32_t maxreadcnt;
259 	uint32_t maxwritecnt;
260 	uint32_t segreadcnt;
261 	uint32_t segwritecnt;
262 } disk_conditioner_info;
263 
264 /*
265  * BSD flags manipulation arguments.
266  *
267  * This provides a safe way to update the BSD flags field of an inode,
268  * which has some user components as well as some system components.
269  * What it provides is a compare-and-swap operation, whereby the caller
270  * fetches what the expected flags are, computes the new set, and then
271  * provides the old along with the new.  If the old that's provided matches
272  * what's actually in the inode, the new value is set.  The actual inode
273  * value is returned to the caller, and expected == actual is how the
274  * caller can determine that the operation succeeded.
275  *
276  * Some BSD flags (e.g. UF_COMPRESSED) can only be manipulated via this
277  * safe mechanism.
278  */
279 struct fsioc_cas_bsdflags {
280 	uint32_t expected_flags;        /* [IN] expected flags */
281 	uint32_t new_flags;             /* [IN] new value to set */
282 	uint32_t actual_flags;          /* [OUT] the actual flags in inode */
283 };
284 
285 #ifdef KERNEL
286 
287 #define FSIOC_GRAFT_VERSION          2
288 
289 /* Grafting flags */
290 #define FSCTL_GRAFT_PRESERVE_MOUNT              0x0001  /* Preserve underlying mount until shutdown */
291 #define FSCTL_GRAFT_ALTERNATE_SHARED_REGION     0x0002  /* Binaries within should use alternate shared region */
292 #define FSCTL_GRAFT_SYSTEM_CONTENT              0x0004  /* Cryptex contains system content */
293 #define FSCTL_GRAFT_PANIC_ON_AUTHFAIL           0x0008  /* On failure to authenticate, panic */
294 #define FSCTL_GRAFT_STRICT_AUTH                 0x0010  /* Strict authentication mode */
295 #define FSCTL_GRAFT_PRESERVE_GRAFT              0x0020  /* Preserve graft itself until unmount */
296 
297 typedef struct fsioc_graft_fs {
298 	uint32_t graft_version;
299 	uint32_t graft_type;
300 	uint32_t graft_4cc;
301 	uint64_t graft_flags;
302 	uint64_t dir_ino;
303 
304 	void *authentic_manifest;
305 	size_t authentic_manifest_size;
306 	void *user_manifest;
307 	size_t user_manifest_size;
308 	void *payload;
309 	size_t payload_size;
310 } fsioc_graft_fs_t;
311 
312 /* Ungrafting flags */
313 #define FSCTL_UNGRAFT_UNGRAFTALL     0x001  /* Ungraft all currently grafted filesystems */
314 
315 typedef struct fsioc_ungraft_fs {
316 	uint64_t ungraft_flags;
317 } fsioc_ungraft_fs_t;
318 
319 typedef struct fsioc_auth_fs {
320 	vnode_t authvp;
321 } fsioc_auth_fs_t;
322 
323 #endif /* KERNEL */
324 
325 #define FSCTL_SYNC_FULLSYNC     (1<<0)  /* Flush the data fully to disk, if supported by the filesystem */
326 #define FSCTL_SYNC_WAIT         (1<<1)  /* Wait for the sync to complete */
327 
328 
329 #define FSIOC_SYNC_VOLUME                         _IOW('A', 1, uint32_t)
330 #define FSCTL_SYNC_VOLUME                         IOCBASECMD(FSIOC_SYNC_VOLUME)
331 
332 #define FSIOC_SET_PACKAGE_EXTS                    _IOW('A', 2, struct package_ext_info)
333 #define FSCTL_SET_PACKAGE_EXTS                    IOCBASECMD(FSIOC_SET_PACKAGE_EXTS)
334 
335 /* Unsupported - previously FSIOC_WAIT_FOR_SYNC */
336 #define FSIOC_UNSUPPORTED                         _IOR('A', 3, int32_t)
337 
338 /* 4 - 9 was used for NAMESPACE handler operation to support dataless file faults
339  * no and no longer user */
340 
341 #define FSIOC_SET_FSTYPENAME_OVERRIDE             _IOW('A', 10, fstypename_t)
342 #define FSCTL_SET_FSTYPENAME_OVERRIDE             IOCBASECMD(FSIOC_SET_FSTYPENAME_OVERRIDE)
343 
344 /* 12 was used for TRACKED_HANDLER_GET which has now been removed
345  *  as it is no longer used. */
346 
347 /* 13 was used for FSIOC_SNAPSHOT_HANDLER_GET_EXT and now been removed */
348 
349 /* 14 was used for NAMESPACE_HANDLER_GETDATA which has now been
350  *  removed as it is no longer used. */
351 
352 #define FSIOC_ROUTEFS_SETROUTEID                          _IO('A', 15)
353 #define FSCTL_ROUTEFS_SETROUTEID                          IOCBASECMD(FSIOC_ROUTEFS_SETROUTEID)
354 
355 /* ioctls to support SEEK_HOLE SEEK_DATA */
356 #define FSIOC_FIOSEEKHOLE                                         _IOWR('A', 16, off_t)
357 #define FSCTL_FIOSEEKHOLE                                         IOCBASECMD(FSIOC_FIOSEEKHOLE)
358 #define FSIOC_FIOSEEKDATA                                         _IOWR('A', 17, off_t)
359 #define FSCTL_FIOSEEKDATA                                         IOCBASECMD(FSIOC_FIOSEEKDATA)
360 
361 /* Disk conditioner */
362 #define DISK_CONDITIONER_IOC_GET                  _IOR('A', 18, disk_conditioner_info)
363 #define DISK_CONDITIONER_FSCTL_GET                IOCBASECMD(DISK_CONDITIONER_IOC_GET)
364 #define DISK_CONDITIONER_IOC_SET                  _IOW('A', 19, disk_conditioner_info)
365 #define DISK_CONDITIONER_FSCTL_SET                IOCBASECMD(DISK_CONDITIONER_IOC_SET)
366 
367 /* Set the value of a file's BSD flags in a safe way. */
368 #define FSIOC_CAS_BSDFLAGS      _IOWR('A', 20, struct fsioc_cas_bsdflags)
369 
370 /* Check if a file is only open once (pass zero for the extra arg) */
371 #define FSIOC_FD_ONLY_OPEN_ONCE _IOWR('A', 21, uint32_t)
372 
373 #ifdef KERNEL
374 
375 /* Graft a filesystem onto a directory in its parent filesystem */
376 #define FSIOC_GRAFT_FS _IOW('A', 22, fsioc_graft_fs_t)
377 
378 /* Ungraft filesystem(s) */
379 #define FSIOC_UNGRAFT_FS _IOW('A', 23, fsioc_ungraft_fs_t)
380 
381 /* Check if a file is on an authenticated volume/Cryptex */
382 #define FSIOC_AUTH_FS _IOW('A', 24, fsioc_auth_fs_t)
383 
384 #endif /* KERNEL */
385 
386 //
387 // Spotlight and fseventsd use these fsctl()'s to find out
388 // the mount time of a volume and the last time it was
389 // unmounted.  Both HFS and APFS support these calls.
390 //
391 // NOTE: the values for these defines should _not_ be changed
392 //       or else it will break binary compatibility with mds
393 //       and fseventsd.
394 //
395 #define SPOTLIGHT_IOC_GET_MOUNT_TIME              _IOR('h', 18, u_int32_t)
396 #define SPOTLIGHT_FSCTL_GET_MOUNT_TIME            IOCBASECMD(SPOTLIGHT_IOC_GET_MOUNT_TIME)
397 #define SPOTLIGHT_IOC_GET_LAST_MTIME              _IOR('h', 19, u_int32_t)
398 #define SPOTLIGHT_FSCTL_GET_LAST_MTIME            IOCBASECMD(SPOTLIGHT_IOC_GET_LAST_MTIME)
399 
400 /* Mark file's extents as "frozen" because someone has references to physical address */
401 #define FSIOC_FREEZE_EXTENTS                            _IO('h', 20)
402 #define FSCTL_FREEZE_EXTENTS                            IOCBASECMD(FSIOC_FREEZE_EXTENTS)
403 
404 /* Clear the "frozen" status of file's extents */
405 #define FSIOC_THAW_EXTENTS                              _IO('h', 21)
406 #define FSCTL_THAW_EXTENTS                              IOCBASECMD(FSIOC_THAW_EXTENTS)
407 
408 /* Selectors on 'h' from 22 -> 49 are defined in HFS repo */
409 
410 #define FSIOC_EVAL_ROOTAUTH                              _IO('h', 50)
411 #define FSCTL_EVAL_ROOTAUTH                              IOCBASECMD(FSIOC_EVAL_ROOTAUTH)
412 
413 /* This op should only be invoked from within the kernel */
414 #define FSIOC_KERNEL_ROOTAUTH                            _IOW('h', 51, uint32_t)
415 
416 #define FIRMLINK_STRUCT_LEN 1032
417 typedef struct generic_firmlink {
418 	uint8_t array[FIRMLINK_STRUCT_LEN];
419 } generic_firmlink_t;
420 
421 #define FSIOC_FIRMLINK_CTL _IOWR ('J', 60, generic_firmlink_t)
422 
423 /* For testing /dev/fsevents FSE_ACCESS_GRANTED. */
424 #define FSIOC_TEST_FSE_ACCESS_GRANTED                    _IO('h', 52)
425 
426 #ifndef KERNEL
427 
428 #include <sys/cdefs.h>
429 
430 __BEGIN_DECLS
431 
432 int     fsctl(const char *, unsigned long, void*, unsigned int);
433 int     ffsctl(int, unsigned long, void*, unsigned int);
434 
435 __END_DECLS
436 #endif /* !KERNEL */
437 #endif /* !_SYS_FSCTL_H_ */
438