From 08f87f769b595151be1afeff53e144f543faa614 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Wed, 06 Dec 2023 09:51:13 +0000 Subject: [PATCH] add dts config --- kernel/fs/incfs/format.h | 146 +++++++++++++++++++++++++++++++++--------------- 1 files changed, 101 insertions(+), 45 deletions(-) diff --git a/kernel/fs/incfs/format.h b/kernel/fs/incfs/format.h index a6d3aef..14e475b 100644 --- a/kernel/fs/incfs/format.h +++ b/kernel/fs/incfs/format.h @@ -72,7 +72,7 @@ * * * +-------------------------------------------+ - * | incfs_super_block |]---+ + * | incfs_file_header |]---+ * +-------------------------------------------+ | * | metadata |<---+ * | incfs_file_signature |]---+ @@ -118,11 +118,13 @@ INCFS_MD_NONE = 0, INCFS_MD_BLOCK_MAP = 1, INCFS_MD_FILE_ATTR = 2, - INCFS_MD_SIGNATURE = 3 + INCFS_MD_SIGNATURE = 3, + INCFS_MD_STATUS = 4, + INCFS_MD_VERITY_SIGNATURE = 5, }; enum incfs_file_header_flags { - INCFS_FILE_COMPLETE = 1 << 0, + INCFS_FILE_MAPPED = 1 << 1, }; /* Header included at the beginning of all metadata records on the disk. */ @@ -136,16 +138,16 @@ __le16 h_record_size; /* - * CRC32 of the metadata record. + * Was: CRC32 of the metadata record. * (e.g. inode, dir entry etc) not just this struct. */ - __le32 h_record_crc; + __le32 h_unused1; /* Offset of the next metadata entry if any */ __le64 h_next_md_offset; - /* Offset of the previous metadata entry if any */ - __le64 h_prev_md_offset; + /* Was: Offset of the previous metadata entry if any */ + __le64 h_unused2; } __packed; @@ -164,25 +166,41 @@ __le16 fh_data_block_size; /* File flags, from incfs_file_header_flags */ - __le32 fh_file_header_flags; + __le32 fh_flags; - /* Offset of the first metadata record */ - __le64 fh_first_md_offset; + union { + /* Standard incfs file */ + struct { + /* Offset of the first metadata record */ + __le64 fh_first_md_offset; - /* - * Put file specific information after this point - */ + /* Full size of the file's content */ + __le64 fh_file_size; - /* Full size of the file's content */ - __le64 fh_file_size; + /* File uuid */ + incfs_uuid_t fh_uuid; + }; - /* File uuid */ - incfs_uuid_t fh_uuid; + /* Mapped file - INCFS_FILE_MAPPED set in fh_flags */ + struct { + /* Offset in original file */ + __le64 fh_original_offset; + + /* Full size of the file's content */ + __le64 fh_mapped_file_size; + + /* Original file's uuid */ + incfs_uuid_t fh_original_uuid; + }; + }; } __packed; enum incfs_block_map_entry_flags { - INCFS_BLOCK_COMPRESSED_LZ4 = (1 << 0), - INCFS_BLOCK_HASH = (1 << 1), + INCFS_BLOCK_COMPRESSED_LZ4 = 1, + INCFS_BLOCK_COMPRESSED_ZSTD = 2, + + /* Reserve 3 bits for compression alg */ + INCFS_BLOCK_COMPRESSED_MASK = 7, }; /* Block map entry pointing to an actual location of the data block. */ @@ -211,18 +229,18 @@ __le32 m_block_count; } __packed; -/* Metadata record for file attribute. Type = INCFS_MD_FILE_ATTR */ -struct incfs_file_attr { - struct incfs_md_header fa_header; - - __le64 fa_offset; - - __le16 fa_size; - - __le32 fa_crc; -} __packed; - -/* Metadata record for file signature. Type = INCFS_MD_SIGNATURE */ +/* + * Metadata record for file signature. Type = INCFS_MD_SIGNATURE + * + * The signature stored here is the APK V4 signature data blob. See the + * definition of incfs_new_file_args::signature_info for an explanation of this + * blob. Specifically, it contains the root hash, but it does *not* contain + * anything that the kernel treats as a signature. + * + * When FS_IOC_ENABLE_VERITY is called on a file without this record, an APK V4 + * signature blob and a hash tree are added to the file, and then this metadata + * record is created to record their locations. + */ struct incfs_file_signature { struct incfs_md_header sg_header; @@ -241,6 +259,39 @@ u64 sig_offset; u32 hash_size; u64 hash_offset; +}; + +struct incfs_status { + struct incfs_md_header is_header; + + __le32 is_data_blocks_written; /* Number of data blocks written */ + + __le32 is_hash_blocks_written; /* Number of hash blocks written */ + + __le32 is_dummy[6]; /* Spare fields */ +} __packed; + +/* + * Metadata record for verity signature. Type = INCFS_MD_VERITY_SIGNATURE + * + * This record will only exist for verity-enabled files with signatures. Verity + * enabled files without signatures do not have this record. This signature is + * checked by fs-verity identically to any other fs-verity signature. + */ +struct incfs_file_verity_signature { + struct incfs_md_header vs_header; + + /* The size of the signature */ + __le32 vs_size; + + /* Signature's offset in the backing file */ + __le64 vs_offset; +} __packed; + +/* In memory version of above */ +struct incfs_df_verity_signature { + u32 size; + u64 offset; }; /* State of the backing file. */ @@ -273,21 +324,22 @@ union { struct incfs_md_header md_header; struct incfs_blockmap blockmap; - struct incfs_file_attr file_attr; struct incfs_file_signature signature; + struct incfs_status status; + struct incfs_file_verity_signature verity_signature; } md_buffer; int (*handle_blockmap)(struct incfs_blockmap *bm, struct metadata_handler *handler); - int (*handle_file_attr)(struct incfs_file_attr *fa, - struct metadata_handler *handler); int (*handle_signature)(struct incfs_file_signature *sig, struct metadata_handler *handler); + int (*handle_status)(struct incfs_status *sig, + struct metadata_handler *handler); + int (*handle_verity_signature)(struct incfs_file_verity_signature *s, + struct metadata_handler *handler); }; #define INCFS_MAX_METADATA_RECORD_SIZE \ - FIELD_SIZEOF(struct metadata_handler, md_buffer) - -loff_t incfs_get_end_offset(struct file *f); + sizeof_field(struct metadata_handler, md_buffer) /* Backing file context management */ struct mount_info; @@ -303,6 +355,9 @@ int incfs_write_fh_to_backing_file(struct backing_file_context *bfc, incfs_uuid_t *uuid, u64 file_size); +int incfs_write_mapping_fh_to_backing_file(struct backing_file_context *bfc, + incfs_uuid_t *uuid, u64 file_size, u64 offset); + int incfs_write_data_block_to_backing_file(struct backing_file_context *bfc, struct mem_range block, int block_index, loff_t bm_base_off, @@ -315,16 +370,17 @@ loff_t bm_base_off, loff_t file_size); -int incfs_write_file_attr_to_backing_file(struct backing_file_context *bfc, - struct mem_range value, struct incfs_file_attr *attr); - int incfs_write_signature_to_backing_file(struct backing_file_context *bfc, - struct mem_range sig, u32 tree_size); + struct mem_range sig, u32 tree_size, + loff_t *tree_offset, loff_t *sig_offset); -int incfs_write_file_header_flags(struct backing_file_context *bfc, u32 flags); - -int incfs_make_empty_backing_file(struct backing_file_context *bfc, - incfs_uuid_t *uuid, u64 file_size); +int incfs_write_status_to_backing_file(struct backing_file_context *bfc, + loff_t status_offset, + u32 data_blocks_written, + u32 hash_blocks_written); +int incfs_write_verity_signature_to_backing_file( + struct backing_file_context *bfc, struct mem_range signature, + loff_t *offset); /* Reading stuff */ int incfs_read_file_header(struct backing_file_context *bfc, -- Gitblit v1.6.2