Commit 468dfca3 authored by Mikulas Patocka's avatar Mikulas Patocka Committed by Mike Snitzer

dm integrity: add a bitmap mode

Introduce an alternate mode of operation where dm-integrity uses a
bitmap instead of a journal. If a bit in the bitmap is 1, the
corresponding region's data and integrity tags are not synchronized - if
the machine crashes, the unsynchronized regions will be recalculated.
The bitmap mode is faster than the journal mode, because we don't have
to write the data twice, but it is also less reliable, because if data
corruption happens when the machine crashes, it may not be detected.

Benchmark results for an SSD connected to a SATA300 port, when doing
large linear writes with dd:

buffered I/O:
        raw device throughput - 245MB/s
        dm-integrity with journaling - 120MB/s
        dm-integrity with bitmap - 238MB/s

direct I/O with 1MB block size:
        raw device throughput - 248MB/s
        dm-integrity with journaling - 123MB/s
        dm-integrity with bitmap - 223MB/s

For more info see dm-integrity in Documentation/device-mapper/
Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 8b3bbd49
...@@ -21,6 +21,13 @@ mode it calculates and verifies the integrity tag internally. In this ...@@ -21,6 +21,13 @@ mode it calculates and verifies the integrity tag internally. In this
mode, the dm-integrity target can be used to detect silent data mode, the dm-integrity target can be used to detect silent data
corruption on the disk or in the I/O path. corruption on the disk or in the I/O path.
There's an alternate mode of operation where dm-integrity uses bitmap
instead of a journal. If a bit in the bitmap is 1, the corresponding
region's data and integrity tags are not synchronized - if the machine
crashes, the unsynchronized regions will be recalculated. The bitmap mode
is faster than the journal mode, because we don't have to write the data
twice, but it is also less reliable, because if data corruption happens
when the machine crashes, it may not be detected.
When loading the target for the first time, the kernel driver will format When loading the target for the first time, the kernel driver will format
the device. But it will only format the device if the superblock contains the device. But it will only format the device if the superblock contains
...@@ -59,6 +66,10 @@ Target arguments: ...@@ -59,6 +66,10 @@ Target arguments:
either both data and tag or none of them are written. The either both data and tag or none of them are written. The
journaled mode degrades write throughput twice because the journaled mode degrades write throughput twice because the
data have to be written twice. data have to be written twice.
B - bitmap mode - data and metadata are written without any
synchronization, the driver maintains a bitmap of dirty
regions where data and metadata don't match. This mode can
only be used with internal hash.
R - recovery mode - in this mode, journal is not replayed, R - recovery mode - in this mode, journal is not replayed,
checksums are not checked and writes to the device are not checksums are not checked and writes to the device are not
allowed. This mode is useful for data recovery if the allowed. This mode is useful for data recovery if the
...@@ -150,6 +161,15 @@ block_size:number ...@@ -150,6 +161,15 @@ block_size:number
Supported values are 512, 1024, 2048 and 4096 bytes. If not Supported values are 512, 1024, 2048 and 4096 bytes. If not
specified the default block size is 512 bytes. specified the default block size is 512 bytes.
sectors_per_bit:number
In the bitmap mode, this parameter specifies the number of
512-byte sectors that corresponds to one bitmap bit.
bitmap_flush_interval:number
The bitmap flush interval in milliseconds. The metadata buffers
are synchronized when this interval expires.
The journal mode (D/J), buffer_sectors, journal_watermark, commit_time can The journal mode (D/J), buffer_sectors, journal_watermark, commit_time can
be changed when reloading the target (load an inactive table and swap the be changed when reloading the target (load an inactive table and swap the
tables with suspend and resume). The other arguments should not be changed tables with suspend and resume). The other arguments should not be changed
...@@ -174,6 +194,8 @@ The layout of the formatted block device: ...@@ -174,6 +194,8 @@ The layout of the formatted block device:
* flags * flags
SB_FLAG_HAVE_JOURNAL_MAC - a flag is set if journal_mac is used SB_FLAG_HAVE_JOURNAL_MAC - a flag is set if journal_mac is used
SB_FLAG_RECALCULATING - recalculating is in progress SB_FLAG_RECALCULATING - recalculating is in progress
SB_FLAG_DIRTY_BITMAP - journal area contains the bitmap of dirty
blocks
* log2(sectors per block) * log2(sectors per block)
* a position where recalculating finished * a position where recalculating finished
* journal * journal
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment