use crate::{
DevItem, RootBackup,
constants::{CSUM_SIZE, FSID_SIZE, LABEL_SIZE, MAX_SYSTEM_CHUNK_ARRAY_SIZE, NUM_BACKUP_ROOTS},
};
use num_enum::{IntoPrimitive, TryFromPrimitive};
use static_assertions::const_assert_eq;
use strum::EnumIter;
use zerocopy::little_endian::{U32 as U32LE, U64 as U64LE};
use zerocopy_derive::*;
#[derive(Copy, Clone, IntoBytes, TryFromBytes, Unaligned, KnownLayout)]
#[repr(C, packed)]
pub struct SuperBlock {
pub csum: [u8; CSUM_SIZE],
pub fsid: [u8; FSID_SIZE],
pub bytenr: U64LE,
pub flags: U64LE,
pub magic: U64LE,
pub generation: U64LE,
pub root: U64LE,
pub chunk_root: U64LE,
pub log_root: U64LE,
pub log_root_transid: U64LE,
pub total_bytes: U64LE,
pub bytes_used: U64LE,
pub root_dir_objectid: U64LE,
pub num_devices: U64LE,
pub sectorsize: U32LE,
pub nodesize: U32LE,
pub leafsize: U32LE,
pub stripesize: U32LE,
pub sys_chunk_array_size: U32LE,
pub chunk_root_generation: U64LE,
pub compat_flags: U64LE,
pub compat_ro_flags: U64LE,
pub incompat_flags: U64LE,
pub csum_type: ChecksumType,
pub root_level: u8,
pub chunk_root_level: u8,
pub log_root_level: u8,
pub dev_item: DevItem,
pub label: [u8; LABEL_SIZE],
pub cache_generation: U64LE,
pub uuid_tree_generation: U64LE,
pub _reserved: [U64LE; 30],
pub sys_chunk_array: [u8; MAX_SYSTEM_CHUNK_ARRAY_SIZE],
pub super_roots: [RootBackup; NUM_BACKUP_ROOTS],
pub _unused1: [u8; 565],
}
const_assert_eq!(core::mem::size_of::<SuperBlock>(), 4096);
#[derive(
Copy,
Clone,
Debug,
Hash,
PartialEq,
EnumIter,
IntoPrimitive,
TryFromPrimitive,
TryFromBytes,
IntoBytes,
KnownLayout,
)]
#[repr(u16)]
pub enum ChecksumType {
CRC32C = 0u16.to_le(),
XXHASH64 = 1u16.to_le(),
SHA256 = 2u16.to_le(),
BLAKE2b = 3u16.to_le(),
}
const_assert_eq!(core::mem::size_of::<ChecksumType>(), 2);