Go to file
Tom Marshall 94551dffdd Simplify object error logic
Write error always sets error on all written pages and we always write
the first page.  So only check the first page.
2019-11-04 11:36:20 -08:00
cbd Add flags to header 2019-11-04 11:36:12 -08:00
dm-compress Simplify object error logic 2019-11-04 11:36:20 -08:00
include Add flags to header 2019-11-04 11:36:12 -08:00
libcbd Add flags to header 2019-11-04 11:36:12 -08:00
.gitignore Add a .gitignore 2019-10-09 11:35:16 -07:00
Makefile Add kmod headers to kmod deps 2019-10-25 09:55:35 -07:00
README Initial working version 2019-10-09 11:04:40 -07:00
TODO Reset objects outside cache lock 2019-11-04 11:36:20 -08:00

README

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%