54 lines
2.0 KiB
Plaintext
54 lines
2.0 KiB
Plaintext
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%
|