summaryrefslogtreecommitdiffstats
path: root/lib/thin/thin.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/thin/thin.c')
-rw-r--r--lib/thin/thin.c96
1 files changed, 80 insertions, 16 deletions
diff --git a/lib/thin/thin.c b/lib/thin/thin.c
index e8a56a97..180f9fc9 100644
--- a/lib/thin/thin.c
+++ b/lib/thin/thin.c
@@ -21,6 +21,7 @@
#include "config.h"
#include "activate.h"
#include "str_list.h"
+#include "defaults.h"
#ifdef DMEVENTD
# include "sharedlib.h"
@@ -297,7 +298,40 @@ static int _thin_pool_add_target_line(struct dev_manager *dm,
return 1;
}
-#endif
+
+static int _thin_pool_target_percent(void **target_state __attribute__((unused)),
+ percent_t *percent,
+ struct dm_pool *mem,
+ struct cmd_context *cmd __attribute__((unused)),
+ struct lv_segment *seg __attribute__((unused)),
+ char *params,
+ uint64_t *total_numerator,
+ uint64_t *total_denominator)
+{
+ struct dm_status_thin_pool *s;
+ percent_t meta_percent;
+ percent_t data_percent;
+
+ if (!dm_get_status_thin_pool(mem, params, &s))
+ return_0;
+
+ /*
+ * FIXME: how to handle exhaust of metadata space
+ * pick the max from data and meta?
+ * Support for metadata resize is needed.
+ */
+ meta_percent = make_percent(s->used_meta_blocks,
+ s->total_meta_blocks);
+ data_percent = make_percent(s->used_data_blocks,
+ s->total_data_blocks);
+
+ *percent = data_percent;
+ *total_numerator += s->used_data_blocks;
+ *total_denominator += s->total_data_blocks;
+
+ return 1;
+}
+#endif /* DEVMAPPER_SUPPORT */
static const char *_thin_name(const struct lv_segment *seg)
{
@@ -378,17 +412,6 @@ static int _thin_add_target_line(struct dev_manager *dm,
return 1;
}
-static int _thin_target_percent(void **target_state __attribute__((unused)),
- percent_t *percent,
- struct dm_pool *mem __attribute__((unused)),
- struct cmd_context *cmd __attribute__((unused)),
- struct lv_segment *seg __attribute__((unused)),
- char *params, uint64_t *total_numerator,
- uint64_t *total_denominator)
-{
- return 1;
-}
-
static int _thin_target_present(struct cmd_context *cmd,
const struct lv_segment *seg,
unsigned *attributes __attribute__((unused)))
@@ -404,6 +427,42 @@ static int _thin_target_present(struct cmd_context *cmd,
return _present;
}
+# ifdef DMEVENTD
+static const char *_get_thin_dso_path(struct cmd_context *cmd)
+{
+ return get_monitor_dso_path(cmd, find_config_tree_str(cmd, "dmeventd/thin_library",
+ DEFAULT_DMEVENTD_THIN_LIB));
+}
+
+/* FIXME Cache this */
+static int _target_registered(struct lv_segment *seg, int *pending)
+{
+ return target_registered_with_dmeventd(seg->lv->vg->cmd,
+ _get_thin_dso_path(seg->lv->vg->cmd),
+ seg->pool_lv, pending);
+}
+
+/* FIXME This gets run while suspended and performs banned operations. */
+static int _target_set_events(struct lv_segment *seg, int evmask, int set)
+{
+ /* FIXME Make timeout (10) configurable */
+ return target_register_events(seg->lv->vg->cmd,
+ _get_thin_dso_path(seg->lv->vg->cmd),
+ seg->pool_lv, evmask, set, 10);
+}
+
+static int _target_register_events(struct lv_segment *seg,
+ int events)
+{
+ return _target_set_events(seg, events, 1);
+}
+
+static int _target_unregister_events(struct lv_segment *seg,
+ int events)
+{
+ return _target_set_events(seg, events, 0);
+}
+# endif /* DMEVENTD */
#endif
static int _thin_modules_needed(struct dm_pool *mem,
@@ -430,6 +489,7 @@ static struct segtype_handler _thin_pool_ops = {
.text_export = _thin_pool_text_export,
#ifdef DEVMAPPER_SUPPORT
.add_target_line = _thin_pool_add_target_line,
+ .target_percent = _thin_pool_target_percent,
.target_present = _thin_target_present,
#endif
.modules_needed = _thin_modules_needed,
@@ -442,8 +502,12 @@ static struct segtype_handler _thin_ops = {
.text_export = _thin_text_export,
#ifdef DEVMAPPER_SUPPORT
.add_target_line = _thin_add_target_line,
- .target_percent = _thin_target_percent,
.target_present = _thin_target_present,
+# ifdef DMEVENTD
+ .target_monitored = _target_registered,
+ .target_monitor_events = _target_register_events,
+ .target_unmonitor_events = _target_unregister_events,
+# endif /* DMEVENTD */
#endif
.modules_needed = _thin_modules_needed,
.destroy = _thin_destroy,
@@ -484,9 +548,9 @@ int init_multiple_segtypes(struct cmd_context *cmd, struct segtype_library *segl
#ifdef DEVMAPPER_SUPPORT
# ifdef DMEVENTD
-// FIXME if (_get_thin_dso_path(cmd))
-// FIXME segtype->flags |= SEG_MONITORED;
-# endif /* DMEVENTD */
+ if (_get_thin_dso_path(cmd))
+ segtype->flags |= SEG_MONITORED;
+# endif /* DMEVENTD */
#endif
if (!lvm_register_segtype(seglib, segtype))
return_0;