diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2011-10-03 18:37:47 +0000 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2011-10-03 18:37:47 +0000 |
commit | a00cb3a6b0c72945f3506fde13320cc86ec88766 (patch) | |
tree | af59eb68e96d48f2dacb39e0c0fcbbc7f204e9a9 /lib/activate | |
parent | e0ea24be1fe4b841b191a66d8c4ab76d9d950c9f (diff) | |
download | lvm2-a00cb3a6b0c72945f3506fde13320cc86ec88766.tar.gz lvm2-a00cb3a6b0c72945f3506fde13320cc86ec88766.tar.xz lvm2-a00cb3a6b0c72945f3506fde13320cc86ec88766.zip |
Add lvm functions for sending messages.
Functions are currently only needed for thin provissioning.
Diffstat (limited to 'lib/activate')
-rw-r--r-- | lib/activate/activate.c | 53 | ||||
-rw-r--r-- | lib/activate/activate.h | 2 | ||||
-rw-r--r-- | lib/activate/dev_manager.c | 28 | ||||
-rw-r--r-- | lib/activate/dev_manager.h | 1 |
4 files changed, 84 insertions, 0 deletions
diff --git a/lib/activate/activate.c b/lib/activate/activate.c index 51862ac3..b315603b 100644 --- a/lib/activate/activate.c +++ b/lib/activate/activate.c @@ -215,6 +215,10 @@ int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv) { return 1; } +int lv_send_message(const struct logical_volume *lv, const char *message) +{ + return 0; +} int pv_uses_vg(struct physical_volume *pv, struct volume_group *vg) { @@ -1643,6 +1647,55 @@ int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv) return r; } +#if 0 +// FIXME: Remove this - example of supported messages thin pool +"create_thin %u", dev_id +"create_snap %u", dev_id +"delete %u", dev_id +"trim %u %" PRIu64, dev_id, new_size_sec +"set_transaction_id %" PRIu64 " %" PRIu64, cur_id, new_id +#endif + +int lv_send_message(const struct logical_volume *lv, const char *msg_format, ...) +{ + va_list ap; + struct dev_manager *dm; + const size_t buf_size = 128; + char *buf = NULL; + int r = 0, pr; + + if (!activation()) + return 0; + + if (!(dm = dev_manager_create(lv->vg->cmd, lv->vg->name, 1))) + return_0; + + if (!(buf = dm_malloc(buf_size))) { + log_error("Failed to allocate message buffer."); + goto out; + } + + va_start(ap, msg_format); + pr = vsnprintf(buf, buf_size, msg_format, ap); + va_end(ap); + + if (pr < 0 || pr >= buf_size) { + log_error("Failed to create message in reserved buffer size " + "%" PRIsize_t, buf_size); + goto out; + } + + log_debug("Sending message '%s' to LV %s/%s", buf, lv->vg->name, lv->name); + + if (!(r = dev_manager_send_message(dm, lv, buf))) + stack; +out: + dm_free(buf); + dev_manager_destroy(dm); + + return r; +} + /* * Does PV use VG somewhere in its construction? * Returns 1 on failure. diff --git a/lib/activate/activate.h b/lib/activate/activate.h index 3b3d738a..28ecd52d 100644 --- a/lib/activate/activate.h +++ b/lib/activate/activate.h @@ -71,6 +71,8 @@ int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s, int lv_deactivate(struct cmd_context *cmd, const char *lvid_s); int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv); +__attribute__ ((format(printf, 2, 3))) +int lv_send_message(const struct logical_volume *lv, const char *msg_format, ...); /* * Returns 1 if info structure has been populated, else 0. diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c index e7c73e93..33e08c83 100644 --- a/lib/activate/dev_manager.c +++ b/lib/activate/dev_manager.c @@ -876,6 +876,34 @@ int dev_manager_mknodes(const struct logical_volume *lv) return r; } +/* + * Send message + */ +int dev_manager_send_message(struct dev_manager *dm, const struct logical_volume *lv, const char *message) +{ + const char *name; + struct dm_task *dmt; + int r = 0; + + if (!(name = dm_build_dm_name(dm->mem, lv->vg->name, lv->name, NULL))) + return_0; + + if (!(dmt = _setup_task(name, NULL, NULL, DM_DEVICE_TARGET_MSG, 0, 0))) + return_0; + + if (!dm_task_set_message(dmt, message)) + goto_out; + + if (!dm_task_run(dmt)) + goto_out; + + r = 1; +out: + dm_task_destroy(dmt); + + return r; +} + static uint16_t _get_udev_flags(struct dev_manager *dm, struct logical_volume *lv, const char *layer) { diff --git a/lib/activate/dev_manager.h b/lib/activate/dev_manager.h index 9d414b20..e3aae5d5 100644 --- a/lib/activate/dev_manager.h +++ b/lib/activate/dev_manager.h @@ -62,6 +62,7 @@ int dev_manager_deactivate(struct dev_manager *dm, struct logical_volume *lv); int dev_manager_transient(struct dev_manager *dm, struct logical_volume *lv) __attribute__((nonnull(1, 2))); int dev_manager_mknodes(const struct logical_volume *lv); +int dev_manager_send_message(struct dev_manager *dm, const struct logical_volume *lv, const char *message); /* * Put the desired changes into effect. |