]> git.ipfire.org Git - thirdparty/gcc.git/blame - libphobos/libdruntime/core/sys/linux/fs.d
Merge remote-tracking branch 'origin/master' into devel/c++-contracts
[thirdparty/gcc.git] / libphobos / libdruntime / core / sys / linux / fs.d
CommitLineData
5fee5ec3
IB
1/**
2 * D header file for the linux/fs.h interface.
3 *
4 * This file has definitions for some important file table structures
5 * and constants and structures used by various generic file system
6 * ioctl's.
7 *
8 * Copyright: The D Language Foundation 2021.
9 * License : $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
10 * Authors : Luís Ferreira
11 */
12module core.sys.linux.fs;
13
14version (linux):
15
16public import core.sys.posix.sys.ioctl;
17
18import core.stdc.config : c_ulong, c_long;
19
20extern (C):
5fee5ec3
IB
21@nogc:
22nothrow:
23
24enum INR_OPEN_CUR = 1024; /// Initial setting for nfile rlimits
25enum INR_OPEN_MAX = 4096; /// Hard limit for nfile rlimits
26
27enum BLOCK_SIZE_BITS = 10; ///
28enum BLOCK_SIZE = 1 << BLOCK_SIZE_BITS; ///
29
30enum
31{
32 SEEK_SET = 0, /// seek relative to beginning of file
33 SEEK_CUR = 1, /// seek relative to current file position
34 SEEK_END = 2, /// seek relative to end of file
35 SEEK_DATA = 3, /// seek to the next data
36 SEEK_HOLE = 4, /// seek to the next hole
37 SEEK_MAX = SEEK_HOLE, ///
38}
39
40enum
41{
42 RENAME_NOREPLACE = 1 << 0, /// Don't overwrite target
43 RENAME_EXCHANGE = 1 << 1, /// Exchange source and dest
44 RENAME_WHITEOUT = 1 << 2, /// Whiteout source
45}
46
47struct file_clone_range
48{
49 long src_fd;
50 ulong src_offset;
51 ulong src_length;
52 ulong dest_offset;
53}
54
55struct fstrim_range
56{
57 ulong start;
58 ulong len;
59 ulong minlen;
60}
61
62/**
63 * extent-same (dedupe) ioctls; these MUST match the btrfs ioctl definitions
64 */
65enum
66{
67 FILE_DEDUPE_RANGE_SAME = 0,
68 FILE_DEDUPE_RANGE_DIFFERS = 1,
69}
70
71/**
72 * from struct btrfs_ioctl_file_extent_same_info
73 */
74struct file_dedupe_range_info
75{
76 long dest_fd; /// in - destination file
77 ulong dest_offset; /// in - start of extent in destination
78 ulong bytes_deduped; /// out - total # of bytes we were able to dedupe from this file.
79 /** status of this dedupe operation:
80 * < 0 for error
81 * == FILE_DEDUPE_RANGE_SAME if dedupe succeeds
82 * == FILE_DEDUPE_RANGE_DIFFERS if data differs
83 */
84 int status;
85 uint reserved; /// must be zero
86}
87
88/**
89 * from struct btrfs_ioctl_file_extent_same_args
90 */
91struct file_dedupe_range
92{
93 ulong src_offset; /// in - start of extent in source
94 ulong src_length; /// in - length of extent
95 ushort dest_count; /// in - total elements in info array
96 ushort reserved1; /// must be zero
97 uint reserved2; /// must be zero
98 file_dedupe_range_info[0] info;
99}
100
101/**
102 * And dynamically-tunable limits and defaults:
103 */
104struct files_stat_struct
105{
106 c_ulong nr_files; /// read only
107 c_ulong nr_free_files; /// read only
108 c_ulong max_files; /// tunable
109}
110
111struct inodes_stat_t
112{
113 c_long nr_inodes;
114 c_long nr_unused;
115 c_long[5] dummy; /// padding for sysctl ABI compatibility
116}
117
118enum NR_FILE = 8192;
119
120/**
121 * Structure for FS_IOC_FSGETXATTR[A] and FS_IOC_FSSETXATTR.
122 */
123struct fsxattr
124{
125 uint fsx_xflags;
126 uint fsx_extsize;
127 uint fsx_nextents;
128 uint fsx_projid; /// project identifier
129 uint fsx_cowextsize; /// CoW extsize
130 ubyte[8] fsx_pad;
131}
132
133/*
134 * Flags for the fsx_xflags field
135 */
136enum {
137 S_XFLAG_REALTIME = 0x00000001, /// data in realtime volume
138 S_XFLAG_PREALLOC = 0x00000002, /// preallocated file extents
139 S_XFLAG_IMMUTABLE = 0x00000008, /// file cannot be modified
140 S_XFLAG_APPEND = 0x00000010, /// all writes append
141 S_XFLAG_SYNC = 0x00000020, /// all writes synchronous
142 S_XFLAG_NOATIME = 0x00000040, /// do not update access time
143 S_XFLAG_NODUMP = 0x00000080, /// do not include in backups
144 S_XFLAG_RTINHERIT = 0x00000100, /// create with rt bit set
145 S_XFLAG_PROJINHERIT = 0x00000200, /// create with parents projid
146 S_XFLAG_NOSYMLINKS = 0x00000400, /// disallow symlink creation
147 S_XFLAG_EXTSIZE = 0x00000800, /// extent size allocator hint
148 S_XFLAG_EXTSZINHERIT = 0x00001000, /// inherit inode extent size
149 S_XFLAG_NODEFRAG = 0x00002000, /// do not defragment
150 S_XFLAG_FILESTREAM = 0x00004000, /// use filestream allocator
151 S_XFLAG_DAX = 0x00008000, /// use DAX for IO
152 S_XFLAG_COWEXTSIZE = 0x00010000, /// CoW extent size allocator hint
153 S_XFLAG_HASATTR = 0x80000000, /// no DIFLAG for this
154}
155
0fb57034
IB
156static if (__traits(compiles, _IO(1, 2)))
157{
158 enum BLKROSET = _IO(0x12, 93); /// set device read-only
159 enum BLKROGET = _IO(0x12, 94); /// get read-only status
160 enum BLKRRPART = _IO(0x12, 95); /// re-read partition table
161 enum BLKGETSIZE = _IO(0x12, 96); /// return device size
162 enum BLKFLSBUF = _IO(0x12, 97); /// flush buffer cache
163 enum BLKRASET = _IO(0x12, 98); /// set read ahead for block device
164 enum BLKRAGET = _IO(0x12, 99); /// get current read ahead setting
165 enum BLKFRASET = _IO(0x12, 100); /// set filesystem
166 enum BLKFRAGET = _IO(0x12, 101); /// get filesystem
167 enum BLKSECTSET = _IO(0x12, 102); /// set max sectors per request
168 enum BLKSECTGET = _IO(0x12, 103); /// get max sectors per request
169 enum BLKSSZGET = _IO(0x12, 104); /// get block device sector size
170
171
172 enum BLKBSZGET = _IOR!size_t(0x12, 112);
173 enum BLKBSZSET = _IOW!size_t(0x12, 113);
174 enum BLKGETSIZE64 = _IOR!size_t(0x12, 114);
175 enum BLKTRACESTART = _IO(0x12, 116);
176 enum BLKTRACESTOP = _IO(0x12, 117);
177 enum BLKTRACETEARDOWN = _IO(0x12, 118);
178 enum BLKDISCARD = _IO(0x12, 119);
179 enum BLKIOMIN = _IO(0x12, 120);
180 enum BLKIOOPT = _IO(0x12, 121);
181 enum BLKALIGNOFF = _IO(0x12, 122);
182 enum BLKPBSZGET = _IO(0x12, 123);
183 enum BLKDISCARDZEROES = _IO(0x12, 124);
184 enum BLKSECDISCARD = _IO(0x12, 125);
185 enum BLKROTATIONAL = _IO(0x12, 126);
186 enum BLKZEROOUT = _IO(0x12, 127);
187
188 enum BMAP_IOCTL = 1; /// obsolete - kept for compatibility
189 enum FIBMAP = _IO(0x00, 1); /// bmap access
190 enum FIGETBSZ = _IO(0x00, 2); /// get the block size used for bmap
191}
5fee5ec3
IB
192
193enum FSLABEL_MAX = 256; /// Max chars for the interface; each fs may differ
194
195/**
196 * Inode flags (FS_IOC_GETFLAGS / FS_IOC_SETFLAGS)
197 *
198 * Note: for historical reasons, these flags were originally used and
199 * defined for use by ext2/ext3, and then other file systems started
200 * using these flags so they wouldn't need to write their own version
201 * of chattr/lsattr (which was shipped as part of e2fsprogs). You
202 * should think twice before trying to use these flags in new
203 * contexts, or trying to assign these flags, since they are used both
204 * as the UAPI and the on-disk encoding for ext2/3/4. Also, we are
205 * almost out of 32-bit flags. :-)
206 *
207 * We have recently hoisted FS_IOC_FSGETXATTR / FS_IOC_FSSETXATTR from
208 * XFS to the generic FS level interface. This uses a structure that
209 * has padding and hence has more room to grow, so it may be more
210 * appropriate for many new use cases.
211 */
212enum {
213 FS_SECRM_FL = 0x00000001, /// Secure deletion
214 FS_UNRM_FL = 0x00000002, /// Undelete
215 FS_COMPR_FL = 0x00000004, /// Compress file
216 FS_SYNC_FL = 0x00000008, /// Synchronous updates
217 FS_IMMUTABLE_FL = 0x00000010, /// Immutable file
218 FS_APPEND_FL = 0x00000020, /// writes to file may only append
219 FS_NODUMP_FL = 0x00000040, /// do not dump file
220 FS_NOATIME_FL = 0x00000080, /// do not update atime
221 FS_DIRTY_FL = 0x00000100, /// Reserved for compression usage
222 FS_COMPRBLK_FL = 0x00000200, /// One or more compressed clusters
223 FS_NOCOMP_FL = 0x00000400, /// Don't compress
224 FS_ENCRYPT_FL = 0x00000800, /// Encrypted file
225 FS_BTREE_FL = 0x00001000, /// btree format dir
226 FS_INDEX_FL = 0x00001000, /// hash-indexed directory
227 FS_IMAGIC_FL = 0x00002000, /// AFS directory
228 FS_JOURNAL_DATA_FL = 0x00004000, /// Reserved for ext3
229 FS_NOTAIL_FL = 0x00008000, /// file tail should not be merged
230 FS_DIRSYNC_FL = 0x00010000, /// dirsync behaviour (directories only)
231 FS_TOPDIR_FL = 0x00020000, /// Top of directory hierarchie
232 FS_HUGE_FILE_FL = 0x00040000, /// Reserved for ext4
233 FS_EXTENT_FL = 0x00080000, /// Extents
234 FS_VERITY_FL = 0x00100000, /// Verity protected inode
235 FS_EA_INODE_FL = 0x00200000, /// Inode used for large EA
236 FS_EOFBLOCKS_FL = 0x00400000, /// Reserved for ext4
237 FS_NOCOW_FL = 0x00800000, /// Do not cow file
238 FS_DAX_FL = 0x02000000, /// Inode is DAX
239 FS_INLINE_DATA_FL = 0x10000000, /// Reserved for ext4
240 FS_PROJINHERIT_FL = 0x20000000, /// Create with parents projid
241 FS_CASEFOLD_FL = 0x40000000, /// Folder is case insensitive
242 FS_RESERVED_FL = 0x80000000, /// reserved for ext2 lib
243}
244
245enum FS_FL_USER_VISIBLE = 0x0003DFFF; /// User visible flags
246enum FS_FL_USER_MODIFIABLE = 0x000380FF; /// User modifiable flags
247
248enum SYNC_FILE_RANGE_WAIT_BEFORE = 1;
249enum SYNC_FILE_RANGE_WRITE = 2;
250enum SYNC_FILE_RANGE_WAIT_AFTER = 4;
251enum SYNC_FILE_RANGE_WRITE_AND_WAIT = SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WAIT_AFTER;
252
253alias __kernel_rwf_t = int;
254
255/**
256 * Flags for preadv2/pwritev2:
257 */
258enum : __kernel_rwf_t {
259 RWF_HIPRI = 0x00000001, /// high priority request, poll if possible
260 RWF_DSYNC = 0x00000002, /// per-IO O_DSYNC
261 RWF_SYNC = 0x00000004, /// per-IO O_SYNC
262 RWF_NOWAIT = 0x00000008, /// per-IO, return -EAGAIN if operation would block
263 RWF_APPEND = 0x00000010, /// per-IO O_APPEND
264}
265
266/// mask of flags supported by the kernel
267enum RWF_SUPPORTED = RWF_HIPRI | RWF_DSYNC | RWF_SYNC | RWF_NOWAIT | RWF_APPEND;