/** * D header file for the linux/fs.h interface. * * This file has definitions for some important file table structures * and constants and structures used by various generic file system * ioctl's. * * Copyright: The D Language Foundation 2021. * License : $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) * Authors : Luís Ferreira */module core.sys.linux.fs; version (linux): public import core.sys.posix.sys.ioctl; import core.stdc.config : c_ulong, c_long; extern (C):@nogc:nothrow: enum INR_OPEN_CUR = 1024; /// Initial setting for nfile rlimitsenum INR_OPEN_MAX = 4096; /// Hard limit for nfile rlimits enum BLOCK_SIZE_BITS = 10; ///enum BLOCK_SIZE = 1 << BLOCK_SIZE_BITS; /// enum{ SEEK_SET = 0, /// seek relative to beginning of file SEEK_CUR = 1, /// seek relative to current file position SEEK_END = 2, /// seek relative to end of file SEEK_DATA = 3, /// seek to the next data SEEK_HOLE = 4, /// seek to the next hole SEEK_MAX = SEEK_HOLE, ///} enum{ RENAME_NOREPLACE = 1 << 0, /// Don't overwrite target RENAME_EXCHANGE = 1 << 1, /// Exchange source and dest RENAME_WHITEOUT = 1 << 2, /// Whiteout source} struct file_clone_range{ long src_fd; ulong src_offset; ulong src_length; ulong dest_offset;} struct fstrim_range{ ulong start; ulong len; ulong minlen;} /** * extent-same (dedupe) ioctls; these MUST match the btrfs ioctl definitions */enum{ FILE_DEDUPE_RANGE_SAME = 0, FILE_DEDUPE_RANGE_DIFFERS = 1,} /** * from struct btrfs_ioctl_file_extent_same_info */struct file_dedupe_range_info{ long dest_fd; /// in - destination file ulong dest_offset; /// in - start of extent in destination ulong bytes_deduped; /// out - total # of bytes we were able to dedupe from this file. /** status of this dedupe operation: * < 0 for error * == FILE_DEDUPE_RANGE_SAME if dedupe succeeds * == FILE_DEDUPE_RANGE_DIFFERS if data differs */ int status; uint reserved; /// must be zero} /** * from struct btrfs_ioctl_file_extent_same_args */struct file_dedupe_range{ ulong src_offset; /// in - start of extent in source ulong src_length; /// in - length of extent ushort dest_count; /// in - total elements in info array ushort reserved1; /// must be zero uint reserved2; /// must be zero file_dedupe_range_info[0] info;} /** * And dynamically-tunable limits and defaults: */struct files_stat_struct{ c_ulong nr_files; /// read only c_ulong nr_free_files; /// read only c_ulong max_files; /// tunable} struct inodes_stat_t{ c_long nr_inodes; c_long nr_unused; c_long[5] dummy; /// padding for sysctl ABI compatibility} enum NR_FILE = 8192; /** * Structure for FS_IOC_FSGETXATTR[A] and FS_IOC_FSSETXATTR. */struct fsxattr{ uint fsx_xflags; uint fsx_extsize; uint fsx_nextents; uint fsx_projid; /// project identifier uint fsx_cowextsize; /// CoW extsize ubyte[8] fsx_pad;} /* * Flags for the fsx_xflags field */enum { S_XFLAG_REALTIME = 0x00000001, /// data in realtime volume S_XFLAG_PREALLOC = 0x00000002, /// preallocated file extents S_XFLAG_IMMUTABLE = 0x00000008, /// file cannot be modified S_XFLAG_APPEND = 0x00000010, /// all writes append S_XFLAG_SYNC = 0x00000020, /// all writes synchronous S_XFLAG_NOATIME = 0x00000040, /// do not update access time S_XFLAG_NODUMP = 0x00000080, /// do not include in backups S_XFLAG_RTINHERIT = 0x00000100, /// create with rt bit set S_XFLAG_PROJINHERIT = 0x00000200, /// create with parents projid S_XFLAG_NOSYMLINKS = 0x00000400, /// disallow symlink creation S_XFLAG_EXTSIZE = 0x00000800, /// extent size allocator hint S_XFLAG_EXTSZINHERIT = 0x00001000, /// inherit inode extent size S_XFLAG_NODEFRAG = 0x00002000, /// do not defragment S_XFLAG_FILESTREAM = 0x00004000, /// use filestream allocator S_XFLAG_DAX = 0x00008000, /// use DAX for IO S_XFLAG_COWEXTSIZE = 0x00010000, /// CoW extent size allocator hint S_XFLAG_HASATTR = 0x80000000, /// no DIFLAG for this} static if (__traits(compiles, _IO(1, 2))){ enum BLKROSET = _IO(0x12, 93); /// set device read-only enum BLKROGET = _IO(0x12, 94); /// get read-only status enum BLKRRPART = _IO(0x12, 95); /// re-read partition table enum BLKGETSIZE = _IO(0x12, 96); /// return device size enum BLKFLSBUF = _IO(0x12, 97); /// flush buffer cache enum BLKRASET = _IO(0x12, 98); /// set read ahead for block device enum BLKRAGET = _IO(0x12, 99); /// get current read ahead setting enum BLKFRASET = _IO(0x12, 100); /// set filesystem enum BLKFRAGET = _IO(0x12, 101); /// get filesystem enum BLKSECTSET = _IO(0x12, 102); /// set max sectors per request enum BLKSECTGET = _IO(0x12, 103); /// get max sectors per request enum BLKSSZGET = _IO(0x12, 104); /// get block device sector size enum BLKBSZGET = _IOR!size_t(0x12, 112); enum BLKBSZSET = _IOW!size_t(0x12, 113); enum BLKGETSIZE64 = _IOR!size_t(0x12, 114); enum BLKTRACESTART = _IO(0x12, 116); enum BLKTRACESTOP = _IO(0x12, 117); enum BLKTRACETEARDOWN = _IO(0x12, 118); enum BLKDISCARD = _IO(0x12, 119); enum BLKIOMIN = _IO(0x12, 120); enum BLKIOOPT = _IO(0x12, 121); enum BLKALIGNOFF = _IO(0x12, 122); enum BLKPBSZGET = _IO(0x12, 123); enum BLKDISCARDZEROES = _IO(0x12, 124); enum BLKSECDISCARD = _IO(0x12, 125); enum BLKROTATIONAL = _IO(0x12, 126); enum BLKZEROOUT = _IO(0x12, 127); enum BMAP_IOCTL = 1; /// obsolete - kept for compatibility enum FIBMAP = _IO(0x00, 1); /// bmap access enum FIGETBSZ = _IO(0x00, 2); /// get the block size used for bmap} enum FSLABEL_MAX = 256; /// Max chars for the interface; each fs may differ /** * Inode flags (FS_IOC_GETFLAGS / FS_IOC_SETFLAGS) * * Note: for historical reasons, these flags were originally used and * defined for use by ext2/ext3, and then other file systems started * using these flags so they wouldn't need to write their own version * of chattr/lsattr (which was shipped as part of e2fsprogs). You * should think twice before trying to use these flags in new * contexts, or trying to assign these flags, since they are used both * as the UAPI and the on-disk encoding for ext2/3/4. Also, we are * almost out of 32-bit flags. :-) * * We have recently hoisted FS_IOC_FSGETXATTR / FS_IOC_FSSETXATTR from * XFS to the generic FS level interface. This uses a structure that * has padding and hence has more room to grow, so it may be more * appropriate for many new use cases. */enum { FS_SECRM_FL = 0x00000001, /// Secure deletion FS_UNRM_FL = 0x00000002, /// Undelete FS_COMPR_FL = 0x00000004, /// Compress file FS_SYNC_FL = 0x00000008, /// Synchronous updates FS_IMMUTABLE_FL = 0x00000010, /// Immutable file FS_APPEND_FL = 0x00000020, /// writes to file may only append FS_NODUMP_FL = 0x00000040, /// do not dump file FS_NOATIME_FL = 0x00000080, /// do not update atime FS_DIRTY_FL = 0x00000100, /// Reserved for compression usage FS_COMPRBLK_FL = 0x00000200, /// One or more compressed clusters FS_NOCOMP_FL = 0x00000400, /// Don't compress FS_ENCRYPT_FL = 0x00000800, /// Encrypted file FS_BTREE_FL = 0x00001000, /// btree format dir FS_INDEX_FL = 0x00001000, /// hash-indexed directory FS_IMAGIC_FL = 0x00002000, /// AFS directory FS_JOURNAL_DATA_FL = 0x00004000, /// Reserved for ext3 FS_NOTAIL_FL = 0x00008000, /// file tail should not be merged FS_DIRSYNC_FL = 0x00010000, /// dirsync behaviour (directories only) FS_TOPDIR_FL = 0x00020000, /// Top of directory hierarchie FS_HUGE_FILE_FL = 0x00040000, /// Reserved for ext4 FS_EXTENT_FL = 0x00080000, /// Extents FS_VERITY_FL = 0x00100000, /// Verity protected inode FS_EA_INODE_FL = 0x00200000, /// Inode used for large EA FS_EOFBLOCKS_FL = 0x00400000, /// Reserved for ext4 FS_NOCOW_FL = 0x00800000, /// Do not cow file FS_DAX_FL = 0x02000000, /// Inode is DAX FS_INLINE_DATA_FL = 0x10000000, /// Reserved for ext4 FS_PROJINHERIT_FL = 0x20000000, /// Create with parents projid FS_CASEFOLD_FL = 0x40000000, /// Folder is case insensitive FS_RESERVED_FL = 0x80000000, /// reserved for ext2 lib} enum FS_FL_USER_VISIBLE = 0x0003DFFF; /// User visible flagsenum FS_FL_USER_MODIFIABLE = 0x000380FF; /// User modifiable flags enum SYNC_FILE_RANGE_WAIT_BEFORE = 1;enum SYNC_FILE_RANGE_WRITE = 2;enum SYNC_FILE_RANGE_WAIT_AFTER = 4;enum SYNC_FILE_RANGE_WRITE_AND_WAIT = SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WAIT_AFTER; alias __kernel_rwf_t = int; /** * Flags for preadv2/pwritev2: */enum : __kernel_rwf_t { RWF_HIPRI = 0x00000001, /// high priority request, poll if possible RWF_DSYNC = 0x00000002, /// per-IO O_DSYNC RWF_SYNC = 0x00000004, /// per-IO O_SYNC RWF_NOWAIT = 0x00000008, /// per-IO, return -EAGAIN if operation would block RWF_APPEND = 0x00000010, /// per-IO O_APPEND} /// mask of flags supported by the kernelenum RWF_SUPPORTED = RWF_HIPRI | RWF_DSYNC | RWF_SYNC | RWF_NOWAIT | RWF_APPEND;
/**
* D header file for the linux/fs.h interface.
*
* This file has definitions for some important file table structures
* and constants and structures used by various generic file system
* ioctl's.
*
* Copyright: The D Language Foundation 2021.
* License : $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
* Authors : Luís Ferreira
*/
module core.sys.linux.fs;
version (linux):
public import core.sys.posix.sys.ioctl;
import core.stdc.config : c_ulong, c_long;
extern (C):
@nogc:
nothrow:
enum INR_OPEN_CUR = 1024; /// Initial setting for nfile rlimits
enum INR_OPEN_MAX = 4096; /// Hard limit for nfile rlimits
enum BLOCK_SIZE_BITS = 10; ///
enum BLOCK_SIZE = 1 << BLOCK_SIZE_BITS; ///
enum
{
SEEK_SET = 0, /// seek relative to beginning of file
SEEK_CUR = 1, /// seek relative to current file position
SEEK_END = 2, /// seek relative to end of file
SEEK_DATA = 3, /// seek to the next data
SEEK_HOLE = 4, /// seek to the next hole
SEEK_MAX = SEEK_HOLE, ///
}
enum
{
RENAME_NOREPLACE = 1 << 0, /// Don't overwrite target
RENAME_EXCHANGE = 1 << 1, /// Exchange source and dest
RENAME_WHITEOUT = 1 << 2, /// Whiteout source
}
struct file_clone_range
{
long src_fd;
ulong src_offset;
ulong src_length;
ulong dest_offset;
}
struct fstrim_range
{
ulong start;
ulong len;
ulong minlen;
}
/**
* extent-same (dedupe) ioctls; these MUST match the btrfs ioctl definitions
*/
enum
{
FILE_DEDUPE_RANGE_SAME = 0,
FILE_DEDUPE_RANGE_DIFFERS = 1,
}
/**
* from struct btrfs_ioctl_file_extent_same_info
*/
struct file_dedupe_range_info
{
long dest_fd; /// in - destination file
ulong dest_offset; /// in - start of extent in destination
ulong bytes_deduped; /// out - total # of bytes we were able to dedupe from this file.
/** status of this dedupe operation:
* < 0 for error
* == FILE_DEDUPE_RANGE_SAME if dedupe succeeds
* == FILE_DEDUPE_RANGE_DIFFERS if data differs
*/
int status;
uint reserved; /// must be zero
}
/**
* from struct btrfs_ioctl_file_extent_same_args
*/
struct file_dedupe_range
{
ulong src_offset; /// in - start of extent in source
ulong src_length; /// in - length of extent
ushort dest_count; /// in - total elements in info array
ushort reserved1; /// must be zero
uint reserved2; /// must be zero
file_dedupe_range_info[0] info;
}
/**
* And dynamically-tunable limits and defaults:
*/
struct files_stat_struct
{
c_ulong nr_files; /// read only
c_ulong nr_free_files; /// read only
c_ulong max_files; /// tunable
}
struct inodes_stat_t
{
c_long nr_inodes;
c_long nr_unused;
c_long[5] dummy; /// padding for sysctl ABI compatibility
}
enum NR_FILE = 8192;
/**
* Structure for FS_IOC_FSGETXATTR[A] and FS_IOC_FSSETXATTR.
*/
struct fsxattr
{
uint fsx_xflags;
uint fsx_extsize;
uint fsx_nextents;
uint fsx_projid; /// project identifier
uint fsx_cowextsize; /// CoW extsize
ubyte[8] fsx_pad;
}
/*
* Flags for the fsx_xflags field
*/
enum {
S_XFLAG_REALTIME = 0x00000001, /// data in realtime volume
S_XFLAG_PREALLOC = 0x00000002, /// preallocated file extents
S_XFLAG_IMMUTABLE = 0x00000008, /// file cannot be modified
S_XFLAG_APPEND = 0x00000010, /// all writes append
S_XFLAG_SYNC = 0x00000020, /// all writes synchronous
S_XFLAG_NOATIME = 0x00000040, /// do not update access time
S_XFLAG_NODUMP = 0x00000080, /// do not include in backups
S_XFLAG_RTINHERIT = 0x00000100, /// create with rt bit set
S_XFLAG_PROJINHERIT = 0x00000200, /// create with parents projid
S_XFLAG_NOSYMLINKS = 0x00000400, /// disallow symlink creation
S_XFLAG_EXTSIZE = 0x00000800, /// extent size allocator hint
S_XFLAG_EXTSZINHERIT = 0x00001000, /// inherit inode extent size
S_XFLAG_NODEFRAG = 0x00002000, /// do not defragment
S_XFLAG_FILESTREAM = 0x00004000, /// use filestream allocator
S_XFLAG_DAX = 0x00008000, /// use DAX for IO
S_XFLAG_COWEXTSIZE = 0x00010000, /// CoW extent size allocator hint
S_XFLAG_HASATTR = 0x80000000, /// no DIFLAG for this
}
static if (__traits(compiles, _IO(1, 2)))
{
enum BLKROSET = _IO(0x12, 93); /// set device read-only
enum BLKROGET = _IO(0x12, 94); /// get read-only status
enum BLKRRPART = _IO(0x12, 95); /// re-read partition table
enum BLKGETSIZE = _IO(0x12, 96); /// return device size
enum BLKFLSBUF = _IO(0x12, 97); /// flush buffer cache
enum BLKRASET = _IO(0x12, 98); /// set read ahead for block device
enum BLKRAGET = _IO(0x12, 99); /// get current read ahead setting
enum BLKFRASET = _IO(0x12, 100); /// set filesystem
enum BLKFRAGET = _IO(0x12, 101); /// get filesystem
enum BLKSECTSET = _IO(0x12, 102); /// set max sectors per request
enum BLKSECTGET = _IO(0x12, 103); /// get max sectors per request
enum BLKSSZGET = _IO(0x12, 104); /// get block device sector size
enum BLKBSZGET = _IOR!size_t(0x12, 112);
enum BLKBSZSET = _IOW!size_t(0x12, 113);
enum BLKGETSIZE64 = _IOR!size_t(0x12, 114);
enum BLKTRACESTART = _IO(0x12, 116);
enum BLKTRACESTOP = _IO(0x12, 117);
enum BLKTRACETEARDOWN = _IO(0x12, 118);
enum BLKDISCARD = _IO(0x12, 119);
enum BLKIOMIN = _IO(0x12, 120);
enum BLKIOOPT = _IO(0x12, 121);
enum BLKALIGNOFF = _IO(0x12, 122);
enum BLKPBSZGET = _IO(0x12, 123);
enum BLKDISCARDZEROES = _IO(0x12, 124);
enum BLKSECDISCARD = _IO(0x12, 125);
enum BLKROTATIONAL = _IO(0x12, 126);
enum BLKZEROOUT = _IO(0x12, 127);
enum BMAP_IOCTL = 1; /// obsolete - kept for compatibility
enum FIBMAP = _IO(0x00, 1); /// bmap access
enum FIGETBSZ = _IO(0x00, 2); /// get the block size used for bmap
}
enum FSLABEL_MAX = 256; /// Max chars for the interface; each fs may differ
/**
* Inode flags (FS_IOC_GETFLAGS / FS_IOC_SETFLAGS)
*
* Note: for historical reasons, these flags were originally used and
* defined for use by ext2/ext3, and then other file systems started
* using these flags so they wouldn't need to write their own version
* of chattr/lsattr (which was shipped as part of e2fsprogs). You
* should think twice before trying to use these flags in new
* contexts, or trying to assign these flags, since they are used both
* as the UAPI and the on-disk encoding for ext2/3/4. Also, we are
* almost out of 32-bit flags. :-)
*
* We have recently hoisted FS_IOC_FSGETXATTR / FS_IOC_FSSETXATTR from
* XFS to the generic FS level interface. This uses a structure that
* has padding and hence has more room to grow, so it may be more
* appropriate for many new use cases.
*/
enum {
FS_SECRM_FL = 0x00000001, /// Secure deletion
FS_UNRM_FL = 0x00000002, /// Undelete
FS_COMPR_FL = 0x00000004, /// Compress file
FS_SYNC_FL = 0x00000008, /// Synchronous updates
FS_IMMUTABLE_FL = 0x00000010, /// Immutable file
FS_APPEND_FL = 0x00000020, /// writes to file may only append
FS_NODUMP_FL = 0x00000040, /// do not dump file
FS_NOATIME_FL = 0x00000080, /// do not update atime
FS_DIRTY_FL = 0x00000100, /// Reserved for compression usage
FS_COMPRBLK_FL = 0x00000200, /// One or more compressed clusters
FS_NOCOMP_FL = 0x00000400, /// Don't compress
FS_ENCRYPT_FL = 0x00000800, /// Encrypted file
FS_BTREE_FL = 0x00001000, /// btree format dir
FS_INDEX_FL = 0x00001000, /// hash-indexed directory
FS_IMAGIC_FL = 0x00002000, /// AFS directory
FS_JOURNAL_DATA_FL = 0x00004000, /// Reserved for ext3
FS_NOTAIL_FL = 0x00008000, /// file tail should not be merged
FS_DIRSYNC_FL = 0x00010000, /// dirsync behaviour (directories only)
FS_TOPDIR_FL = 0x00020000, /// Top of directory hierarchie
FS_HUGE_FILE_FL = 0x00040000, /// Reserved for ext4
FS_EXTENT_FL = 0x00080000, /// Extents
FS_VERITY_FL = 0x00100000, /// Verity protected inode
FS_EA_INODE_FL = 0x00200000, /// Inode used for large EA
FS_EOFBLOCKS_FL = 0x00400000, /// Reserved for ext4
FS_NOCOW_FL = 0x00800000, /// Do not cow file
FS_DAX_FL = 0x02000000, /// Inode is DAX
FS_INLINE_DATA_FL = 0x10000000, /// Reserved for ext4
FS_PROJINHERIT_FL = 0x20000000, /// Create with parents projid
FS_CASEFOLD_FL = 0x40000000, /// Folder is case insensitive
FS_RESERVED_FL = 0x80000000, /// reserved for ext2 lib
}
enum FS_FL_USER_VISIBLE = 0x0003DFFF; /// User visible flags
enum FS_FL_USER_MODIFIABLE = 0x000380FF; /// User modifiable flags
enum SYNC_FILE_RANGE_WAIT_BEFORE = 1;
enum SYNC_FILE_RANGE_WRITE = 2;
enum SYNC_FILE_RANGE_WAIT_AFTER = 4;
enum SYNC_FILE_RANGE_WRITE_AND_WAIT = SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WAIT_AFTER;
alias __kernel_rwf_t = int;
/**
* Flags for preadv2/pwritev2:
*/
enum : __kernel_rwf_t {
RWF_HIPRI = 0x00000001, /// high priority request, poll if possible
RWF_DSYNC = 0x00000002, /// per-IO O_DSYNC
RWF_SYNC = 0x00000004, /// per-IO O_SYNC
RWF_NOWAIT = 0x00000008, /// per-IO, return -EAGAIN if operation would block
RWF_APPEND = 0x00000010, /// per-IO O_APPEND
}
/// mask of flags supported by the kernel
enum RWF_SUPPORTED = RWF_HIPRI | RWF_DSYNC | RWF_SYNC | RWF_NOWAIT | RWF_APPEND;