This is a device mapper block compression driver. Note: - Sectors are always 512 bytes (kernel constant). - Physical blocks are always 4kb (internal constant). - Logical blocks are variable 4kb .. 1gb. - All integers are little endian. Block device layout: - byte[4096] header - byte[4] magic - u16 version_major - u16 version_minor - u64 nr_physical_sectors - u64 nr_logical_sectors [3 * physical_sectors] - u16 physical_blocks_per_logical_block_shift (0 .. 18) [4 = 64kb] (logical blocks may not exceed 1gb due to LZ4) - byte[] reserved - byte[] zone ... vector of zone Number of logical blocks per zone: nr_lblk = 1 << header.logical_blocks_per_group_shift Device size limits: - Min: header plus one zone (header, phys_alloc, log_alloc, data) Arbitrarily limit to 1mb (?) - 2^48 = 256t physical blocks = 1eb There are six different lblk_alloc sizes: Struct name Size lblk_size device_pblk_size =========== ==== ========= ================ lblk_alloc_16_16 2+2*8 <= 64kb <= 64k lblk_alloc_16_32 2+4*8 <= 64kb <= 4g lblk_alloc_16_48 2+6*8 <= 64kb <= 256t lblk_alloc_32_16 4+2*8 > 64kb <= 64k lblk_alloc_32_32 4+4*8 > 64kb <= 4g lblk_alloc_32_48 4+6*8 > 64kb <= 256t Zone layout: - byte[4k] Physical block alloc bitmap - lblk_alloc_x_y[] Logical block allocation - data[4k*4k*8] Data Data size (physical): 4kb*(4k*8) = 128mb Data size (logical) : 128mb*3 = 384mb Assume <=4g physical blocks, 64kb logical blocks, 3x compression: - Zone holds 3*128mb = 384mb logical data - 384mb/64kb = 6k logical blocks - 6k * (34b) = 204kb logical block alloc data - 204kb / 4kb = 51 physical blocks for logical block alloc data - Overhead: (1+51)/32k = 0.016%