]> git.ipfire.org Git - thirdparty/e2fsprogs.git/blobdiff - lib/ext2fs/ext2_fs.h
Merge branch 'maint' into next
[thirdparty/e2fsprogs.git] / lib / ext2fs / ext2_fs.h
index f9a4bdb9356648e37fdbfeaa79cc6a93bee8320a..2496d16dac55009a1ef51959e83edc83513df30f 100644 (file)
@@ -233,21 +233,21 @@ struct ext2_dx_root_info {
 #define EXT2_HASH_FLAG_INCOMPAT        0x1
 
 struct ext2_dx_entry {
-       __u32 hash;
-       __u32 block;
+       __le32 hash;
+       __le32 block;
 };
 
 struct ext2_dx_countlimit {
-       __u16 limit;
-       __u16 count;
+       __le16 limit;
+       __le16 count;
 };
 
 /*
  * This goes at the end of each htree block.
  */
 struct ext2_dx_tail {
-       __u32 dt_reserved;
-       __u32 dt_checksum;      /* crc32c(uuid+inum+dxblock) */
+       __le32 dt_reserved;
+       __le32 dt_checksum;     /* crc32c(uuid+inum+dxblock) */
 };
 
 /*
@@ -307,7 +307,8 @@ struct ext2_dx_tail {
 #define EXT2_DIRTY_FL                  0x00000100
 #define EXT2_COMPRBLK_FL               0x00000200 /* One or more compressed clusters */
 #define EXT2_NOCOMPR_FL                        0x00000400 /* Access raw compressed data */
-#define EXT2_ECOMPR_FL                 0x00000800 /* Compression error */
+       /* nb: was previously EXT2_ECOMPR_FL */
+#define EXT4_ENCRYPT_FL                        0x00000800 /* encrypted inode */
 /* End compression flags --- maybe not all used */
 #define EXT2_BTREE_FL                  0x00001000 /* btree format dir */
 #define EXT2_INDEX_FL                  0x00001000 /* hash-indexed directory */
@@ -325,10 +326,11 @@ struct ext2_dx_tail {
 #define EXT4_SNAPFILE_DELETED_FL       0x04000000  /* Snapshot is being deleted */
 #define EXT4_SNAPFILE_SHRUNK_FL                0x08000000  /* Snapshot shrink has completed */
 #define EXT4_INLINE_DATA_FL            0x10000000 /* Inode has inline data */
+#define EXT4_PROJINHERIT_FL            0x20000000 /* Create with parents projid */
 #define EXT2_RESERVED_FL               0x80000000 /* reserved for ext2 lib */
 
-#define EXT2_FL_USER_VISIBLE           0x004BDFFF /* User visible flags */
-#define EXT2_FL_USER_MODIFIABLE                0x004B80FF /* User modifiable flags */
+#define EXT2_FL_USER_VISIBLE           0x204BDFFF /* User visible flags */
+#define EXT2_FL_USER_MODIFIABLE                0x204B80FF /* User modifiable flags */
 
 /*
  * ioctl commands
@@ -396,7 +398,7 @@ struct ext2_inode {
        __u32   i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
        __u32   i_generation;   /* File version (for NFS) */
        __u32   i_file_acl;     /* File ACL */
-       __u32   i_size_high;    /* Formerly i_dir_acl, directory ACL */
+       __u32   i_size_high;
        __u32   i_faddr;        /* Fragment address */
        union {
                struct {
@@ -444,7 +446,7 @@ struct ext2_inode_large {
        __u32   i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
        __u32   i_generation;   /* File version (for NFS) */
        __u32   i_file_acl;     /* File ACL */
-       __u32   i_size_high;    /* Formerly i_dir_acl, directory ACL */
+       __u32   i_size_high;
        __u32   i_faddr;        /* Fragment address */
        union {
                struct {
@@ -472,16 +474,22 @@ struct ext2_inode_large {
        __u32   i_crtime;       /* File creation time */
        __u32   i_crtime_extra; /* extra File creation time (nsec << 2 | epoch)*/
        __u32   i_version_hi;   /* high 32 bits for 64-bit version */
+       __u32   i_projid;       /* Project ID */
 };
 
 #define EXT4_INODE_CSUM_HI_EXTRA_END   \
        (offsetof(struct ext2_inode_large, i_checksum_hi) + sizeof(__u16) - \
         EXT2_GOOD_OLD_INODE_SIZE)
 
-#define i_dir_acl      i_size_high
+#define EXT4_EPOCH_BITS 2
+#define EXT4_EPOCH_MASK ((1 << EXT4_EPOCH_BITS) - 1)
 
 #define i_checksum_lo  osd2.linux2.l_i_checksum_lo
 
+#define inode_includes(size, field)                    \
+       (size >= (sizeof(((struct ext2_inode_large *)0)->field) + \
+                 offsetof(struct ext2_inode_large, field)))
+
 #if defined(__KERNEL__) || defined(__linux__)
 #define i_reserved1    osd1.linux1.l_i_reserved1
 #define i_frag         osd2.linux2.l_i_frag
@@ -505,9 +513,16 @@ struct ext2_inode_large {
 
 #define inode_uid(inode)       ((inode).i_uid | (inode).osd2.linux2.l_i_uid_high << 16)
 #define inode_gid(inode)       ((inode).i_gid | (inode).osd2.linux2.l_i_gid_high << 16)
+#define inode_projid(inode)    ((inode).i_projid)
 #define ext2fs_set_i_uid_high(inode,x) ((inode).osd2.linux2.l_i_uid_high = (x))
 #define ext2fs_set_i_gid_high(inode,x) ((inode).osd2.linux2.l_i_gid_high = (x))
 
+static inline
+struct ext2_inode *EXT2_INODE(struct ext2_inode_large *large_inode)
+{
+       return (struct ext2_inode *) large_inode;
+}
+
 /*
  * File system states
  */
@@ -564,6 +579,47 @@ struct ext2_inode_large {
 /* Metadata checksum algorithms */
 #define EXT2_CRC32C_CHKSUM             1
 
+/* Encryption algorithms, key size and key reference len */
+#define EXT4_ENCRYPTION_MODE_INVALID           0
+#define EXT4_ENCRYPTION_MODE_AES_256_XTS       1
+#define EXT4_ENCRYPTION_MODE_AES_256_GCM       2
+#define EXT4_ENCRYPTION_MODE_AES_256_CBC       3
+#define EXT4_ENCRYPTION_MODE_AES_256_CTS       4
+
+#define EXT4_AES_256_XTS_KEY_SIZE              64
+#define EXT4_AES_256_GCM_KEY_SIZE              32
+#define EXT4_AES_256_CBC_KEY_SIZE              32
+#define EXT4_AES_256_CTS_KEY_SIZE              32
+#define EXT4_MAX_KEY_SIZE                      64
+
+#define EXT4_KEY_DESCRIPTOR_SIZE               8
+#define EXT4_CRYPTO_BLOCK_SIZE                 16
+
+/* Password derivation constants */
+#define EXT4_MAX_PASSPHRASE_SIZE               1024
+#define EXT4_MAX_SALT_SIZE                     256
+#define EXT4_PBKDF2_ITERATIONS                 0xFFFF
+
+#define EXT2_LABEL_LEN                         16
+
+/*
+ * Policy provided via an ioctl on the topmost directory. This
+ * structure is also in the kernel.
+ */
+struct ext4_encryption_policy {
+  char version;
+  char contents_encryption_mode;
+  char filenames_encryption_mode;
+  char flags;
+  char master_key_descriptor[EXT4_KEY_DESCRIPTOR_SIZE];
+} __attribute__((__packed__));
+
+struct ext4_encryption_key {
+        __u32 mode;
+        char raw[EXT4_MAX_KEY_SIZE];
+        __u32 size;
+} __attribute__((__packed__));
+
 /*
  * Structure of the super block
  */
@@ -613,7 +669,7 @@ struct ext2_super_block {
        __u32   s_feature_incompat;     /* incompatible feature set */
        __u32   s_feature_ro_compat;    /* readonly-compatible feature set */
        __u8    s_uuid[16];             /* 128-bit uuid for volume */
-       char    s_volume_name[16];      /* volume name */
+       char    s_volume_name[EXT2_LABEL_LEN];  /* volume name */
        char    s_last_mounted[64];     /* directory where last mounted */
        __u32   s_algorithm_usage_bitmap; /* For compression */
        /*
@@ -650,7 +706,8 @@ struct ext2_super_block {
        __u32   s_raid_stripe_width;    /* blocks on all data disks (N*stride)*/
        __u8    s_log_groups_per_flex;  /* FLEX_BG group size */
        __u8    s_checksum_type;        /* metadata checksum algorithm */
-       __u16   s_reserved_pad;         /* Padding to next 32bits */
+       __u8    s_encryption_level;     /* versioning level for encryption */
+       __u8    s_reserved_pad;         /* Padding to next 32bits */
        __u64   s_kbytes_written;       /* nr of lifetime kilobytes written */
        __u32   s_snapshot_inum;        /* Inode number of active snapshot */
        __u32   s_snapshot_id;          /* sequential ID of active snapshot */
@@ -675,7 +732,12 @@ struct ext2_super_block {
        __u32   s_grp_quota_inum;       /* inode number of group quota file */
        __u32   s_overhead_blocks;      /* overhead blocks/clusters in fs */
        __u32   s_backup_bgs[2];        /* If sparse_super2 enabled */
-       __u32   s_reserved[106];        /* Padding to the end of the block */
+       __u8    s_encrypt_algos[4];     /* Encryption algorithms in use  */
+       __u8    s_encrypt_pw_salt[16];  /* Salt used for string2key algorithm */
+       __le32  s_lpf_ino;              /* Location of the lost+found inode */
+       __le32  s_prj_quota_inum;       /* inode for tracking project quota */
+       __le32  s_checksum_seed;        /* crc32c(orig_uuid) if csum_seed set */
+       __le32  s_reserved[98];         /* Padding to the end of the block */
        __u32   s_checksum;             /* crc32c(superblock) */
 };
 
@@ -746,6 +808,9 @@ struct ext2_super_block {
  */
 #define EXT4_FEATURE_RO_COMPAT_METADATA_CSUM   0x0400
 #define EXT4_FEATURE_RO_COMPAT_REPLICA         0x0800
+#define EXT4_FEATURE_RO_COMPAT_READONLY                0x1000
+#define EXT4_FEATURE_RO_COMPAT_PROJECT         0x2000 /* Project quota */
+
 
 #define EXT2_FEATURE_INCOMPAT_COMPRESSION      0x0001
 #define EXT2_FEATURE_INCOMPAT_FILETYPE         0x0002
@@ -758,13 +823,107 @@ struct ext2_super_block {
 #define EXT4_FEATURE_INCOMPAT_FLEX_BG          0x0200
 #define EXT4_FEATURE_INCOMPAT_EA_INODE         0x0400
 #define EXT4_FEATURE_INCOMPAT_DIRDATA          0x1000
-/* 0x2000 was EXT4_FEATURE_INCOMPAT_BG_USE_META_CSUM but this was never used */
+#define EXT4_FEATURE_INCOMPAT_CSUM_SEED                0x2000
 #define EXT4_FEATURE_INCOMPAT_LARGEDIR         0x4000 /* >2GB or 3-lvl htree */
 #define EXT4_FEATURE_INCOMPAT_INLINE_DATA      0x8000 /* data in inode */
+#define EXT4_FEATURE_INCOMPAT_ENCRYPT          0x10000
+
+#define EXT4_FEATURE_COMPAT_FUNCS(name, ver, flagname) \
+static inline int ext2fs_has_feature_##name(struct ext2_super_block *sb) \
+{ \
+       return ((EXT2_SB(sb)->s_feature_compat & \
+                EXT##ver##_FEATURE_COMPAT_##flagname) != 0); \
+} \
+static inline void ext2fs_set_feature_##name(struct ext2_super_block *sb) \
+{ \
+       EXT2_SB(sb)->s_feature_compat |= \
+               EXT##ver##_FEATURE_COMPAT_##flagname; \
+} \
+static inline void ext2fs_clear_feature_##name(struct ext2_super_block *sb) \
+{ \
+       EXT2_SB(sb)->s_feature_compat &= \
+               ~EXT##ver##_FEATURE_COMPAT_##flagname; \
+}
+
+#define EXT4_FEATURE_RO_COMPAT_FUNCS(name, ver, flagname) \
+static inline int ext2fs_has_feature_##name(struct ext2_super_block *sb) \
+{ \
+       return ((EXT2_SB(sb)->s_feature_ro_compat & \
+                EXT##ver##_FEATURE_RO_COMPAT_##flagname) != 0); \
+} \
+static inline void ext2fs_set_feature_##name(struct ext2_super_block *sb) \
+{ \
+       EXT2_SB(sb)->s_feature_ro_compat |= \
+               EXT##ver##_FEATURE_RO_COMPAT_##flagname; \
+} \
+static inline void ext2fs_clear_feature_##name(struct ext2_super_block *sb) \
+{ \
+       EXT2_SB(sb)->s_feature_ro_compat &= \
+               ~EXT##ver##_FEATURE_RO_COMPAT_##flagname; \
+}
+
+#define EXT4_FEATURE_INCOMPAT_FUNCS(name, ver, flagname) \
+static inline int ext2fs_has_feature_##name(struct ext2_super_block *sb) \
+{ \
+       return ((EXT2_SB(sb)->s_feature_incompat & \
+                EXT##ver##_FEATURE_INCOMPAT_##flagname) != 0); \
+} \
+static inline void ext2fs_set_feature_##name(struct ext2_super_block *sb) \
+{ \
+       EXT2_SB(sb)->s_feature_incompat |= \
+               EXT##ver##_FEATURE_INCOMPAT_##flagname; \
+} \
+static inline void ext2fs_clear_feature_##name(struct ext2_super_block *sb) \
+{ \
+       EXT2_SB(sb)->s_feature_incompat &= \
+               ~EXT##ver##_FEATURE_INCOMPAT_##flagname; \
+}
+
+EXT4_FEATURE_COMPAT_FUNCS(dir_prealloc,                2, DIR_PREALLOC)
+EXT4_FEATURE_COMPAT_FUNCS(imagic_inodes,       2, IMAGIC_INODES)
+EXT4_FEATURE_COMPAT_FUNCS(journal,             3, HAS_JOURNAL)
+EXT4_FEATURE_COMPAT_FUNCS(xattr,               2, EXT_ATTR)
+EXT4_FEATURE_COMPAT_FUNCS(resize_inode,                2, RESIZE_INODE)
+EXT4_FEATURE_COMPAT_FUNCS(dir_index,           2, DIR_INDEX)
+EXT4_FEATURE_COMPAT_FUNCS(lazy_bg,             2, LAZY_BG)
+EXT4_FEATURE_COMPAT_FUNCS(exclude_bitmap,      2, EXCLUDE_BITMAP)
+EXT4_FEATURE_COMPAT_FUNCS(sparse_super2,       4, SPARSE_SUPER2)
+
+EXT4_FEATURE_RO_COMPAT_FUNCS(sparse_super,     2, SPARSE_SUPER)
+EXT4_FEATURE_RO_COMPAT_FUNCS(large_file,       2, LARGE_FILE)
+EXT4_FEATURE_RO_COMPAT_FUNCS(huge_file,                4, HUGE_FILE)
+EXT4_FEATURE_RO_COMPAT_FUNCS(gdt_csum,         4, GDT_CSUM)
+EXT4_FEATURE_RO_COMPAT_FUNCS(dir_nlink,                4, DIR_NLINK)
+EXT4_FEATURE_RO_COMPAT_FUNCS(extra_isize,      4, EXTRA_ISIZE)
+EXT4_FEATURE_RO_COMPAT_FUNCS(has_snapshot,     4, HAS_SNAPSHOT)
+EXT4_FEATURE_RO_COMPAT_FUNCS(quota,            4, QUOTA)
+EXT4_FEATURE_RO_COMPAT_FUNCS(bigalloc,         4, BIGALLOC)
+EXT4_FEATURE_RO_COMPAT_FUNCS(metadata_csum,    4, METADATA_CSUM)
+EXT4_FEATURE_RO_COMPAT_FUNCS(replica,          4, REPLICA)
+EXT4_FEATURE_RO_COMPAT_FUNCS(readonly,         4, READONLY)
+EXT4_FEATURE_RO_COMPAT_FUNCS(project,          4, PROJECT)
+
+EXT4_FEATURE_INCOMPAT_FUNCS(compression,       2, COMPRESSION)
+EXT4_FEATURE_INCOMPAT_FUNCS(filetype,          2, FILETYPE)
+EXT4_FEATURE_INCOMPAT_FUNCS(journal_needs_recovery,    3, RECOVER)
+EXT4_FEATURE_INCOMPAT_FUNCS(journal_dev,       3, JOURNAL_DEV)
+EXT4_FEATURE_INCOMPAT_FUNCS(meta_bg,           2, META_BG)
+EXT4_FEATURE_INCOMPAT_FUNCS(extents,           3, EXTENTS)
+EXT4_FEATURE_INCOMPAT_FUNCS(64bit,             4, 64BIT)
+EXT4_FEATURE_INCOMPAT_FUNCS(mmp,               4, MMP)
+EXT4_FEATURE_INCOMPAT_FUNCS(flex_bg,           4, FLEX_BG)
+EXT4_FEATURE_INCOMPAT_FUNCS(ea_inode,          4, EA_INODE)
+EXT4_FEATURE_INCOMPAT_FUNCS(dirdata,           4, DIRDATA)
+EXT4_FEATURE_INCOMPAT_FUNCS(csum_seed,         4, CSUM_SEED)
+EXT4_FEATURE_INCOMPAT_FUNCS(largedir,          4, LARGEDIR)
+EXT4_FEATURE_INCOMPAT_FUNCS(inline_data,       4, INLINE_DATA)
+EXT4_FEATURE_INCOMPAT_FUNCS(encrypt,           4, ENCRYPT)
 
 #define EXT2_FEATURE_COMPAT_SUPP       0
 #define EXT2_FEATURE_INCOMPAT_SUPP    (EXT2_FEATURE_INCOMPAT_FILETYPE| \
-                                      EXT4_FEATURE_INCOMPAT_MMP)
+                                      EXT4_FEATURE_INCOMPAT_MMP| \
+                                      EXT4_FEATURE_INCOMPAT_LARGEDIR| \
+                                      EXT4_FEATURE_INCOMPAT_EA_INODE)
 #define EXT2_FEATURE_RO_COMPAT_SUPP    (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
                                         EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
                                         EXT4_FEATURE_RO_COMPAT_DIR_NLINK| \
@@ -811,7 +970,7 @@ struct ext2_dir_entry {
  * bigger than 255 chars, it's safe to reclaim the extra byte for the
  * file_type field.
  *
- * This structure is deprecated due to endianity issues. Please use struct
+ * This structure is deprecated due to endian issues. Please use struct
  * ext2_dir_entry and accessor functions
  *   ext2fs_dirent_name_len
  *   ext2fs_dirent_set_name_len
@@ -866,11 +1025,21 @@ struct ext2_dir_entry_tail {
  *
  * NOTE: It must be a multiple of 4
  */
+#define EXT2_DIR_ENTRY_HEADER_LEN      8
 #define EXT2_DIR_PAD                   4
 #define EXT2_DIR_ROUND                 (EXT2_DIR_PAD - 1)
-#define EXT2_DIR_REC_LEN(name_len)     (((name_len) + 8 + EXT2_DIR_ROUND) & \
+#define EXT2_DIR_REC_LEN(name_len)     (((name_len) + \
+                                         EXT2_DIR_ENTRY_HEADER_LEN + \
+                                         EXT2_DIR_ROUND) & \
                                         ~EXT2_DIR_ROUND)
 
+/*
+ * Constants for ext4's extended time encoding
+ */
+#define EXT4_EPOCH_BITS 2
+#define EXT4_EPOCH_MASK ((1 << EXT4_EPOCH_BITS) - 1)
+#define EXT4_NSEC_MASK  (~0UL << EXT4_EPOCH_BITS)
+
 /*
  * This structure is used for multiple mount protection. It is written
  * into the block number saved in the s_mmp_block field in the superblock.
@@ -879,7 +1048,7 @@ struct ext2_dir_entry_tail {
  * regardless of how old the timestamp is.
  *
  * The timestamp in the MMP structure will be updated by e2fsck at some
- * arbitary intervals (start of passes, after every few groups of inodes
+ * arbitrary intervals (start of passes, after every few groups of inodes
  * in pass1 and pass1b).  There is no guarantee that e2fsck is updating
  * the MMP block in a timely manner, and the updates it does are purely
  * for the convenience of the sysadmin and not for automatic validation.
@@ -894,6 +1063,7 @@ struct ext2_dir_entry_tail {
 #define EXT4_MMP_SEQ_FSCK  0xE24D4D50U /* mmp_seq value when being fscked */
 #define EXT4_MMP_SEQ_MAX   0xE24D4D4FU /* maximum valid mmp_seq value */
 
+/* Not endian-annotated; it's swapped at read/write time */
 struct mmp_struct {
        __u32   mmp_magic;              /* Magic number for MMP */
        __u32   mmp_seq;                /* Sequence no. updated periodically */