summaryrefslogtreecommitdiffstats
path: root/lib/metadata
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2012-06-28 14:47:34 +0200
committerZdenek Kabelac <zkabelac@redhat.com>2012-07-18 14:36:57 +0200
commitebbf7d8e68f37c1a1e448a07676cca0a6e7f1430 (patch)
tree323db958763100efbf951dd619c78b18f1b3d3a7 /lib/metadata
parent260e8f24768d7a6e7c6a8018b5c2b08e7a35e35c (diff)
downloadlvm2-ebbf7d8e68f37c1a1e448a07676cca0a6e7f1430.tar.gz
lvm2-ebbf7d8e68f37c1a1e448a07676cca0a6e7f1430.tar.xz
lvm2-ebbf7d8e68f37c1a1e448a07676cca0a6e7f1430.zip
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
Diffstat (limited to 'lib/metadata')
-rw-r--r--lib/metadata/metadata-exported.h9
-rw-r--r--lib/metadata/thin_manip.c35
2 files changed, 44 insertions, 0 deletions
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;
+}