mirror of
git://sourceware.org/git/lvm2.git
synced 2025-02-28 05:57:49 +03:00
Add lvm functions for sending messages.
Functions are currently only needed for thin provissioning.
This commit is contained in:
parent
c6d777289b
commit
f683063d42
@ -1,5 +1,6 @@
|
|||||||
Version 2.02.89 -
|
Version 2.02.89 -
|
||||||
==================================
|
==================================
|
||||||
|
Introduce lv_send_message and dev_manager_send_message.
|
||||||
Introduce revert_lv for better pvmove cleanup.
|
Introduce revert_lv for better pvmove cleanup.
|
||||||
Replace incomplete pvmove activation failure recovery code with a message.
|
Replace incomplete pvmove activation failure recovery code with a message.
|
||||||
Abort if _finish_pvmove suspend_lvs fails instead of cleaning up incompletely.
|
Abort if _finish_pvmove suspend_lvs fails instead of cleaning up incompletely.
|
||||||
|
@ -215,6 +215,10 @@ int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv)
|
|||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
int lv_send_message(const struct logical_volume *lv, const char *message)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
int pv_uses_vg(struct physical_volume *pv,
|
int pv_uses_vg(struct physical_volume *pv,
|
||||||
struct volume_group *vg)
|
struct volume_group *vg)
|
||||||
{
|
{
|
||||||
@ -1643,6 +1647,55 @@ int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv)
|
|||||||
return r;
|
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?
|
* Does PV use VG somewhere in its construction?
|
||||||
* Returns 1 on failure.
|
* Returns 1 on failure.
|
||||||
|
@ -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_deactivate(struct cmd_context *cmd, const char *lvid_s);
|
||||||
|
|
||||||
int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv);
|
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.
|
* Returns 1 if info structure has been populated, else 0.
|
||||||
|
@ -876,6 +876,34 @@ int dev_manager_mknodes(const struct logical_volume *lv)
|
|||||||
return r;
|
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,
|
static uint16_t _get_udev_flags(struct dev_manager *dm, struct logical_volume *lv,
|
||||||
const char *layer)
|
const char *layer)
|
||||||
{
|
{
|
||||||
|
@ -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_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_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.
|
* Put the desired changes into effect.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user