mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02: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
					
				
					 4 changed files with 1851 additions and 0 deletions
				
			
		
							
								
								
									
										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
 | 
			
		||||
         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
 | 
			
		||||
       tristate "Mirror target"
 | 
			
		||||
       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-mq-y   += dm-cache-policy-mq.o
 | 
			
		||||
dm-cache-cleaner-y += dm-cache-policy-cleaner.o
 | 
			
		||||
dm-era-y	+= dm-era-target.o
 | 
			
		||||
md-mod-y	+= md.o bitmap.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_MQ)	+= dm-cache-mq.o
 | 
			
		||||
obj-$(CONFIG_DM_CACHE_CLEANER)	+= dm-cache-cleaner.o
 | 
			
		||||
obj-$(CONFIG_DM_ERA)		+= dm-era.o
 | 
			
		||||
 | 
			
		||||
ifeq ($(CONFIG_DM_UEVENT),y)
 | 
			
		||||
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 a new issue