From: Zdenek Kabelac Date: Wed, 8 Feb 2012 13:05:38 +0000 (+0000) Subject: Thin add pool_below_threshold X-Git-Tag: v2_02_91~21 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=a7e2da0585c440ef681f1f66baaaf36cc0a31976;p=lvm2.git Thin add pool_below_threshold Test both data and metadata percent usage. --- diff --git a/WHATS_NEW b/WHATS_NEW index 7375f5aaf..5fed8a704 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.91 - =================================== + Add pool_below_threshold() function to check thin pool percent status. Fix test for snap percent for failing merge when removing LV. Switch int to void return for str_list_del(). Fix error path handling in _build_desc(). diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index 252a5563e..da52e59d9 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -4054,7 +4054,6 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg, struct l struct logical_volume *lv, *org = NULL; struct logical_volume *pool_lv; struct lv_list *lvl; - percent_t percent; int origin_active = 0; struct lvinfo info; @@ -4375,26 +4374,20 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg, struct l if (seg_is_thin(lp)) { /* For snapshot, suspend active thin origin first */ if (org && lv_is_active(org)) { - /* Check if the pool is bellow threshold (Works only for active thin) */ - if (!lv_thin_pool_percent(first_seg(org)->pool_lv, 0, &percent)) { - stack; - goto revert_new_lv; - } - percent /= PERCENT_1; - if (percent >= (find_config_tree_int(cmd, "activation/thin_pool_autoextend_threshold", - DEFAULT_THIN_POOL_AUTOEXTEND_THRESHOLD))) { - log_error("Failed to create snapshot, pool is filled over " - "the autoextend threshold (%d%%).", percent); + if (!pool_below_threshold(first_seg(first_seg(org)->pool_lv))) { + log_error("Cannot create thin snapshot. Pool %s/%s is filled " + "over the autoextend threshold.", + org->vg->name, first_seg(org)->pool_lv->name); goto revert_new_lv; } if (!suspend_lv_origin(cmd, org)) { - log_error("Failed to suspend thin snapshot origin %s.", - org->name); + log_error("Failed to suspend thin snapshot origin %s/%s.", + org->vg->name, org->name); goto revert_new_lv; } if (!resume_lv_origin(cmd, org)) { /* deptree updates thin-pool */ - log_error("Failed to resume thin snapshot origin %s.", - org->name); + log_error("Failed to resume thin snapshot origin %s/%s.", + org->vg->name, org->name); goto revert_new_lv; } /* At this point remove pool messages, snapshot is active */ diff --git a/lib/metadata/metadata.h b/lib/metadata/metadata.h index bdac68302..be9b92cc3 100644 --- a/lib/metadata/metadata.h +++ b/lib/metadata/metadata.h @@ -464,6 +464,7 @@ int attach_pool_message(struct lv_segment *pool_seg, dm_thin_message_t type, int auto_increment); int pool_has_message(const struct lv_segment *seg, const struct logical_volume *lv, uint32_t device_id); +int pool_below_threshold(const struct lv_segment *pool_seg); int extend_pool(struct logical_volume *lv, const struct segment_type *segtype, struct alloc_handle *ah, uint32_t stripes, uint32_t stripe_size); diff --git a/lib/metadata/thin_manip.c b/lib/metadata/thin_manip.c index 4eaf3594c..9644ba0a1 100644 --- a/lib/metadata/thin_manip.c +++ b/lib/metadata/thin_manip.c @@ -19,6 +19,7 @@ #include "segtype.h" #include "lv_alloc.h" #include "archiver.h" +#include "defaults.h" int attach_pool_metadata_lv(struct lv_segment *pool_seg, struct logical_volume *metadata_lv) { @@ -215,6 +216,35 @@ int pool_has_message(const struct lv_segment *seg, return 0; } +int pool_below_threshold(const struct lv_segment *pool_seg) +{ + percent_t percent; + int threshold = PERCENT_1 * + find_config_tree_int(pool_seg->lv->vg->cmd, + "activation/thin_pool_autoextend_threshold", + DEFAULT_THIN_POOL_AUTOEXTEND_THRESHOLD); + + /* Data */ + if (!lv_thin_pool_percent(pool_seg->lv, 0, &percent)) { + stack; + return 0; + } + + if (percent >= threshold) + return 0; + + /* Metadata */ + if (!lv_thin_pool_percent(pool_seg->lv, 1, &percent)) { + stack; + return 0; + } + + if (percent >= threshold) + return 0; + + return 1; +} + struct lv_segment *find_pool_seg(const struct lv_segment *seg) { struct lv_segment *pool_seg;