An introduction to the device mapper
====================================

The goal of this driver is to support volume management.  
The driver enables the definition of new block devices composed of
ranges of sectors of existing devices.  This can be used to define
disk partitions - or logical volumes.  This light-weight kernel
component can support user-space tools for logical volume management.

The driver maps ranges of sectors for the new logical device onto
'mapping targets' according to a mapping table.  Currently the mapping 
table must be supplied to the driver through an ioctl interface.
Earlier versions of the driver also had a custom file system interface 
(dmfs), but we stopped work on this because of pressure of time.

The mapping table consists of an ordered list of rules of the form:
  <start> <length> <target> [<target args> ...]
which map <length> sectors beginning at <start> to a target.

Every sector on the new device must be specified - there must be no
gaps between the rules.  The first rule has <start> = 0. 
Each subsequent rule starts from the previous <start> + <length> + 1.

When a sector of the new logical device is accessed, the make_request
function looks up the correct target and then passes the request on to
the target to perform the remapping according to its arguments.

The following targets are available:
  linear
  striped
  error
  snapshot
  mirror

The 'linear' target takes as arguments a target device name (eg
/dev/hda6) and a start sector and maps the range of sectors linearly
to the target.

The 'striped' target is designed to handle striping across physical
volumes.  It takes as arguments the number of stripes and the striping
chunk size followed by a list of pairs of device name and sector.

The 'error' target causes any I/O to the mapped sectors to fail.  This
is useful for defining gaps in the new logical device.

The 'snapshot' target supports asynchronous snapshots.
See http://people.sistina.com/~thornber/snap_performance.html.

The 'mirror' target is used to implement pvmove.

In normal scenarios the mapping tables will remain small.
A btree structure is used to hold the sector range -> target mapping.
Since we know all the entries in the btree in advance we can make a
very compact tree, omitting pointers to child nodes as child node
locations can be calculated.

Benchmarking with bonnie++ suggests that this is certainly no slower
than current LVM.


Sistina UK
Updated 30/04/2003

