xref: /xnu-8019.80.24/bsd/sys/fsctl.h (revision a325d9c4a84054e40bbe985afedcb50ab80993ea)
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 #define FSCTL_SYNC_FULLSYNC     (1<<0)  /* Flush the data fully to disk, if supported by the filesystem */
286 #define FSCTL_SYNC_WAIT         (1<<1)  /* Wait for the sync to complete */
287 
288 
289 #define FSIOC_SYNC_VOLUME                         _IOW('A', 1, uint32_t)
290 #define FSCTL_SYNC_VOLUME                         IOCBASECMD(FSIOC_SYNC_VOLUME)
291 
292 #define FSIOC_SET_PACKAGE_EXTS                    _IOW('A', 2, struct package_ext_info)
293 #define FSCTL_SET_PACKAGE_EXTS                    IOCBASECMD(FSIOC_SET_PACKAGE_EXTS)
294 
295 /* Unsupported - previously FSIOC_WAIT_FOR_SYNC */
296 #define FSIOC_UNSUPPORTED                         _IOR('A', 3, int32_t)
297 
298 /* 4 - 9 was used for NAMESPACE handler operation to support dataless file faults
299  * no and no longer user */
300 
301 #define FSIOC_SET_FSTYPENAME_OVERRIDE             _IOW('A', 10, fstypename_t)
302 #define FSCTL_SET_FSTYPENAME_OVERRIDE             IOCBASECMD(FSIOC_SET_FSTYPENAME_OVERRIDE)
303 
304 /* 12 was used for TRACKED_HANDLER_GET which has now been removed
305  *  as it is no longer used. */
306 
307 /* 13 was used for FSIOC_SNAPSHOT_HANDLER_GET_EXT and now been removed */
308 
309 /* 14 was used for NAMESPACE_HANDLER_GETDATA which has now been
310  *  removed as it is no longer used. */
311 
312 #define FSIOC_ROUTEFS_SETROUTEID                          _IO('A', 15)
313 #define FSCTL_ROUTEFS_SETROUTEID                          IOCBASECMD(FSIOC_ROUTEFS_SETROUTEID)
314 
315 /* ioctls to support SEEK_HOLE SEEK_DATA */
316 #define FSIOC_FIOSEEKHOLE                                         _IOWR('A', 16, off_t)
317 #define FSCTL_FIOSEEKHOLE                                         IOCBASECMD(FSIOC_FIOSEEKHOLE)
318 #define FSIOC_FIOSEEKDATA                                         _IOWR('A', 17, off_t)
319 #define FSCTL_FIOSEEKDATA                                         IOCBASECMD(FSIOC_FIOSEEKDATA)
320 
321 /* Disk conditioner */
322 #define DISK_CONDITIONER_IOC_GET                  _IOR('A', 18, disk_conditioner_info)
323 #define DISK_CONDITIONER_FSCTL_GET                IOCBASECMD(DISK_CONDITIONER_IOC_GET)
324 #define DISK_CONDITIONER_IOC_SET                  _IOW('A', 19, disk_conditioner_info)
325 #define DISK_CONDITIONER_FSCTL_SET                IOCBASECMD(DISK_CONDITIONER_IOC_SET)
326 
327 /* Set the value of a file's BSD flags in a safe way. */
328 #define FSIOC_CAS_BSDFLAGS      _IOWR('A', 20, struct fsioc_cas_bsdflags)
329 
330 /* Check if a file is only open once (pass zero for the extra arg) */
331 #define FSIOC_FD_ONLY_OPEN_ONCE _IOWR('A', 21, uint32_t)
332 
333 //
334 // Spotlight and fseventsd use these fsctl()'s to find out
335 // the mount time of a volume and the last time it was
336 // unmounted.  Both HFS and APFS support these calls.
337 //
338 // NOTE: the values for these defines should _not_ be changed
339 //       or else it will break binary compatibility with mds
340 //       and fseventsd.
341 //
342 #define SPOTLIGHT_IOC_GET_MOUNT_TIME              _IOR('h', 18, u_int32_t)
343 #define SPOTLIGHT_FSCTL_GET_MOUNT_TIME            IOCBASECMD(SPOTLIGHT_IOC_GET_MOUNT_TIME)
344 #define SPOTLIGHT_IOC_GET_LAST_MTIME              _IOR('h', 19, u_int32_t)
345 #define SPOTLIGHT_FSCTL_GET_LAST_MTIME            IOCBASECMD(SPOTLIGHT_IOC_GET_LAST_MTIME)
346 
347 /* Mark file's extents as "frozen" because someone has references to physical address */
348 #define FSIOC_FREEZE_EXTENTS                            _IO('h', 20)
349 #define FSCTL_FREEZE_EXTENTS                            IOCBASECMD(FSIOC_FREEZE_EXTENTS)
350 
351 /* Clear the "frozen" status of file's extents */
352 #define FSIOC_THAW_EXTENTS                              _IO('h', 21)
353 #define FSCTL_THAW_EXTENTS                              IOCBASECMD(FSIOC_THAW_EXTENTS)
354 
355 /* Selectors on 'h' from 22 -> 49 are defined in HFS repo */
356 
357 #define FSIOC_EVAL_ROOTAUTH                              _IO('h', 50)
358 #define FSCTL_EVAL_ROOTAUTH                              IOCBASECMD(FSIOC_EVAL_ROOTAUTH)
359 
360 /* This op should only be invoked from within the kernel */
361 #define FSIOC_KERNEL_ROOTAUTH                            _IOW('h', 51, uint32_t)
362 
363 #define FIRMLINK_STRUCT_LEN 1032
364 typedef struct generic_firmlink {
365 	uint8_t array[FIRMLINK_STRUCT_LEN];
366 } generic_firmlink_t;
367 
368 #define FSIOC_FIRMLINK_CTL _IOWR ('J', 60, generic_firmlink_t)
369 
370 #ifndef KERNEL
371 
372 #include <sys/cdefs.h>
373 
374 __BEGIN_DECLS
375 
376 int     fsctl(const char *, unsigned long, void*, unsigned int);
377 int     ffsctl(int, unsigned long, void*, unsigned int);
378 
379 __END_DECLS
380 #endif /* !KERNEL */
381 #endif /* !_SYS_FSCTL_H_ */
382