From ebbf7d8e68f37c1a1e448a07676cca0a6e7f1430 Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Thu, 28 Jun 2012 14:47:34 +0200 Subject: thin: add discard support for thin pool Add arg support for discard. Add discard ignore, nopassdown, passdown (=default) support. Flags could be set per pool. lvcreate [--discard {ignore|no_passdown|passdown}] vg/thinlv --- lib/metadata/metadata-exported.h | 9 +++++++++ lib/metadata/thin_manip.c | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) (limited to 'lib/metadata') diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h index 8c655c76..d2afdb1f 100644 --- a/lib/metadata/metadata-exported.h +++ b/lib/metadata/metadata-exported.h @@ -166,6 +166,12 @@ typedef enum { DONT_PROMPT_OVERRIDE = 2 /* Skip prompt + override a second condition */ } force_t; +typedef enum { + THIN_DISCARD_PASSDOWN, + THIN_DISCARD_NO_PASSDOWN, + THIN_DISCARD_IGNORE, +} thin_discard_t; + struct cmd_context; struct format_handler; struct labeller; @@ -347,6 +353,7 @@ struct lv_segment { uint64_t transaction_id; /* For thin_pool, thin */ uint64_t low_water_mark; /* For thin_pool */ unsigned zero_new_blocks; /* For thin_pool */ + thin_discard_t discard; /* For thin_pool */ struct dm_list thin_messages; /* For thin_pool */ struct logical_volume *pool_lv; /* For thin */ uint32_t device_id; /* For thin, 24bit */ @@ -558,6 +565,8 @@ uint64_t extents_from_size(struct cmd_context *cmd, uint64_t size, uint32_t extent_size); int update_pool_lv(struct logical_volume *lv, int activate); +int get_pool_discard(const char *str, thin_discard_t *discard); +const char *get_pool_discard_name(thin_discard_t discard); /* * Activation options diff --git a/lib/metadata/thin_manip.c b/lib/metadata/thin_manip.c index ae8d509e..8d1744cd 100644 --- a/lib/metadata/thin_manip.c +++ b/lib/metadata/thin_manip.c @@ -428,3 +428,38 @@ int update_pool_lv(struct logical_volume *lv, int activate) return 1; } + +int get_pool_discard(const char *str, thin_discard_t *discard) +{ + if (!strcasecmp(str, "passdown")) + *discard = THIN_DISCARD_PASSDOWN; + /* Allow some variation in thin parameter */ + else if (!strcasecmp(str, "nopassdown") || + !strcasecmp(str, "no-passdown") || + !strcasecmp(str, "no_passdown")) + *discard = THIN_DISCARD_NO_PASSDOWN; + else if (!strcasecmp(str, "ignore")) + *discard = THIN_DISCARD_IGNORE; + else { + log_error("Thin pool discard type %s is unknown.", str); + return 0; + } + + return 1; +} + +const char *get_pool_discard_name(thin_discard_t discard) +{ + switch (discard) { + case THIN_DISCARD_PASSDOWN: + return "passdown"; + case THIN_DISCARD_NO_PASSDOWN: + return "nopassdown"; + case THIN_DISCARD_IGNORE: + return "ignore"; + } + + log_error(INTERNAL_ERROR "Uknown discard type."); + + return NULL; +} -- cgit