mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
dm: add era target
dm-era is a target that behaves similar to the linear target. In addition it keeps track of which blocks were written within a user defined period of time called an 'era'. Each era target instance maintains the current era as a monotonically increasing 32-bit counter. Use cases include tracking changed blocks for backup software, and partially invalidating the contents of a cache to restore cache coherency after rolling back a vendor snapshot. dm-era is primarily expected to be paired with the dm-cache target. Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
parent
b098d6726b
commit
eec40579d8
108
Documentation/device-mapper/era.txt
Normal file
108
Documentation/device-mapper/era.txt
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
Introduction
|
||||||
|
============
|
||||||
|
|
||||||
|
dm-era is a target that behaves similar to the linear target. In
|
||||||
|
addition it keeps track of which blocks were written within a user
|
||||||
|
defined period of time called an 'era'. Each era target instance
|
||||||
|
maintains the current era as a monotonically increasing 32-bit
|
||||||
|
counter.
|
||||||
|
|
||||||
|
Use cases include tracking changed blocks for backup software, and
|
||||||
|
partially invalidating the contents of a cache to restore cache
|
||||||
|
coherency after rolling back a vendor snapshot.
|
||||||
|
|
||||||
|
Constructor
|
||||||
|
===========
|
||||||
|
|
||||||
|
era <metadata dev> <origin dev> <block size>
|
||||||
|
|
||||||
|
metadata dev : fast device holding the persistent metadata
|
||||||
|
origin dev : device holding data blocks that may change
|
||||||
|
block size : block size of origin data device, granularity that is
|
||||||
|
tracked by the target
|
||||||
|
|
||||||
|
Messages
|
||||||
|
========
|
||||||
|
|
||||||
|
None of the dm messages take any arguments.
|
||||||
|
|
||||||
|
checkpoint
|
||||||
|
----------
|
||||||
|
|
||||||
|
Possibly move to a new era. You shouldn't assume the era has
|
||||||
|
incremented. After sending this message, you should check the
|
||||||
|
current era via the status line.
|
||||||
|
|
||||||
|
take_metadata_snap
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Create a clone of the metadata, to allow a userland process to read it.
|
||||||
|
|
||||||
|
drop_metadata_snap
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Drop the metadata snapshot.
|
||||||
|
|
||||||
|
Status
|
||||||
|
======
|
||||||
|
|
||||||
|
<metadata block size> <#used metadata blocks>/<#total metadata blocks>
|
||||||
|
<current era> <held metadata root | '-'>
|
||||||
|
|
||||||
|
metadata block size : Fixed block size for each metadata block in
|
||||||
|
sectors
|
||||||
|
#used metadata blocks : Number of metadata blocks used
|
||||||
|
#total metadata blocks : Total number of metadata blocks
|
||||||
|
current era : The current era
|
||||||
|
held metadata root : The location, in blocks, of the metadata root
|
||||||
|
that has been 'held' for userspace read
|
||||||
|
access. '-' indicates there is no held root
|
||||||
|
|
||||||
|
Detailed use case
|
||||||
|
=================
|
||||||
|
|
||||||
|
The scenario of invalidating a cache when rolling back a vendor
|
||||||
|
snapshot was the primary use case when developing this target:
|
||||||
|
|
||||||
|
Taking a vendor snapshot
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
- Send a checkpoint message to the era target
|
||||||
|
- Make a note of the current era in its status line
|
||||||
|
- Take vendor snapshot (the era and snapshot should be forever
|
||||||
|
associated now).
|
||||||
|
|
||||||
|
Rolling back to an vendor snapshot
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
- Cache enters passthrough mode (see: dm-cache's docs in cache.txt)
|
||||||
|
- Rollback vendor storage
|
||||||
|
- Take metadata snapshot
|
||||||
|
- Ascertain which blocks have been written since the snapshot was taken
|
||||||
|
by checking each block's era
|
||||||
|
- Invalidate those blocks in the caching software
|
||||||
|
- Cache returns to writeback/writethrough mode
|
||||||
|
|
||||||
|
Memory usage
|
||||||
|
============
|
||||||
|
|
||||||
|
The target uses a bitset to record writes in the current era. It also
|
||||||
|
has a spare bitset ready for switching over to a new era. Other than
|
||||||
|
that it uses a few 4k blocks for updating metadata.
|
||||||
|
|
||||||
|
(4 * nr_blocks) bytes + buffers
|
||||||
|
|
||||||
|
Resilience
|
||||||
|
==========
|
||||||
|
|
||||||
|
Metadata is updated on disk before a write to a previously unwritten
|
||||||
|
block is performed. As such dm-era should not be effected by a hard
|
||||||
|
crash such as power failure.
|
||||||
|
|
||||||
|
Userland tools
|
||||||
|
==============
|
||||||
|
|
||||||
|
Userland tools are found in the increasingly poorly named
|
||||||
|
thin-provisioning-tools project:
|
||||||
|
|
||||||
|
https://github.com/jthornber/thin-provisioning-tools
|
@ -285,6 +285,17 @@ config DM_CACHE_CLEANER
|
|||||||
A simple cache policy that writes back all data to the
|
A simple cache policy that writes back all data to the
|
||||||
origin. Used when decommissioning a dm-cache.
|
origin. Used when decommissioning a dm-cache.
|
||||||
|
|
||||||
|
config DM_ERA
|
||||||
|
tristate "Era target (EXPERIMENTAL)"
|
||||||
|
depends on BLK_DEV_DM
|
||||||
|
default n
|
||||||
|
select DM_PERSISTENT_DATA
|
||||||
|
select DM_BIO_PRISON
|
||||||
|
---help---
|
||||||
|
dm-era tracks which parts of a block device are written to
|
||||||
|
over time. Useful for maintaining cache coherency when using
|
||||||
|
vendor snapshots.
|
||||||
|
|
||||||
config DM_MIRROR
|
config DM_MIRROR
|
||||||
tristate "Mirror target"
|
tristate "Mirror target"
|
||||||
depends on BLK_DEV_DM
|
depends on BLK_DEV_DM
|
||||||
|
@ -14,6 +14,7 @@ dm-thin-pool-y += dm-thin.o dm-thin-metadata.o
|
|||||||
dm-cache-y += dm-cache-target.o dm-cache-metadata.o dm-cache-policy.o
|
dm-cache-y += dm-cache-target.o dm-cache-metadata.o dm-cache-policy.o
|
||||||
dm-cache-mq-y += dm-cache-policy-mq.o
|
dm-cache-mq-y += dm-cache-policy-mq.o
|
||||||
dm-cache-cleaner-y += dm-cache-policy-cleaner.o
|
dm-cache-cleaner-y += dm-cache-policy-cleaner.o
|
||||||
|
dm-era-y += dm-era-target.o
|
||||||
md-mod-y += md.o bitmap.o
|
md-mod-y += md.o bitmap.o
|
||||||
raid456-y += raid5.o
|
raid456-y += raid5.o
|
||||||
|
|
||||||
@ -53,6 +54,7 @@ obj-$(CONFIG_DM_VERITY) += dm-verity.o
|
|||||||
obj-$(CONFIG_DM_CACHE) += dm-cache.o
|
obj-$(CONFIG_DM_CACHE) += dm-cache.o
|
||||||
obj-$(CONFIG_DM_CACHE_MQ) += dm-cache-mq.o
|
obj-$(CONFIG_DM_CACHE_MQ) += dm-cache-mq.o
|
||||||
obj-$(CONFIG_DM_CACHE_CLEANER) += dm-cache-cleaner.o
|
obj-$(CONFIG_DM_CACHE_CLEANER) += dm-cache-cleaner.o
|
||||||
|
obj-$(CONFIG_DM_ERA) += dm-era.o
|
||||||
|
|
||||||
ifeq ($(CONFIG_DM_UEVENT),y)
|
ifeq ($(CONFIG_DM_UEVENT),y)
|
||||||
dm-mod-objs += dm-uevent.o
|
dm-mod-objs += dm-uevent.o
|
||||||
|
1730
drivers/md/dm-era-target.c
Normal file
1730
drivers/md/dm-era-target.c
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user