| /* SPDX-License-Identifier: GPL-2.0 */ | |
| #ifndef _BCACHEFS_INODE_FORMAT_H | |
| #define _BCACHEFS_INODE_FORMAT_H | |
| #define BLOCKDEV_INODE_MAX 4096 | |
| #define BCACHEFS_ROOT_INO 4096 | |
| struct bch_inode { | |
| struct bch_val v; | |
| __le64 bi_hash_seed; | |
| __le32 bi_flags; | |
| __le16 bi_mode; | |
| __u8 fields[]; | |
| } __packed __aligned(8); | |
| struct bch_inode_v2 { | |
| struct bch_val v; | |
| __le64 bi_journal_seq; | |
| __le64 bi_hash_seed; | |
| __le64 bi_flags; | |
| __le16 bi_mode; | |
| __u8 fields[]; | |
| } __packed __aligned(8); | |
| struct bch_inode_v3 { | |
| struct bch_val v; | |
| __le64 bi_journal_seq; | |
| __le64 bi_hash_seed; | |
| __le64 bi_flags; | |
| __le64 bi_sectors; | |
| __le64 bi_size; | |
| __le64 bi_version; | |
| __u8 fields[]; | |
| } __packed __aligned(8); | |
| #define INODEv3_FIELDS_START_INITIAL 6 | |
| #define INODEv3_FIELDS_START_CUR (offsetof(struct bch_inode_v3, fields) / sizeof(__u64)) | |
| struct bch_inode_generation { | |
| struct bch_val v; | |
| __le32 bi_generation; | |
| __le32 pad; | |
| } __packed __aligned(8); | |
| /* | |
| * bi_subvol and bi_parent_subvol are only set for subvolume roots: | |
| */ | |
| #define BCH_INODE_FIELDS_v2() \ | |
| x(bi_atime, 96) \ | |
| x(bi_ctime, 96) \ | |
| x(bi_mtime, 96) \ | |
| x(bi_otime, 96) \ | |
| x(bi_size, 64) \ | |
| x(bi_sectors, 64) \ | |
| x(bi_uid, 32) \ | |
| x(bi_gid, 32) \ | |
| x(bi_nlink, 32) \ | |
| x(bi_generation, 32) \ | |
| x(bi_dev, 32) \ | |
| x(bi_data_checksum, 8) \ | |
| x(bi_compression, 8) \ | |
| x(bi_project, 32) \ | |
| x(bi_background_compression, 8) \ | |
| x(bi_data_replicas, 8) \ | |
| x(bi_promote_target, 16) \ | |
| x(bi_foreground_target, 16) \ | |
| x(bi_background_target, 16) \ | |
| x(bi_erasure_code, 16) \ | |
| x(bi_fields_set, 16) \ | |
| x(bi_dir, 64) \ | |
| x(bi_dir_offset, 64) \ | |
| x(bi_subvol, 32) \ | |
| x(bi_parent_subvol, 32) | |
| #define BCH_INODE_FIELDS_v3() \ | |
| x(bi_atime, 96) \ | |
| x(bi_ctime, 96) \ | |
| x(bi_mtime, 96) \ | |
| x(bi_otime, 96) \ | |
| x(bi_uid, 32) \ | |
| x(bi_gid, 32) \ | |
| x(bi_nlink, 32) \ | |
| x(bi_generation, 32) \ | |
| x(bi_dev, 32) \ | |
| x(bi_data_checksum, 8) \ | |
| x(bi_compression, 8) \ | |
| x(bi_project, 32) \ | |
| x(bi_background_compression, 8) \ | |
| x(bi_data_replicas, 8) \ | |
| x(bi_promote_target, 16) \ | |
| x(bi_foreground_target, 16) \ | |
| x(bi_background_target, 16) \ | |
| x(bi_erasure_code, 16) \ | |
| x(bi_fields_set, 16) \ | |
| x(bi_dir, 64) \ | |
| x(bi_dir_offset, 64) \ | |
| x(bi_subvol, 32) \ | |
| x(bi_parent_subvol, 32) \ | |
| x(bi_nocow, 8) \ | |
| x(bi_depth, 32) \ | |
| x(bi_inodes_32bit, 8) \ | |
| x(bi_casefold, 8) | |
| /* subset of BCH_INODE_FIELDS */ | |
| #define BCH_INODE_OPTS() \ | |
| x(data_checksum, 8) \ | |
| x(compression, 8) \ | |
| x(project, 32) \ | |
| x(background_compression, 8) \ | |
| x(data_replicas, 8) \ | |
| x(promote_target, 16) \ | |
| x(foreground_target, 16) \ | |
| x(background_target, 16) \ | |
| x(erasure_code, 16) \ | |
| x(nocow, 8) \ | |
| x(inodes_32bit, 8) \ | |
| x(casefold, 8) | |
| enum inode_opt_id { | |
| #define x(name, ...) \ | |
| Inode_opt_##name, | |
| BCH_INODE_OPTS() | |
| #undef x | |
| Inode_opt_nr, | |
| }; | |
| /* | |
| * BCH_INODE_has_case_insensitive is set if any descendent is case insensitive - | |
| * for overlayfs | |
| */ | |
| #define BCH_INODE_FLAGS() \ | |
| x(sync, 0) \ | |
| x(immutable, 1) \ | |
| x(append, 2) \ | |
| x(nodump, 3) \ | |
| x(noatime, 4) \ | |
| x(i_size_dirty, 5) \ | |
| x(i_sectors_dirty, 6) \ | |
| x(unlinked, 7) \ | |
| x(backptr_untrusted, 8) \ | |
| x(has_child_snapshot, 9) \ | |
| x(has_case_insensitive, 10) | |
| /* bits 20+ reserved for packed fields below: */ | |
| enum bch_inode_flags { | |
| #define x(t, n) BCH_INODE_##t = 1U << n, | |
| BCH_INODE_FLAGS() | |
| #undef x | |
| }; | |
| enum __bch_inode_flags { | |
| #define x(t, n) __BCH_INODE_##t = n, | |
| BCH_INODE_FLAGS() | |
| #undef x | |
| }; | |
| LE32_BITMASK(INODEv1_STR_HASH, struct bch_inode, bi_flags, 20, 24); | |
| LE32_BITMASK(INODEv1_NR_FIELDS, struct bch_inode, bi_flags, 24, 31); | |
| LE32_BITMASK(INODEv1_NEW_VARINT,struct bch_inode, bi_flags, 31, 32); | |
| LE64_BITMASK(INODEv2_STR_HASH, struct bch_inode_v2, bi_flags, 20, 24); | |
| LE64_BITMASK(INODEv2_NR_FIELDS, struct bch_inode_v2, bi_flags, 24, 31); | |
| LE64_BITMASK(INODEv3_STR_HASH, struct bch_inode_v3, bi_flags, 20, 24); | |
| LE64_BITMASK(INODEv3_NR_FIELDS, struct bch_inode_v3, bi_flags, 24, 31); | |
| LE64_BITMASK(INODEv3_FIELDS_START, | |
| struct bch_inode_v3, bi_flags, 31, 36); | |
| LE64_BITMASK(INODEv3_MODE, struct bch_inode_v3, bi_flags, 36, 52); | |
| struct bch_inode_alloc_cursor { | |
| struct bch_val v; | |
| __u8 bits; | |
| __u8 pad; | |
| __le32 gen; | |
| __le64 idx; | |
| }; | |
| #endif /* _BCACHEFS_INODE_FORMAT_H */ |