1 /*        $NetBSD: fstypes.h,v 1.41 2021/09/18 03:05:20 christos Exp $          */
2 
3 /*
4  * Copyright (c) 1989, 1991, 1993
5  *        The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  *        @(#)mount.h         8.21 (Berkeley) 5/20/95
32  */
33 
34 #ifndef _SYS_FSTYPES_H_
35 #define   _SYS_FSTYPES_H_
36 
37 typedef struct { int32_t __fsid_val[2]; } fsid_t; /* file system id type */
38 
39 #if defined(_KERNEL)
40 /*
41  * File identifier.
42  * These are unique per filesystem on a single machine.
43  */
44 struct fid {
45           unsigned short      fid_len;            /* length of data in bytes */
46           unsigned short      fid_reserved;                 /* compat: historic align */
47           char                fid_data[0];                  /* data (variable length) */
48 };
49 
50 /*
51  * Generic file handle
52  */
53 struct fhandle {
54           fsid_t    fh_fsid;  /* File system id of mount point */
55           struct    fid fh_fid;         /* File sys specific id */
56 };
57 typedef struct fhandle        fhandle_t;
58 
59 /*
60  * FHANDLE_SIZE_MAX: arbitrary value to prevent unreasonable allocation.
61  *
62  * FHANDLE_SIZE_MIN: chosen for compatibility.  smaller handles are zero-padded.
63  */
64 
65 #define   FHANDLE_SIZE_COMPAT 28
66 #define   FHANDLE_SIZE_MAX    1024
67 #define   FHANDLE_SIZE_MIN    FHANDLE_SIZE_COMPAT
68 
69 #define   FHANDLE_FSID(fh)    (&(fh)->fh_fsid)
70 #define   FHANDLE_FILEID(fh)  (&(fh)->fh_fid)
71 #define   FHANDLE_SIZE_FROM_FILEID_SIZE(fidsize) \
72           MAX(FHANDLE_SIZE_MIN, (offsetof(fhandle_t, fh_fid) + (fidsize)))
73 #define   FHANDLE_SIZE(fh) \
74           FHANDLE_SIZE_FROM_FILEID_SIZE(FHANDLE_FILEID(fh)->fid_len)
75 #endif /* defined(_KERNEL) */
76 
77 /*
78  * Mount flags.  XXX BEWARE: these are not in numerical order!
79  *
80  * Unmount uses MNT_FORCE flag.
81  *
82  * Note that all mount flags are listed here.  if you need to add one, take
83  * one of the __MNT_UNUSED flags.
84  */
85 
86 
87 #define   MNT_RDONLY          0x00000001          /* read only filesystem */
88 #define   MNT_SYNCHRONOUS     0x00000002          /* file system written synchronously */
89 #define   MNT_NOEXEC          0x00000004          /* can't exec from filesystem */
90 #define   MNT_NOSUID          0x00000008          /* don't honor setuid bits on fs */
91 #define   MNT_NODEV 0x00000010          /* don't interpret special files */
92 #define   MNT_UNION 0x00000020          /* union with underlying filesystem */
93 #define   MNT_ASYNC 0x00000040          /* file system written asynchronously */
94 #define   MNT_NOCOREDUMP      0x00008000          /* don't write core dumps to this FS */
95 #define   MNT_RELATIME        0x00020000          /* only update access time if mod/ch */
96 #define   MNT_IGNORE          0x00100000          /* don't show entry in df */
97 #define   MNT_NFS4ACLS        0x00200000          /* uses NFS4 Access Control Lists */
98 #define   MNT_DISCARD         0x00800000          /* use DISCARD/TRIM if supported */
99 #define   MNT_EXTATTR         0x01000000          /* enable extended attributes */
100 #define   MNT_LOG             0x02000000          /* Use logging */
101 #define   MNT_NOATIME         0x04000000          /* Never update access times in fs */
102 #define   MNT_AUTOMOUNTED 0x10000000    /* mounted by automountd(8) */
103 #define   MNT_SYMPERM         0x20000000          /* recognize symlink permission */
104 #define   MNT_NODEVMTIME      0x40000000          /* Never update mod times for devs */
105 #define   MNT_SOFTDEP         0x80000000          /* Use soft dependencies */
106 #define   MNT_POSIX1EACLS     0x00000800          /* shared with EXKERB */
107 #define   MNT_ACLS  MNT_POSIX1EACLS     /* synonym */
108 
109 #define   __MNT_BASIC_FLAGS \
110           { MNT_ASYNC,                  0,        "asynchronous" }, \
111           { MNT_AUTOMOUNTED,  0,        "automounted" }, \
112           { MNT_NFS4ACLS,               0,        "nfs4acls" }, \
113           { MNT_POSIX1EACLS,  0,        "posix1eacls" }, \
114           { MNT_DISCARD,                0,        "discard" }, \
115           { MNT_EXTATTR,                0,        "extattr" }, \
116           { MNT_IGNORE,                 0,        "hidden" }, \
117           { MNT_LOG,                    0,        "log" }, \
118           { MNT_NOATIME,                0,        "noatime" }, \
119           { MNT_NOCOREDUMP,   0,        "nocoredump" }, \
120           { MNT_NODEV,                  0,        "nodev" }, \
121           { MNT_NODEVMTIME,   0,        "nodevmtime" }, \
122           { MNT_NOEXEC,                 0,        "noexec" }, \
123           { MNT_NOSUID,                 0,        "nosuid" }, \
124           { MNT_RDONLY,                 0,        "read-only" }, \
125           { MNT_RELATIME,               0,        "relatime" }, \
126           { MNT_SOFTDEP,                0,        "soft dependencies" }, \
127           { MNT_SYMPERM,                0,        "symperm" }, \
128           { MNT_SYNCHRONOUS,  0,        "synchronous" }, \
129           { MNT_UNION,                  0,        "union" }, \
130 
131 #define MNT_BASIC_FLAGS (MNT_ASYNC | MNT_AUTOMOUNTED | MNT_DISCARD | \
132     MNT_EXTATTR | MNT_LOG | MNT_NOATIME | MNT_NOCOREDUMP | MNT_NODEV | \
133     MNT_NODEVMTIME | MNT_NOEXEC | MNT_NOSUID | MNT_RDONLY | MNT_RELATIME | \
134     MNT_SOFTDEP | MNT_SYMPERM | MNT_SYNCHRONOUS | MNT_UNION | MNT_NFS4ACLS | \
135     MNT_POSIX1EACLS)
136 /*
137  * exported mount flags.
138  */
139 #define   MNT_EXRDONLY        0x00000080          /* exported read only */
140 #define   MNT_EXPORTED        0x00000100          /* file system is exported */
141 #define   MNT_DEFEXPORTED     0x00000200          /* exported to the world */
142 #define   MNT_EXPORTANON      0x00000400          /* use anon uid mapping for everyone */
143 #define   MNT_EXKERB          0x00000800          /* exported with Kerberos uid mapping */
144 #define   MNT_EXNORESPORT     0x08000000          /* don't enforce reserved ports (NFS) */
145 #define   MNT_EXPUBLIC        0x10000000          /* public export (WebNFS) */
146 
147 #define   __MNT_EXPORTED_FLAGS \
148           { MNT_EXRDONLY,               1,        "exported read-only" }, \
149           { MNT_EXPORTED,               0,        "NFS exported" }, \
150           { MNT_DEFEXPORTED,  1,        "exported to the world" }, \
151           { MNT_EXPORTANON,   1,        "anon uid mapping" }, \
152           { MNT_EXKERB,                 1,        "kerberos uid mapping/posix1e ACLS" }, \
153           { MNT_EXNORESPORT,  0,        "non-reserved ports" }, \
154           { MNT_EXPUBLIC,               0,        "WebNFS exports" },
155 
156 /*
157  * Flags set by internal operations.
158  */
159 #define   MNT_LOCAL 0x00001000          /* filesystem is stored locally */
160 #define   MNT_QUOTA 0x00002000          /* quotas are enabled on filesystem */
161 #define   MNT_ROOTFS          0x00004000          /* identifies the root filesystem */
162 
163 #define   __MNT_INTERNAL_FLAGS \
164           { MNT_LOCAL,                  0,        "local" }, \
165           { MNT_QUOTA,                  0,        "with quotas" }, \
166           { MNT_ROOTFS,                 1,        "root file system" },
167 
168 /*
169  * Mask of flags that are visible to statvfs()
170  */
171 #define   MNT_VISFLAGMASK     ( \
172      MNT_RDONLY | \
173      MNT_SYNCHRONOUS | \
174      MNT_NOEXEC | \
175      MNT_NOSUID | \
176      MNT_NODEV | \
177      MNT_UNION | \
178      MNT_NFS4ACLS | \
179      MNT_ASYNC | \
180      MNT_NOCOREDUMP | \
181      MNT_IGNORE | \
182      MNT_DISCARD | \
183      MNT_NOATIME | \
184      MNT_SYMPERM | \
185      MNT_NODEVMTIME | \
186      MNT_SOFTDEP | \
187      MNT_EXRDONLY | \
188      MNT_EXPORTED | \
189      MNT_DEFEXPORTED | \
190      MNT_EXPORTANON | \
191      MNT_EXKERB | \
192      MNT_EXNORESPORT | \
193      MNT_EXPUBLIC | \
194      MNT_LOCAL | \
195      MNT_QUOTA | \
196      MNT_ROOTFS | \
197      MNT_LOG | \
198      MNT_POSIX1EACLS | \
199      MNT_EXTATTR | \
200      MNT_AUTOMOUNTED)
201 
202 /*
203  * External filesystem control flags.
204  */
205 #define   MNT_UPDATE          0x00010000          /* not a real mount, just an update */
206 #define   MNT_RELOAD          0x00040000          /* reload filesystem data */
207 #define   MNT_FORCE 0x00080000          /* force unmount or readonly change */
208 #define   MNT_GETARGS         0x00400000          /* retrieve file system specific args */
209 
210 #define   MNT_OP_FLAGS        (MNT_UPDATE|MNT_RELOAD|MNT_FORCE|MNT_GETARGS)
211 
212 #define   __MNT_EXTERNAL_FLAGS \
213           { MNT_UPDATE,                 1,        "being updated" }, \
214           { MNT_RELOAD,                 1,        "reload filesystem data" }, \
215           { MNT_FORCE,                  1,        "force unmount or readonly change" }, \
216           { MNT_GETARGS,                1,        "retrieve mount arguments" },
217 
218 /*
219  * Internal filesystem control flags.
220  * These are set in struct mount mnt_iflag.
221  *
222  * IMNT_UNMOUNT locks the mount entry so that name lookup cannot proceed
223  * past the mount point.  This keeps the subtree stable during mounts
224  * and unmounts.
225  */
226 #define   IMNT_GONE 0x00000001          /* filesystem is gone.. */
227 #define   IMNT_UNMOUNT        0x00000002          /* unmount in progress */
228 #define   IMNT_WANTRDWR       0x00000004          /* upgrade to read/write requested */
229 #define   IMNT_WANTRDONLY     0x00000008          /* upgrade to readonly requested */
230 #define   IMNT_NCLOOKUP       0x00000020          /* can do lookop direct in namecache */
231 #define   IMNT_DTYPE          0x00000040          /* returns d_type fields */
232 #define   IMNT_SHRLOOKUP      0x00000080          /* can do LK_SHARED lookups */
233 #define   IMNT_MPSAFE         0x00000100          /* file system code MP safe */
234 #define   IMNT_CAN_RWTORO     0x00000200          /* can downgrade fs to from rw to r/o */
235 #define   IMNT_ONWORKLIST     0x00000400          /* on syncer worklist */
236 
237 #define   __MNT_FLAGS \
238           __MNT_BASIC_FLAGS \
239           __MNT_EXPORTED_FLAGS \
240           __MNT_INTERNAL_FLAGS \
241           __MNT_EXTERNAL_FLAGS
242 
243 #define   __MNT_FLAG_BITS \
244           "\20" \
245           "\40MNT_SOFTDEP" \
246           "\37MNT_NODEVMTIME" \
247           "\36MNT_SYMPERM" \
248           "\35MNT_EXPUBLIC" \
249           "\34MNT_EXNORESPORT" \
250           "\33MNT_NOATIME" \
251           "\32MNT_LOG" \
252           "\31MNT_EXTATTR" \
253           "\30MNT_DISCARD" \
254           "\27MNT_GETARGS" \
255           "\26MNT_NFS4ACLS" \
256           "\25MNT_IGNORE" \
257           "\24MNT_FORCE" \
258           "\23MNT_RELOAD" \
259           "\22MNT_RELATIME" \
260           "\21MNT_UPDATE" \
261           "\20MNT_NOCOREDUMP" \
262           "\17MNT_ROOTFS" \
263           "\16MNT_QUOTA" \
264           "\15MNT_LOCAL" \
265           "\14MNT_EXKERB|MNT_POSIX1EACLS" \
266           "\13MNT_EXPORTANON" \
267           "\12MNT_DEFEXPORTED" \
268           "\11MNT_EXPORTED" \
269           "\10MNT_EXRDONLY" \
270           "\07MNT_ASYNC" \
271           "\06MNT_UNION" \
272           "\05MNT_NODEV" \
273           "\04MNT_NOSUID" \
274           "\03MNT_NOEXEC" \
275           "\02MNT_SYNCHRONOUS" \
276           "\01MNT_RDONLY"
277 
278 #define   __IMNT_FLAG_BITS \
279           "\20" \
280           "\13IMNT_ONWORKLIST" \
281           "\12IMNT_CAN_RWTORO" \
282           "\11IMNT_MPSAFE" \
283           "\10IMNT_SHRLOOKUP" \
284           "\07IMNT_DTYPE" \
285           "\06IMNT_NCLOOKUP" \
286           "\04IMNT_WANTRDONLY" \
287           "\03IMNT_WANTRDWR" \
288           "\02IMNT_UNMOUNT" \
289           "\01IMNT_GONE"
290 
291 /*
292  * Flags for various system call interfaces.
293  *
294  * waitfor flags to vfs_sync() and getvfsstat()
295  */
296 #define   MNT_WAIT  1         /* synchronously wait for I/O to complete */
297 #define   MNT_NOWAIT          2         /* start all I/O, but do not wait for it */
298 #define   MNT_LAZY  3         /* push data not written by filesystem syncer */
299 #endif /* _SYS_FSTYPES_H_ */
300