[dm-devel] [PATCH] Add a set_era_counter config key to the dm-cache era policy shim

Mears, Morgan Morgan.Mears at netapp.com
Wed Nov 6 20:59:38 UTC 2013


Add the ability to set the era counter maintained by the dm-cache era
policy shim to an arbitrary 32-bit value, to allow era rollback after
the underlying device is restored from a snapshot.

Signed-off-by: Morgan Mears <mmears at netapp.com>
---
 drivers/md/dm-cache-policy-era.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/drivers/md/dm-cache-policy-era.c b/drivers/md/dm-cache-policy-era.c index d4fc0b0..c4cf2ba 100644
--- a/drivers/md/dm-cache-policy-era.c
+++ b/drivers/md/dm-cache-policy-era.c
@@ -155,6 +155,26 @@ static int incr_era_counter(struct era_policy *era, const char *curr_era_str,
 	return r;
 }
 
+static int set_era_counter(struct era_policy *era, const char *new_era_str,
+			   era_match_fn_t dummy)
+{
+	era_t new_era_counter;
+
+	/*
+	 * Set the era counter to a user-provided value, as long as it is
+	 * in range.
+	 */
+
+	if (kstrtou32(new_era_str, 10, &new_era_counter))
+		return -EINVAL;
+	if (new_era_counter > ERA_MAX_ERA)
+		return -EOVERFLOW;
+	era->era_counter = new_era_counter;
+	smp_wmb();
+
+	return 0;
+}
+
 static void *era_cblock_to_hint(struct shim_walk_map_ctx *ctx,
 				dm_cblock_t cblock, dm_oblock_t oblock)
 {
@@ -404,6 +424,7 @@ static int era_set_config_value(struct dm_cache_policy *p, const char *key,
 	struct era_policy *era = to_era_policy(p);
 	struct config_value_handler *vh, value_handlers[] = {
 		{ "increment_era_counter",                  incr_era_counter,  NULL },
+		{ "set_era_counter",                        set_era_counter,   NULL },
 		{ "unmap_blocks_from_later_eras",           cond_unmap_by_era, era_is_gt_value },
 		{ "unmap_blocks_from_this_era_and_later",   cond_unmap_by_era, era_is_gte_value },
 		{ "unmap_blocks_from_this_era_and_earlier", cond_unmap_by_era, era_is_lte_value },
-- 





More information about the dm-devel mailing list