mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-02 01:18:26 +03:00
cleanup: use macros for definition of reporting/selection reserved values
The macros for reserved value definition makes the process a bit easier, but there's still a place for improvement and make this even more transparent. We can optimize and provide better automatism here later on.
This commit is contained in:
parent
1a05862732
commit
ccab185aa7
@ -27,6 +27,10 @@
|
|||||||
* Help text ends with a full stop.
|
* Help text ends with a full stop.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FIELD(report_object_type, structure, sort_type, heading, structure_field, output width, reporting_function, field_id, description, settable_via_lib)
|
||||||
|
*/
|
||||||
|
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
FIELD(LVS, lv, STR, "LV UUID", lvid.id[1], 38, uuid, lv_uuid, "Unique identifier.", 0)
|
FIELD(LVS, lv, STR, "LV UUID", lvid.id[1], 38, uuid, lv_uuid, "Unique identifier.", 0)
|
||||||
FIELD(LVS, lv, STR, "LV", lvid, 4, lvname, lv_name, "Name. LVs created for internal use are enclosed in brackets.", 0)
|
FIELD(LVS, lv, STR, "LV", lvid, 4, lvname, lv_name, "Name. LVs created for internal use are enclosed in brackets.", 0)
|
||||||
|
@ -41,27 +41,24 @@ struct lvm_report_object {
|
|||||||
struct label *label;
|
struct label *label;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Enum for field_num index to use in per-field reserved value definition. */
|
/*
|
||||||
|
* Enum for field_num index to use in per-field reserved value definition.
|
||||||
|
* Each field is represented by enum value with name "field_<id>" where <id>
|
||||||
|
* is the field_id of the field as registered in columns.h.
|
||||||
|
*/
|
||||||
#define FIELD(type, strct, sorttype, head, field_name, width, func, id, desc, writeable) field_ ## id,
|
#define FIELD(type, strct, sorttype, head, field_name, width, func, id, desc, writeable) field_ ## id,
|
||||||
enum {
|
enum {
|
||||||
#include "columns.h"
|
#include "columns.h"
|
||||||
};
|
};
|
||||||
#undef FIELD
|
#undef FIELD
|
||||||
|
|
||||||
|
|
||||||
static const uint64_t _zero64 = UINT64_C(0);
|
static const uint64_t _zero64 = UINT64_C(0);
|
||||||
static const uint64_t _one64 = UINT64_C(1);
|
static const uint64_t _one64 = UINT64_C(1);
|
||||||
static const char * const _str_zero = "0";
|
static const char const _str_zero[] = "0";
|
||||||
static const char * const _str_one = "1";
|
static const char const _str_one[] = "1";
|
||||||
|
static const char const _str_minus_one[] = "-1";
|
||||||
|
static const char const _str_unknown[] = "unknown";
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: try to automate reserved value definition and declare reserved values
|
|
||||||
* using FIELD macro directly. The FIELD macro should be able to define
|
|
||||||
* proper structures automatically then.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Per-type reserved values. */
|
|
||||||
static const uint64_t _reserved_number_undef_64 = UINT64_C(-1);
|
|
||||||
/*
|
/*
|
||||||
* 32 bit signed is casted to 64 bit unsigned in dm_report_field internally!
|
* 32 bit signed is casted to 64 bit unsigned in dm_report_field internally!
|
||||||
* So when stored in the struct, the _reserved_number_undef_32 is actually
|
* So when stored in the struct, the _reserved_number_undef_32 is actually
|
||||||
@ -69,131 +66,93 @@ static const uint64_t _reserved_number_undef_64 = UINT64_C(-1);
|
|||||||
*/
|
*/
|
||||||
static const int32_t _reserved_number_undef_32 = INT32_C(-1);
|
static const int32_t _reserved_number_undef_32 = INT32_C(-1);
|
||||||
|
|
||||||
/* Per-field reserved values. */
|
#define FIRST_NAME(id) _reserved_ ## id ## _names[0]
|
||||||
static const struct dm_report_field_reserved_value _reserved_pv_allocatable = {field_pv_allocatable, &_one64};
|
#define TYPE_RESERVED_VALUE(type, id, value, ...) \
|
||||||
static const struct dm_report_field_reserved_value _reserved_pv_exported = {field_pv_exported, &_one64};
|
static const char *_reserved_ ## id ## _names[] = { __VA_ARGS__, NULL}; \
|
||||||
static const struct dm_report_field_reserved_value _reserved_pv_missing = {field_pv_missing, &_one64};
|
static const type _reserved_ ## id = value;
|
||||||
static const struct dm_report_field_reserved_value _reserved_vg_extendable = {field_vg_extendable, &_one64};
|
#define FIELD_RESERVED_VALUE(field_id, id, value, ...) \
|
||||||
static const struct dm_report_field_reserved_value _reserved_vg_exported = {field_vg_exported, &_one64};
|
static const char *_reserved_ ## id ## _names[] = { __VA_ARGS__ , NULL}; \
|
||||||
static const struct dm_report_field_reserved_value _reserved_vg_partial = {field_vg_partial, &_one64};
|
static const struct dm_report_field_reserved_value _reserved_ ## id = {field_ ## field_id, &value};
|
||||||
static const struct dm_report_field_reserved_value _reserved_vg_clustered = {field_vg_clustered, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_vg_permissions_rw = {field_vg_permissions, "writeable"};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_vg_permissions_r = {field_vg_permissions, "read-only"};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_vg_mda_copies = {field_vg_mda_copies, &_reserved_number_undef_64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_initial_image_sync = {field_lv_initial_image_sync, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_image_synced = {field_lv_image_synced, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_merging = {field_lv_merging, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_converting = {field_lv_converting, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_allocation_locked = {field_lv_allocation_locked, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_fixed_minor = {field_lv_fixed_minor, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_merge_failed = {field_lv_merge_failed, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_snapshot_invalid = {field_lv_snapshot_invalid, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_suspended = {field_lv_suspended, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_live_table = {field_lv_live_table, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_inactive_table = {field_lv_inactive_table, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_device_open = {field_lv_device_open, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_skip_activation = {field_lv_skip_activation, &_one64};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_permissions_rw = {field_lv_permissions, "writeable"};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_permissions_r = {field_lv_permissions, "read-only"};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_permissions_r_override = {field_lv_permissions, "read-only-override"};
|
|
||||||
static const struct dm_report_field_reserved_value _reserved_lv_read_ahead = {field_lv_read_ahead, &_reserved_number_undef_64};
|
|
||||||
|
|
||||||
/* Per-type reserved names. */
|
/*
|
||||||
static const char const *_reserved_number_undef_64_names[]={"-1", "undefined", "undef", "unknown", NULL};
|
* Reserved values and their assigned names.
|
||||||
|
* The first name is the one that is also used for reporting.
|
||||||
|
* All names listed are synonyms recognized in selection criteria.
|
||||||
|
* For binary-based values we map all reserved names listed onto value 1, blank onto value 0.
|
||||||
|
*
|
||||||
|
* TYPE_RESERVED_VALUE(type, reserved_value_id, value, reserved name, ...)
|
||||||
|
* FIELD_RESERVED_VALUE(field_id, reserved_value_id, value, reserved name, ...)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
TYPE_RESERVED_VALUE(uint64_t, number_undef_64, UINT64_C(-1), _str_minus_one, _str_unknown, "undefined", "undef");
|
||||||
|
FIELD_RESERVED_VALUE(pv_allocatable, pv_allocatable, _one64, "allocatable")
|
||||||
|
FIELD_RESERVED_VALUE(pv_exported, pv_exported, _one64, "exported")
|
||||||
|
FIELD_RESERVED_VALUE(pv_missing, pv_missing, _one64, "missing")
|
||||||
|
FIELD_RESERVED_VALUE(vg_extendable, vg_extendable, _one64, "extendable")
|
||||||
|
FIELD_RESERVED_VALUE(vg_exported, vg_exported, _one64, "exported")
|
||||||
|
FIELD_RESERVED_VALUE(vg_partial, vg_partial, _one64, "partial")
|
||||||
|
FIELD_RESERVED_VALUE(vg_clustered, vg_clustered, _one64, "clustered")
|
||||||
|
FIELD_RESERVED_VALUE(vg_permissions, vg_permissions_rw, FIRST_NAME(vg_permissions_rw), "writeable", "rw", "read_write")
|
||||||
|
FIELD_RESERVED_VALUE(vg_permissions, vg_permissions_r, FIRST_NAME(vg_permissions_r), "read-only", "r", "ro")
|
||||||
|
FIELD_RESERVED_VALUE(vg_mda_copies, vg_mda_copies, _reserved_number_undef_64, "unmanaged")
|
||||||
|
FIELD_RESERVED_VALUE(lv_initial_image_sync, lv_initial_image_sync, _one64, "initial image sync", "sync")
|
||||||
|
FIELD_RESERVED_VALUE(lv_image_synced, lv_image_synced, _one64, "image synced", "synced")
|
||||||
|
FIELD_RESERVED_VALUE(lv_merging, lv_merging, _one64, "merging")
|
||||||
|
FIELD_RESERVED_VALUE(lv_converting, lv_converting, _one64, "converting")
|
||||||
|
FIELD_RESERVED_VALUE(lv_allocation_locked, lv_allocation_locked, _one64, "allocation locked", "locked")
|
||||||
|
FIELD_RESERVED_VALUE(lv_fixed_minor, lv_fixed_minor, _one64, "fixed minor", "fixed")
|
||||||
|
FIELD_RESERVED_VALUE(lv_merge_failed, lv_merge_failed, _one64, "merge failed", "failed")
|
||||||
|
FIELD_RESERVED_VALUE(lv_snapshot_invalid, lv_snapshot_invalid, _one64, "snapsot invalid", "invalid")
|
||||||
|
FIELD_RESERVED_VALUE(lv_suspended, lv_suspended, _one64, "suspended")
|
||||||
|
FIELD_RESERVED_VALUE(lv_live_table, lv_live_table, _one64, "live table present", "live table", "live")
|
||||||
|
FIELD_RESERVED_VALUE(lv_inactive_table, lv_inactive_table, _one64, "inactive table present", "inactive table", "inactive")
|
||||||
|
FIELD_RESERVED_VALUE(lv_device_open, lv_device_open, _one64, "open")
|
||||||
|
FIELD_RESERVED_VALUE(lv_skip_activation, lv_skip_activation, _one64, "skip activation", "skip")
|
||||||
|
FIELD_RESERVED_VALUE(lv_permissions, lv_permissions_rw, FIRST_NAME(lv_permissions_rw), "writeable", "rw", "read-write")
|
||||||
|
FIELD_RESERVED_VALUE(lv_permissions, lv_permissions_r, FIRST_NAME(lv_permissions_r), "read-only", "r", "ro")
|
||||||
|
FIELD_RESERVED_VALUE(lv_permissions, lv_permissions_r_override, FIRST_NAME(lv_permissions_r_override), "read-only-override", "ro-override", "r-override", "R")
|
||||||
|
FIELD_RESERVED_VALUE(lv_read_ahead, lv_read_ahead, _reserved_number_undef_64, "auto")
|
||||||
|
|
||||||
/* Per-field reserved names. */
|
#define TYPE_RESERVED_VALUE_REG(type, id, description) {DM_REPORT_FIELD_TYPE_ ## type, &_reserved_ ## id, _reserved_ ## id ## _names, description},
|
||||||
static const char *_reserved_pv_allocatable_names[]={"allocatable", NULL};
|
#define FIELD_RESERVED_VALUE_REG(id, description) {DM_REPORT_FIELD_TYPE_NONE, &_reserved_ ## id, _reserved_ ## id ## _names, description},
|
||||||
static const char *_reserved_pv_exported_names[]={"exported", NULL};
|
|
||||||
static const char *_reserved_pv_missing_names[]={"missing", NULL};
|
|
||||||
static const char *_reserved_vg_extendable_names[]={"extendable", NULL};
|
|
||||||
static const char *_reserved_vg_exported_names[]={"exported", NULL};
|
|
||||||
static const char *_reserved_vg_partial_names[]={"partial", NULL};
|
|
||||||
static const char *_reserved_vg_clustered_names[]={"clustered", NULL};
|
|
||||||
static const char *_reserved_vg_permissions_rw_names[]={"writeable", "rw", "read-write", NULL};
|
|
||||||
static const char *_reserved_vg_permissions_r_names[]={"read-only", "r", "ro", NULL};
|
|
||||||
static const char *_reserved_vg_mda_copies_names[]={"unmanaged", NULL};
|
|
||||||
static const char *_reserved_lv_initial_image_sync_names[]={"initial image sync", "sync", NULL};
|
|
||||||
static const char *_reserved_lv_image_synced_names[]={"image synced", "synced", NULL};
|
|
||||||
static const char *_reserved_lv_merging_names[]={"merging", NULL};
|
|
||||||
static const char *_reserved_lv_converting_names[]={"converting", NULL};
|
|
||||||
static const char *_reserved_lv_allocation_locked_names[]={"allocation locked", "locked", NULL};
|
|
||||||
static const char *_reserved_lv_fixed_minor_names[]={"fixed minor", "fixed", NULL};
|
|
||||||
static const char *_reserved_lv_merge_failed_names[]={"merge failed", "failed", NULL};
|
|
||||||
static const char *_reserved_lv_snapshot_invalid_names[]={"snapsot invalid", "invalid", NULL};
|
|
||||||
static const char *_reserved_lv_suspended_names[]={"suspended", NULL};
|
|
||||||
static const char *_reserved_lv_live_table_names[]={"live table present", "live table", "live", NULL};
|
|
||||||
static const char *_reserved_lv_inactive_table_names[]={"inactive table present", "inactive table", "inactive", NULL};
|
|
||||||
static const char *_reserved_lv_device_open_names[]={"open", NULL};
|
|
||||||
static const char *_reserved_lv_skip_activation_names[]={"skip activation", "skip", NULL};
|
|
||||||
static const char *_reserved_lv_permissions_rw_names[]={"writeable", "rw", "read-write", NULL};
|
|
||||||
static const char *_reserved_lv_permissions_r_names[]={"read-only", "r", "ro", NULL};
|
|
||||||
static const char *_reserved_lv_permissions_r_override_names[]={"read-only-override", "ro-override", "r-override", "R", NULL};
|
|
||||||
static const char *_reserved_lv_read_ahead_names[]={"auto", NULL};
|
|
||||||
|
|
||||||
/* Put together arrays of reserved names with their reserved values. */
|
/*
|
||||||
|
* Create array of reserved values to be passed for dm_report_init_with_selection
|
||||||
|
* function that initializes report with selection criteria. Selection code then
|
||||||
|
* recognizes these reserved values when parsing selection criteria.
|
||||||
|
*/
|
||||||
static const struct dm_report_reserved_value _report_reserved_values[] = {
|
static const struct dm_report_reserved_value _report_reserved_values[] = {
|
||||||
{DM_REPORT_FIELD_TYPE_NUMBER, &_reserved_number_undef_64, _reserved_number_undef_64_names,
|
TYPE_RESERVED_VALUE_REG(NUMBER, number_undef_64, "Reserved value for undefined numeric value.")
|
||||||
"Reserved value for undefined numeric value."},
|
FIELD_RESERVED_VALUE_REG(pv_allocatable, "pv_allocatable reserved values")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_pv_allocatable, _reserved_pv_allocatable_names,
|
FIELD_RESERVED_VALUE_REG(pv_exported, "pv_exported reserved values")
|
||||||
"pv_allocatable reserved values"},
|
FIELD_RESERVED_VALUE_REG(pv_missing, "pv_missing reserved values")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_pv_exported, _reserved_pv_exported_names,
|
FIELD_RESERVED_VALUE_REG(vg_extendable, "vg_extendable reserved values")
|
||||||
"pv_exported reserved values"},
|
FIELD_RESERVED_VALUE_REG(vg_exported, "vg_exported reserved values")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_pv_missing, _reserved_pv_missing_names,
|
FIELD_RESERVED_VALUE_REG(vg_partial, "vg_partial reserved values")
|
||||||
"pv_missing reserved values"},
|
FIELD_RESERVED_VALUE_REG(vg_clustered, "vg_clustered reserved values")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_extendable, _reserved_vg_extendable_names,
|
FIELD_RESERVED_VALUE_REG(vg_permissions_rw, "vg_permissions reserved values (writeable)")
|
||||||
"vg_extendable reserved values"},
|
FIELD_RESERVED_VALUE_REG(vg_permissions_r, "vg_permissions reserved values (read-only)")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_exported, _reserved_vg_exported_names,
|
FIELD_RESERVED_VALUE_REG(vg_mda_copies, "vg_mda_copies reserved values (unmanaged)")
|
||||||
"vg_exported reserved values"},
|
FIELD_RESERVED_VALUE_REG(lv_initial_image_sync, "lv_initial_image_sync reserved values")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_partial, _reserved_vg_partial_names,
|
FIELD_RESERVED_VALUE_REG(lv_image_synced, "lv_image_synced reserved values")
|
||||||
"vg_partial reserved values"},
|
FIELD_RESERVED_VALUE_REG(lv_merging, "lv_merging reserved values")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_clustered, _reserved_vg_clustered_names,
|
FIELD_RESERVED_VALUE_REG(lv_converting, "lv_converting reserved values")
|
||||||
"vg_clustered reserved values"},
|
FIELD_RESERVED_VALUE_REG(lv_allocation_locked, "lv_allocation_locked reserved values")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_permissions_rw, _reserved_vg_permissions_rw_names,
|
FIELD_RESERVED_VALUE_REG(lv_fixed_minor, "lv_fixed_minor reserved values")
|
||||||
"vg_permissions reserved values (writeable)"},
|
FIELD_RESERVED_VALUE_REG(lv_merge_failed, "lv_merge_failed reserved values")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_permissions_r, _reserved_vg_permissions_r_names,
|
FIELD_RESERVED_VALUE_REG(lv_snapshot_invalid, "lv_snapshot_invalid reserved values")
|
||||||
"vg_permissions reserved values (read-only)"},
|
FIELD_RESERVED_VALUE_REG(lv_suspended, "lv_suspended reserved values")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_mda_copies, _reserved_vg_mda_copies_names,
|
FIELD_RESERVED_VALUE_REG(lv_live_table, "lv_live_table reserved values")
|
||||||
"vg_mda_copies reserved values (unmanaged)"},
|
FIELD_RESERVED_VALUE_REG(lv_inactive_table, "lv_inactive_table reserved values")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_initial_image_sync, _reserved_lv_initial_image_sync_names,
|
FIELD_RESERVED_VALUE_REG(lv_device_open, "lv_device_open reserved values")
|
||||||
"lv_initial_image_sync reserved values"},
|
FIELD_RESERVED_VALUE_REG(lv_skip_activation, "lv_inactive_table reserved values")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_image_synced, _reserved_lv_image_synced_names,
|
FIELD_RESERVED_VALUE_REG(lv_permissions_rw, "lv_permissions reserved values (writeable)")
|
||||||
"lv_image_synced reserved values"},
|
FIELD_RESERVED_VALUE_REG(lv_permissions_r, "lv_permissions reserved values (read-only)")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_merging, _reserved_lv_merging_names,
|
FIELD_RESERVED_VALUE_REG(lv_permissions_r_override, "lv_permissions reserved values (read-only-override)")
|
||||||
"lv_merging reserved values"},
|
FIELD_RESERVED_VALUE_REG(lv_read_ahead, "lv_read_ahead reserved values (auto)")
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_converting, _reserved_lv_converting_names,
|
|
||||||
"lv_converting reserved values"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_allocation_locked, _reserved_lv_allocation_locked_names,
|
|
||||||
"lv_allocation_locked reserved values"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_fixed_minor, _reserved_lv_fixed_minor_names,
|
|
||||||
"lv_fixed_minor reserved values"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_merge_failed, _reserved_lv_merge_failed_names,
|
|
||||||
"lv_merge_failed reserved values"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_snapshot_invalid, _reserved_lv_snapshot_invalid_names,
|
|
||||||
"lv_snapshot_invalid reserved values"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_suspended, _reserved_lv_suspended_names,
|
|
||||||
"lv_suspended reserved values"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_live_table, _reserved_lv_live_table_names,
|
|
||||||
"lv_live_table reserved values"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_inactive_table, _reserved_lv_inactive_table_names,
|
|
||||||
"lv_inactive_table reserved values"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_device_open, _reserved_lv_device_open_names,
|
|
||||||
"lv_device_open reserved values"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_skip_activation, _reserved_lv_skip_activation_names,
|
|
||||||
"lv_inactive_table reserved values"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_permissions_rw, _reserved_lv_permissions_rw_names,
|
|
||||||
"lv_permissions reserved values (writeable)"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_permissions_r, _reserved_lv_permissions_r_names,
|
|
||||||
"lv_permissions reserved values (read-only)"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_permissions_r_override, _reserved_lv_permissions_r_override_names,
|
|
||||||
"lv_permissions reserved values (read-only-override)"},
|
|
||||||
{DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_read_ahead, _reserved_lv_read_ahead_names,
|
|
||||||
"lv_read_ahead reserved values (auto)"},
|
|
||||||
{0, NULL, NULL}
|
{0, NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *_str_unknown = "unknown";
|
|
||||||
static const char *_str_minus_one = "-1";
|
|
||||||
|
|
||||||
static int _field_set_value(struct dm_report_field *field, const void *data, const void *sort)
|
static int _field_set_value(struct dm_report_field *field, const void *data, const void *sort)
|
||||||
{
|
{
|
||||||
dm_report_field_set_value(field, data, sort);
|
dm_report_field_set_value(field, data, sort);
|
||||||
@ -204,6 +163,36 @@ static int _field_set_value(struct dm_report_field *field, const void *data, con
|
|||||||
/*
|
/*
|
||||||
* Data-munging functions to prepare each data type for display and sorting
|
* Data-munging functions to prepare each data type for display and sorting
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display either "0"/"1" or ""/"word" based on bin_value,
|
||||||
|
* cmd->report_binary_values_as_numeric selects the mode to use.
|
||||||
|
*/
|
||||||
|
static int _binary_disp(struct dm_report *rh, struct dm_pool *mem __attribute__((unused)),
|
||||||
|
struct dm_report_field *field, int bin_value, const char *word,
|
||||||
|
void *private)
|
||||||
|
{
|
||||||
|
const struct cmd_context *cmd = (const struct cmd_context *) private;
|
||||||
|
|
||||||
|
if (cmd->report_binary_values_as_numeric)
|
||||||
|
/* "0"/"1" */
|
||||||
|
return _field_set_value(field, bin_value ? _str_one : _str_zero, bin_value ? &_one64 : &_zero64);
|
||||||
|
else
|
||||||
|
/* blank/"word" */
|
||||||
|
return _field_set_value(field, bin_value ? word : "", bin_value ? &_one64 : &_zero64);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _binary_undef_disp(struct dm_report *rh, struct dm_pool *mem __attribute__((unused)),
|
||||||
|
struct dm_report_field *field, void *private)
|
||||||
|
{
|
||||||
|
const struct cmd_context *cmd = (const struct cmd_context *) private;
|
||||||
|
|
||||||
|
if (cmd->report_binary_values_as_numeric)
|
||||||
|
return _field_set_value(field, FIRST_NAME(number_undef_64), &_reserved_number_undef_64);
|
||||||
|
else
|
||||||
|
return _field_set_value(field, _str_unknown, &_reserved_number_undef_64);
|
||||||
|
}
|
||||||
|
|
||||||
static int _string_disp(struct dm_report *rh, struct dm_pool *mem __attribute__((unused)),
|
static int _string_disp(struct dm_report *rh, struct dm_pool *mem __attribute__((unused)),
|
||||||
struct dm_report_field *field,
|
struct dm_report_field *field,
|
||||||
const void *data, void *private __attribute__((unused)))
|
const void *data, void *private __attribute__((unused)))
|
||||||
@ -1296,41 +1285,12 @@ static int _lvactive_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
|
|
||||||
/* PV/VG/LV Attributes */
|
/* PV/VG/LV Attributes */
|
||||||
|
|
||||||
/*
|
|
||||||
* Display either "0"/"1" or ""/"word" based on bin_value,
|
|
||||||
* cmd->report_binary_values_as_numeric selects the mode to use.
|
|
||||||
*/
|
|
||||||
static int _binary_disp(struct dm_report *rh, struct dm_pool *mem __attribute__((unused)),
|
|
||||||
struct dm_report_field *field, int bin_value, const char *word,
|
|
||||||
void *private)
|
|
||||||
{
|
|
||||||
const struct cmd_context *cmd = (const struct cmd_context *) private;
|
|
||||||
|
|
||||||
if (cmd->report_binary_values_as_numeric)
|
|
||||||
/* "0"/"1" */
|
|
||||||
return _field_set_value(field, bin_value ? _str_one : _str_zero, bin_value ? &_one64 : &_zero64);
|
|
||||||
else
|
|
||||||
/* blank/"word" */
|
|
||||||
return _field_set_value(field, bin_value ? word : "", bin_value ? &_one64 : &_zero64);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _binary_undef_disp(struct dm_report *rh, struct dm_pool *mem __attribute__((unused)),
|
|
||||||
struct dm_report_field *field, void *private)
|
|
||||||
{
|
|
||||||
const struct cmd_context *cmd = (const struct cmd_context *) private;
|
|
||||||
|
|
||||||
if (cmd->report_binary_values_as_numeric)
|
|
||||||
return _field_set_value(field, _str_minus_one, &_reserved_number_undef_64);
|
|
||||||
else
|
|
||||||
return _field_set_value(field, _str_unknown, &_reserved_number_undef_64);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _pvallocatable_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _pvallocatable_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
struct dm_report_field *field,
|
struct dm_report_field *field,
|
||||||
const void *data, void *private)
|
const void *data, void *private)
|
||||||
{
|
{
|
||||||
int allocatable = (((const struct physical_volume *) data)->status & ALLOCATABLE_PV) != 0;
|
int allocatable = (((const struct physical_volume *) data)->status & ALLOCATABLE_PV) != 0;
|
||||||
return _binary_disp(rh, mem, field, allocatable, "allocatable", private);
|
return _binary_disp(rh, mem, field, allocatable, FIRST_NAME(pv_allocatable), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _pvexported_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _pvexported_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1338,7 +1298,7 @@ static int _pvexported_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
const void *data, void *private)
|
const void *data, void *private)
|
||||||
{
|
{
|
||||||
int exported = (((const struct physical_volume *) data)->status & EXPORTED_VG) != 0;
|
int exported = (((const struct physical_volume *) data)->status & EXPORTED_VG) != 0;
|
||||||
return _binary_disp(rh, mem, field, exported, "exported", private);
|
return _binary_disp(rh, mem, field, exported, FIRST_NAME(pv_exported), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _pvmissing_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _pvmissing_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1346,14 +1306,15 @@ static int _pvmissing_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
const void *data, void *private)
|
const void *data, void *private)
|
||||||
{
|
{
|
||||||
int missing = (((const struct physical_volume *) data)->status & MISSING_PV) != 0;
|
int missing = (((const struct physical_volume *) data)->status & MISSING_PV) != 0;
|
||||||
return _binary_disp(rh, mem, field, missing, "missing", private);
|
return _binary_disp(rh, mem, field, missing, FIRST_NAME(pv_missing), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _vgpermissions_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _vgpermissions_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
struct dm_report_field *field,
|
struct dm_report_field *field,
|
||||||
const void *data, void *private)
|
const void *data, void *private)
|
||||||
{
|
{
|
||||||
const char *perms = ((const struct volume_group *) data)->status & LVM_WRITE ? "writeable" : "read-only";
|
const char *perms = ((const struct volume_group *) data)->status & LVM_WRITE ? FIRST_NAME(vg_permissions_rw)
|
||||||
|
: FIRST_NAME(vg_permissions_r);
|
||||||
return _string_disp(rh, mem, field, &perms, private);
|
return _string_disp(rh, mem, field, &perms, private);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1362,7 +1323,7 @@ static int _vgextendable_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
const void *data, void *private)
|
const void *data, void *private)
|
||||||
{
|
{
|
||||||
int extendable = (vg_is_resizeable((const struct volume_group *) data)) != 0;
|
int extendable = (vg_is_resizeable((const struct volume_group *) data)) != 0;
|
||||||
return _binary_disp(rh, mem, field, extendable, "extendable", private);
|
return _binary_disp(rh, mem, field, extendable, FIRST_NAME(vg_extendable), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _vgexported_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _vgexported_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1370,7 +1331,7 @@ static int _vgexported_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
const void *data, void *private)
|
const void *data, void *private)
|
||||||
{
|
{
|
||||||
int exported = (vg_is_exported((const struct volume_group *) data)) != 0;
|
int exported = (vg_is_exported((const struct volume_group *) data)) != 0;
|
||||||
return _binary_disp(rh, mem, field, exported, "exported", private);
|
return _binary_disp(rh, mem, field, exported, FIRST_NAME(vg_exported), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _vgpartial_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _vgpartial_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1378,7 +1339,7 @@ static int _vgpartial_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
const void *data, void *private)
|
const void *data, void *private)
|
||||||
{
|
{
|
||||||
int partial = (vg_missing_pv_count((const struct volume_group *) data)) != 0;
|
int partial = (vg_missing_pv_count((const struct volume_group *) data)) != 0;
|
||||||
return _binary_disp(rh, mem, field, partial, "partial", private);
|
return _binary_disp(rh, mem, field, partial, FIRST_NAME(vg_partial), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _vgallocationpolicy_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _vgallocationpolicy_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1394,7 +1355,7 @@ static int _vgclustered_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
const void *data, void *private)
|
const void *data, void *private)
|
||||||
{
|
{
|
||||||
int clustered = (vg_is_clustered((const struct volume_group *) data)) != 0;
|
int clustered = (vg_is_clustered((const struct volume_group *) data)) != 0;
|
||||||
return _binary_disp(rh, mem, field, clustered, "clustered", private);
|
return _binary_disp(rh, mem, field, clustered, FIRST_NAME(vg_clustered), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _lvvolumetype_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _lvvolumetype_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1417,7 +1378,7 @@ static int _lvinitialimagesync_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
else
|
else
|
||||||
initial_image_sync = 0;
|
initial_image_sync = 0;
|
||||||
|
|
||||||
return _binary_disp(rh, mem, field, initial_image_sync, "initial image sync", private);
|
return _binary_disp(rh, mem, field, initial_image_sync, FIRST_NAME(lv_initial_image_sync), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _lvimagesynced_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _lvimagesynced_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1434,7 +1395,7 @@ static int _lvimagesynced_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
else
|
else
|
||||||
image_synced = 0;
|
image_synced = 0;
|
||||||
|
|
||||||
return _binary_disp(rh, mem, field, image_synced, "image synced", private);
|
return _binary_disp(rh, mem, field, image_synced, FIRST_NAME(lv_image_synced), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _lvmerging_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _lvmerging_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1453,7 +1414,7 @@ static int _lvmerging_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
else
|
else
|
||||||
merging = 0;
|
merging = 0;
|
||||||
|
|
||||||
return _binary_disp(rh, mem, field, merging, "merging", private);
|
return _binary_disp(rh, mem, field, merging, FIRST_NAME(lv_merging), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _lvconverting_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _lvconverting_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1474,11 +1435,11 @@ static int _lvpermissions_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
if (!(lvi->lv->status & PVMOVE)) {
|
if (!(lvi->lv->status & PVMOVE)) {
|
||||||
if (lvi->lv->status & LVM_WRITE) {
|
if (lvi->lv->status & LVM_WRITE) {
|
||||||
if (lvi->info->read_only)
|
if (lvi->info->read_only)
|
||||||
perms = "read-only-override";
|
perms = FIRST_NAME(lv_permissions_r_override);
|
||||||
else
|
else
|
||||||
perms = "writeable";
|
perms = FIRST_NAME(lv_permissions_rw);
|
||||||
} else if (lvi->lv->status & LVM_READ)
|
} else if (lvi->lv->status & LVM_READ)
|
||||||
perms = "read-only";
|
perms = FIRST_NAME(lv_permissions_r);
|
||||||
else
|
else
|
||||||
perms = _str_unknown;
|
perms = _str_unknown;
|
||||||
}
|
}
|
||||||
@ -1499,7 +1460,7 @@ static int _lvallocationlocked_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
const void *data, void *private)
|
const void *data, void *private)
|
||||||
{
|
{
|
||||||
int alloc_locked = (((const struct logical_volume *) data)->status & LOCKED) != 0;
|
int alloc_locked = (((const struct logical_volume *) data)->status & LOCKED) != 0;
|
||||||
return _binary_disp(rh, mem, field, alloc_locked, "allocation locked", private);
|
return _binary_disp(rh, mem, field, alloc_locked, FIRST_NAME(lv_allocation_locked), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _lvfixedminor_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _lvfixedminor_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1507,7 +1468,7 @@ static int _lvfixedminor_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
const void *data, void *private)
|
const void *data, void *private)
|
||||||
{
|
{
|
||||||
int fixed_minor = (((const struct logical_volume *) data)->status & FIXED_MINOR) != 0;
|
int fixed_minor = (((const struct logical_volume *) data)->status & FIXED_MINOR) != 0;
|
||||||
return _binary_disp(rh, mem, field, fixed_minor, "fixed minor", private);
|
return _binary_disp(rh, mem, field, fixed_minor, FIRST_NAME(lv_fixed_minor), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _lvmergefailed_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _lvmergefailed_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1522,7 +1483,7 @@ static int _lvmergefailed_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
return _field_set_value(field, _str_unknown, &_reserved_number_undef_64);
|
return _field_set_value(field, _str_unknown, &_reserved_number_undef_64);
|
||||||
|
|
||||||
merge_failed = snap_percent == LVM_PERCENT_MERGE_FAILED;
|
merge_failed = snap_percent == LVM_PERCENT_MERGE_FAILED;
|
||||||
return _binary_disp(rh, mem, field, merge_failed, "merge failed", private);
|
return _binary_disp(rh, mem, field, merge_failed, FIRST_NAME(lv_merge_failed), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _lvsnapshotinvalid_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _lvsnapshotinvalid_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1537,7 +1498,7 @@ static int _lvsnapshotinvalid_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
return _field_set_value(field, _str_unknown, &_reserved_number_undef_64);
|
return _field_set_value(field, _str_unknown, &_reserved_number_undef_64);
|
||||||
|
|
||||||
snap_invalid = !lv_snapshot_percent(lv, &snap_percent) || snap_percent == DM_PERCENT_INVALID;
|
snap_invalid = !lv_snapshot_percent(lv, &snap_percent) || snap_percent == DM_PERCENT_INVALID;
|
||||||
return _binary_disp(rh, mem, field, snap_invalid, "snapshot invalid", private);
|
return _binary_disp(rh, mem, field, snap_invalid, FIRST_NAME(lv_snapshot_invalid), private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _lvsuspended_disp(struct dm_report *rh, struct dm_pool *mem,
|
static int _lvsuspended_disp(struct dm_report *rh, struct dm_pool *mem,
|
||||||
@ -1547,7 +1508,7 @@ static int _lvsuspended_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
const struct lv_with_info *lvi = (const struct lv_with_info *) data;
|
const struct lv_with_info *lvi = (const struct lv_with_info *) data;
|
||||||
|
|
||||||
if (lvi->info->exists)
|
if (lvi->info->exists)
|
||||||
return _binary_disp(rh, mem, field, lvi->info->suspended, "suspended", private);
|
return _binary_disp(rh, mem, field, lvi->info->suspended, FIRST_NAME(lv_suspended), private);
|
||||||
|
|
||||||
return _binary_undef_disp(rh, mem, field, private);
|
return _binary_undef_disp(rh, mem, field, private);
|
||||||
}
|
}
|
||||||
@ -1559,7 +1520,7 @@ static int _lvlivetable_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
const struct lv_with_info *lvi = (const struct lv_with_info *) data;
|
const struct lv_with_info *lvi = (const struct lv_with_info *) data;
|
||||||
|
|
||||||
if (lvi->info->exists)
|
if (lvi->info->exists)
|
||||||
return _binary_disp(rh, mem, field, lvi->info->live_table, "live table present", private);
|
return _binary_disp(rh, mem, field, lvi->info->live_table, FIRST_NAME(lv_live_table), private);
|
||||||
|
|
||||||
return _binary_undef_disp(rh, mem, field, private);
|
return _binary_undef_disp(rh, mem, field, private);
|
||||||
}
|
}
|
||||||
@ -1571,7 +1532,7 @@ static int _lvinactivetable_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
const struct lv_with_info *lvi = (const struct lv_with_info *) data;
|
const struct lv_with_info *lvi = (const struct lv_with_info *) data;
|
||||||
|
|
||||||
if (lvi->info->exists)
|
if (lvi->info->exists)
|
||||||
return _binary_disp(rh, mem, field, lvi->info->inactive_table, "inactive table present", private);
|
return _binary_disp(rh, mem, field, lvi->info->inactive_table, FIRST_NAME(lv_inactive_table), private);
|
||||||
|
|
||||||
return _binary_undef_disp(rh, mem, field, private);
|
return _binary_undef_disp(rh, mem, field, private);
|
||||||
}
|
}
|
||||||
@ -1583,7 +1544,7 @@ static int _lvdeviceopen_disp(struct dm_report *rh, struct dm_pool *mem,
|
|||||||
const struct lv_with_info *lvi = (const struct lv_with_info *) data;
|
const struct lv_with_info *lvi = (const struct lv_with_info *) data;
|
||||||
|
|
||||||
if (lvi->info->exists)
|
if (lvi->info->exists)
|
||||||
return _binary_disp(rh, mem, field, lvi->info->open_count, "open", private);
|
return _binary_disp(rh, mem, field, lvi->info->open_count, FIRST_NAME(lv_device_open), private);
|
||||||
|
|
||||||
return _binary_undef_disp(rh, mem, field, private);
|
return _binary_undef_disp(rh, mem, field, private);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user