use bitflags::bitflags;
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct IncompatFlags: u64 {
const MIXED_BACKREF = 1 << 0;
const DEFAULT_SUBVOL = 1 << 1;
const MIXED_GROUPS = 1 << 2;
const COMPRESS_LZO = 1 << 3;
const COMPRESS_ZSTD = 1 << 4;
const BIG_METADATA = 1 << 5;
const EXTENDED_IREF = 1 << 6;
const RAID56 = 1 << 7;
const SKINNY_METADATA = 1 << 8;
const NO_HOLES = 1 << 9;
const METADATA_UUID = 1 << 10;
const RAID1C34 = 1 << 11;
const ZONED = 1 << 12;
const EXTENT_TREE_V2 = 1 << 13;
const RAID_STRIPE_TREE = 1 << 14;
const SIMPLE_QUOTA = 1 << 16;
}
}
impl IncompatFlags {
pub(crate) const fn rejected_for_v0_1() -> Self {
Self::ZONED.union(Self::RAID_STRIPE_TREE)
}
}
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CompatFlags: u64 {
const _RESERVED = 0;
}
}
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CompatRoFlags: u64 {
const FREE_SPACE_TREE = 1 << 0;
const FREE_SPACE_TREE_VALID = 1 << 1;
const VERITY = 1 << 2;
const BLOCK_GROUP_TREE = 1 << 3;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn rejected_v0_1_covers_zoned_and_raid_stripe_tree() {
let r = IncompatFlags::rejected_for_v0_1();
assert!(r.contains(IncompatFlags::ZONED));
assert!(r.contains(IncompatFlags::RAID_STRIPE_TREE));
assert!(!r.contains(IncompatFlags::COMPRESS_ZSTD));
assert!(!r.contains(IncompatFlags::SKINNY_METADATA));
}
#[test]
fn unknown_bit_is_unknown() {
let raw: u64 = 1 << 30;
let parsed = IncompatFlags::from_bits_truncate(raw);
assert!(parsed.is_empty(), "bit 30 is not yet defined");
}
}