master - report: 'whether' -> 'set if' in field description
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=b6ac8819f694d0...
Commit: b6ac8819f694d0b28fc592e89f01a8cf8e4f1802
Parent: ccab185aa7accd348409b9c0261bc3200570710d
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Wed Jul 9 13:41:25 2014 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Wed Jul 9 15:57:05 2014 +0200
report: 'whether' -> 'set if' in field description
---
lib/report/columns.h | 40 ++++++++++++++++++++--------------------
1 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/lib/report/columns.h b/lib/report/columns.h
index 21ca585..5013834 100644
--- a/lib/report/columns.h
+++ b/lib/report/columns.h
@@ -40,18 +40,18 @@ FIELD(LVS, lv, STR, "DMPath", lvid, 6, lvdmpath, lv_dm_path, "Internal device-ma
FIELD(LVS, lv, STR, "Parent", lvid, 6, lvparent, lv_parent, "For LVs that are components of another LV, the parent LV.", 0)
FIELD(LVS, lv, STR, "Attr", lvid, 4, lvstatus, lv_attr, "Various attributes - see man page.", 0)
FIELD(LVS, lv, STR, "Type", lvid, 10, lvvolumetype, lv_volume_type, "LV volume type.", 0)
-FIELD(LVS, lv, BIN, "InitImgSync", lvid, 10, lvinitialimagesync, lv_initial_image_sync, "Whether mirror/RAID images underwent initial resynchronization.", 0)
-FIELD(LVS, lv, BIN, "ImgSynced", lvid, 10, lvimagesynced, lv_image_synced, "Whether mirror/RAID image is synchronized.", 0)
-FIELD(LVS, lv, BIN, "Merging", lvid, 10, lvmerging, lv_merging, "Whether snapshot LV is being merged to origin.", 0)
-FIELD(LVS, lv, BIN, "Converting", lvid, 10, lvconverting, lv_converting, "Whether LV is being converted.", 0)
+FIELD(LVS, lv, BIN, "InitImgSync", lvid, 10, lvinitialimagesync, lv_initial_image_sync, "Set if mirror/RAID images underwent initial resynchronization.", 0)
+FIELD(LVS, lv, BIN, "ImgSynced", lvid, 10, lvimagesynced, lv_image_synced, "Set if mirror/RAID image is synchronized.", 0)
+FIELD(LVS, lv, BIN, "Merging", lvid, 10, lvmerging, lv_merging, "Set if snapshot LV is being merged to origin.", 0)
+FIELD(LVS, lv, BIN, "Converting", lvid, 10, lvconverting, lv_converting, "Set if LV is being converted.", 0)
FIELD(LVS, lv, STR, "AllocPol", lvid, 10, lvallocationpolicy, lv_allocation_policy, "LV allocation policy.", 0)
-FIELD(LVS, lv, BIN, "AllocLock", lvid, 10, lvallocationlocked, lv_allocation_locked, "Whether LV is locked against allocation changes.", 0)
-FIELD(LVS, lv, BIN, "FixMin", lvid, 10, lvfixedminor, lv_fixed_minor, "Whether LV has fixed minor number assigned.", 0)
-FIELD(LVS, lv, BIN, "MergeFailed", lvid, 15, lvmergefailed, lv_merge_failed, "Whether snapshot merge failed.", 0)
-FIELD(LVS, lv, BIN, "SnapInvalid", lvid, 15, lvsnapshotinvalid, lv_snapshot_invalid, "Whether snapshot LV is invalid.", 0)
+FIELD(LVS, lv, BIN, "AllocLock", lvid, 10, lvallocationlocked, lv_allocation_locked, "Set if LV is locked against allocation changes.", 0)
+FIELD(LVS, lv, BIN, "FixMin", lvid, 10, lvfixedminor, lv_fixed_minor, "Set if LV has fixed minor number assigned.", 0)
+FIELD(LVS, lv, BIN, "MergeFailed", lvid, 15, lvmergefailed, lv_merge_failed, "Set if snapshot merge failed.", 0)
+FIELD(LVS, lv, BIN, "SnapInvalid", lvid, 15, lvsnapshotinvalid, lv_snapshot_invalid, "Set if snapshot LV is invalid.", 0)
FIELD(LVS, lv, STR, "TargetType", lvid, 10, lvtargettype, lv_target_type, "Kernel target type the LV is related to.", 0)
FIELD(LVS, lv, STR, "Health", lvid, 15, lvhealthstatus, lv_health_status, "LV health status.", 0)
-FIELD(LVS, lv, BIN, "SkipAct", lvid, 15, lvskipactivation, lv_skip_activation, "Whether LV is skipped on activation.", 0)
+FIELD(LVS, lv, BIN, "SkipAct", lvid, 15, lvskipactivation, lv_skip_activation, "Set if LV is skipped on activation.", 0)
FIELD(LVS, lv, STR, "Active", lvid, 6, lvactive, lv_active, "Active state of the LV.", 0)
FIELD(LVS, lv, NUM, "Maj", major, 3, int32, lv_major, "Persistent major number or -1 if not persistent.", 0)
FIELD(LVS, lv, NUM, "Min", minor, 3, int32, lv_minor, "Persistent minor number or -1 if not persistent.", 0)
@@ -87,10 +87,10 @@ FIELD(LVSINFO, lv, NUM, "KMaj", lvid, 4, lvkmaj, lv_kernel_major, "Currently ass
FIELD(LVSINFO, lv, NUM, "KMin", lvid, 4, lvkmin, lv_kernel_minor, "Currently assigned minor number or -1 if LV is not active.", 0)
FIELD(LVSINFO, lv, SIZ, "KRahead", lvid, 7, lvkreadahead, lv_kernel_read_ahead, "Currently-in-use read ahead setting in current units.", 0)
FIELD(LVSINFO, lv, STR, "LPerms", lvid, 8, lvpermissions, lv_permissions, "LV permissions.", 0)
-FIELD(LVSINFO, lv, BIN, "Suspended", lvid, 10, lvsuspended, lv_suspended, "Whether LV is suspended.", 0)
-FIELD(LVSINFO, lv, BIN, "LiveTable", lvid, 20, lvlivetable, lv_live_table, "Whether LV has live table present.", 0)
-FIELD(LVSINFO, lv, BIN, "InactiveTable", lvid, 20, lvinactivetable, lv_inactive_table, "Whether LV has inactive table present.", 0)
-FIELD(LVSINFO, lv, BIN, "DevOpen", lvid, 10, lvdeviceopen, lv_device_open, "Whether LV device is open.", 0)
+FIELD(LVSINFO, lv, BIN, "Suspended", lvid, 10, lvsuspended, lv_suspended, "Set if LV is suspended.", 0)
+FIELD(LVSINFO, lv, BIN, "LiveTable", lvid, 20, lvlivetable, lv_live_table, "Set if LV has live table present.", 0)
+FIELD(LVSINFO, lv, BIN, "InactiveTable", lvid, 20, lvinactivetable, lv_inactive_table, "Set if LV has inactive table present.", 0)
+FIELD(LVSINFO, lv, BIN, "DevOpen", lvid, 10, lvdeviceopen, lv_device_open, "Set if LV device is open.", 0)
FIELD(LABEL, label, STR, "Fmt", type, 3, pvfmt, pv_fmt, "Type of metadata.", 0)
FIELD(LABEL, label, STR, "PV UUID", type, 38, pvuuid, pv_uuid, "Unique identifier.", 0)
@@ -104,9 +104,9 @@ FIELD(PVS, pv, SIZ, "PSize", id, 5, pvsize, pv_size, "Size of PV in current unit
FIELD(PVS, pv, SIZ, "PFree", id, 5, pvfree, pv_free, "Total amount of unallocated space in current units.", 0)
FIELD(PVS, pv, SIZ, "Used", id, 4, pvused, pv_used, "Total amount of allocated space in current units.", 0)
FIELD(PVS, pv, STR, "Attr", id, 4, pvstatus, pv_attr, "Various attributes - see man page.", 0)
-FIELD(PVS, pv, BIN, "Allocatable", id, 10, pvallocatable, pv_allocatable, "Whether this device can be used for allocation.", 0)
-FIELD(PVS, pv, BIN, "Exported", id, 10, pvexported, pv_exported, "Whether this device is exported.", 0)
-FIELD(PVS, pv, BIN, "Missing", id, 10, pvmissing, pv_missing, "Whether this device is missing in system.", 0)
+FIELD(PVS, pv, BIN, "Allocatable", id, 10, pvallocatable, pv_allocatable, "Set if this device can be used for allocation.", 0)
+FIELD(PVS, pv, BIN, "Exported", id, 10, pvexported, pv_exported, "Set if this device is exported.", 0)
+FIELD(PVS, pv, BIN, "Missing", id, 10, pvmissing, pv_missing, "Set if this device is missing in system.", 0)
FIELD(PVS, pv, NUM, "PE", pe_count, 3, uint32, pv_pe_count, "Total number of Physical Extents.", 0)
FIELD(PVS, pv, NUM, "Alloc", pe_alloc_count, 5, uint32, pv_pe_alloc_count, "Total number of allocated Physical Extents.", 0)
FIELD(PVS, pv, STR_LIST, "PV Tags", tags, 7, tags, pv_tags, "Tags, if any.", 0)
@@ -120,11 +120,11 @@ FIELD(VGS, vg, STR, "VG UUID", id, 38, uuid, vg_uuid, "Unique identifier.", 0)
FIELD(VGS, vg, STR, "VG", name, 4, string, vg_name, "Name.", 0)
FIELD(VGS, vg, STR, "Attr", cmd, 5, vgstatus, vg_attr, "Various attributes - see man page.", 0)
FIELD(VGS, vg, STR, "VPerms", cmd, 10, vgpermissions, vg_permissions, "VG permissions.", 0)
-FIELD(VGS, vg, BIN, "Extendable", cmd, 10, vgextendable, vg_extendable, "Whether VG is extendable.", 0)
-FIELD(VGS, vg, BIN, "Exported", cmd, 10, vgexported, vg_exported, "Whether VG is exported.", 0)
-FIELD(VGS, vg, BIN, "Partial", cmd, 10, vgpartial, vg_partial, "Whether VG is partial.", 0)
+FIELD(VGS, vg, BIN, "Extendable", cmd, 10, vgextendable, vg_extendable, "Set if VG is extendable.", 0)
+FIELD(VGS, vg, BIN, "Exported", cmd, 10, vgexported, vg_exported, "Set if VG is exported.", 0)
+FIELD(VGS, vg, BIN, "Partial", cmd, 10, vgpartial, vg_partial, "Set if VG is partial.", 0)
FIELD(VGS, vg, STR, "AllocPol", cmd, 10, vgallocationpolicy, vg_allocation_policy, "VG allocation policy.", 0)
-FIELD(VGS, vg, BIN, "Clustered", cmd, 10, vgclustered, vg_clustered, "Whether VG is clustered.", 0)
+FIELD(VGS, vg, BIN, "Clustered", cmd, 10, vgclustered, vg_clustered, "Set if VG is clustered.", 0)
FIELD(VGS, vg, SIZ, "VSize", cmd, 5, vgsize, vg_size, "Total size of VG in current units.", 0)
FIELD(VGS, vg, NUM, "VFree", cmd, 5, vgfree, vg_free, "Total amount of free space in current units.", 0)
FIELD(VGS, vg, STR, "SYS ID", system_id, 6, string, vg_sysid, "System ID indicating when and where it was created.", 0)
9 years, 9 months
master - cleanup: use macros for definition of reporting/selection reserved values
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=ccab185aa7accd...
Commit: ccab185aa7accd348409b9c0261bc3200570710d
Parent: 1a05862732d8e809f888313c546e97381c4e1f49
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Jul 8 12:40:45 2014 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Wed Jul 9 15:55:54 2014 +0200
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.
---
lib/report/columns.h | 4 +
lib/report/report.c | 329 ++++++++++++++++++++++----------------------------
2 files changed, 149 insertions(+), 184 deletions(-)
diff --git a/lib/report/columns.h b/lib/report/columns.h
index 2769c2d..21ca585 100644
--- a/lib/report/columns.h
+++ b/lib/report/columns.h
@@ -27,6 +27,10 @@
* 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* */
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)
diff --git a/lib/report/report.c b/lib/report/report.c
index 4ec75aa..adcd2be 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -41,159 +41,118 @@ struct lvm_report_object {
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,
enum {
#include "columns.h"
};
#undef FIELD
-
static const uint64_t _zero64 = UINT64_C(0);
static const uint64_t _one64 = UINT64_C(1);
-static const char * const _str_zero = "0";
-static const char * const _str_one = "1";
+static const char const _str_zero[] = "0";
+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!
* So when stored in the struct, the _reserved_number_undef_32 is actually
* equal to _reserved_number_undef_64.
*/
static const int32_t _reserved_number_undef_32 = INT32_C(-1);
-/* Per-field reserved values. */
-static const struct dm_report_field_reserved_value _reserved_pv_allocatable = {field_pv_allocatable, &_one64};
-static const struct dm_report_field_reserved_value _reserved_pv_exported = {field_pv_exported, &_one64};
-static const struct dm_report_field_reserved_value _reserved_pv_missing = {field_pv_missing, &_one64};
-static const struct dm_report_field_reserved_value _reserved_vg_extendable = {field_vg_extendable, &_one64};
-static const struct dm_report_field_reserved_value _reserved_vg_exported = {field_vg_exported, &_one64};
-static const struct dm_report_field_reserved_value _reserved_vg_partial = {field_vg_partial, &_one64};
-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};
-
-/* Per-field reserved names. */
-static const char *_reserved_pv_allocatable_names[]={"allocatable", NULL};
-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. */
+#define FIRST_NAME(id) _reserved_ ## id ## _names[0]
+#define TYPE_RESERVED_VALUE(type, id, value, ...) \
+ static const char *_reserved_ ## id ## _names[] = { __VA_ARGS__, NULL}; \
+ static const type _reserved_ ## id = value;
+#define FIELD_RESERVED_VALUE(field_id, id, value, ...) \
+ static const char *_reserved_ ## id ## _names[] = { __VA_ARGS__ , NULL}; \
+ static const struct dm_report_field_reserved_value _reserved_ ## id = {field_ ## field_id, &value};
+
+/*
+ * 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")
+
+#define TYPE_RESERVED_VALUE_REG(type, id, description) {DM_REPORT_FIELD_TYPE_ ## type, &_reserved_ ## id, _reserved_ ## id ## _names, description},
+#define FIELD_RESERVED_VALUE_REG(id, description) {DM_REPORT_FIELD_TYPE_NONE, &_reserved_ ## id, _reserved_ ## id ## _names, description},
+
+/*
+ * 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[] = {
- {DM_REPORT_FIELD_TYPE_NUMBER, &_reserved_number_undef_64, _reserved_number_undef_64_names,
- "Reserved value for undefined numeric value."},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_pv_allocatable, _reserved_pv_allocatable_names,
- "pv_allocatable reserved values"},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_pv_exported, _reserved_pv_exported_names,
- "pv_exported reserved values"},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_pv_missing, _reserved_pv_missing_names,
- "pv_missing reserved values"},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_extendable, _reserved_vg_extendable_names,
- "vg_extendable reserved values"},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_exported, _reserved_vg_exported_names,
- "vg_exported reserved values"},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_partial, _reserved_vg_partial_names,
- "vg_partial reserved values"},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_clustered, _reserved_vg_clustered_names,
- "vg_clustered reserved values"},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_permissions_rw, _reserved_vg_permissions_rw_names,
- "vg_permissions reserved values (writeable)"},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_permissions_r, _reserved_vg_permissions_r_names,
- "vg_permissions reserved values (read-only)"},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_mda_copies, _reserved_vg_mda_copies_names,
- "vg_mda_copies reserved values (unmanaged)"},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_initial_image_sync, _reserved_lv_initial_image_sync_names,
- "lv_initial_image_sync reserved values"},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_image_synced, _reserved_lv_image_synced_names,
- "lv_image_synced reserved values"},
- {DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_merging, _reserved_lv_merging_names,
- "lv_merging reserved values"},
- {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)"},
+ TYPE_RESERVED_VALUE_REG(NUMBER, number_undef_64, "Reserved value for undefined numeric value.")
+ FIELD_RESERVED_VALUE_REG(pv_allocatable, "pv_allocatable reserved values")
+ FIELD_RESERVED_VALUE_REG(pv_exported, "pv_exported reserved values")
+ FIELD_RESERVED_VALUE_REG(pv_missing, "pv_missing reserved values")
+ FIELD_RESERVED_VALUE_REG(vg_extendable, "vg_extendable reserved values")
+ FIELD_RESERVED_VALUE_REG(vg_exported, "vg_exported reserved values")
+ FIELD_RESERVED_VALUE_REG(vg_partial, "vg_partial reserved values")
+ FIELD_RESERVED_VALUE_REG(vg_clustered, "vg_clustered reserved values")
+ FIELD_RESERVED_VALUE_REG(vg_permissions_rw, "vg_permissions reserved values (writeable)")
+ FIELD_RESERVED_VALUE_REG(vg_permissions_r, "vg_permissions reserved values (read-only)")
+ FIELD_RESERVED_VALUE_REG(vg_mda_copies, "vg_mda_copies reserved values (unmanaged)")
+ FIELD_RESERVED_VALUE_REG(lv_initial_image_sync, "lv_initial_image_sync reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_image_synced, "lv_image_synced reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_merging, "lv_merging reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_converting, "lv_converting reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_allocation_locked, "lv_allocation_locked reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_fixed_minor, "lv_fixed_minor reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_merge_failed, "lv_merge_failed reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_snapshot_invalid, "lv_snapshot_invalid reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_suspended, "lv_suspended reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_live_table, "lv_live_table reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_inactive_table, "lv_inactive_table reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_device_open, "lv_device_open reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_skip_activation, "lv_inactive_table reserved values")
+ FIELD_RESERVED_VALUE_REG(lv_permissions_rw, "lv_permissions reserved values (writeable)")
+ FIELD_RESERVED_VALUE_REG(lv_permissions_r, "lv_permissions reserved values (read-only)")
+ FIELD_RESERVED_VALUE_REG(lv_permissions_r_override, "lv_permissions reserved values (read-only-override)")
+ FIELD_RESERVED_VALUE_REG(lv_read_ahead, "lv_read_ahead reserved values (auto)")
{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)
{
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
*/
+
+/*
+ * 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)),
struct dm_report_field *field,
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 */
-/*
- * 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,
struct dm_report_field *field,
const void *data, void *private)
{
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,
@@ -1338,7 +1298,7 @@ static int _pvexported_disp(struct dm_report *rh, struct dm_pool *mem,
const void *data, void *private)
{
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,
@@ -1346,14 +1306,15 @@ static int _pvmissing_disp(struct dm_report *rh, struct dm_pool *mem,
const void *data, void *private)
{
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,
struct dm_report_field *field,
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);
}
@@ -1362,7 +1323,7 @@ static int _vgextendable_disp(struct dm_report *rh, struct dm_pool *mem,
const void *data, void *private)
{
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,
@@ -1370,7 +1331,7 @@ static int _vgexported_disp(struct dm_report *rh, struct dm_pool *mem,
const void *data, void *private)
{
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,
@@ -1378,7 +1339,7 @@ static int _vgpartial_disp(struct dm_report *rh, struct dm_pool *mem,
const void *data, void *private)
{
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,
@@ -1394,7 +1355,7 @@ static int _vgclustered_disp(struct dm_report *rh, struct dm_pool *mem,
const void *data, void *private)
{
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,
@@ -1417,7 +1378,7 @@ static int _lvinitialimagesync_disp(struct dm_report *rh, struct dm_pool *mem,
else
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,
@@ -1434,7 +1395,7 @@ static int _lvimagesynced_disp(struct dm_report *rh, struct dm_pool *mem,
else
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,
@@ -1453,7 +1414,7 @@ static int _lvmerging_disp(struct dm_report *rh, struct dm_pool *mem,
else
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,
@@ -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 & LVM_WRITE) {
if (lvi->info->read_only)
- perms = "read-only-override";
+ perms = FIRST_NAME(lv_permissions_r_override);
else
- perms = "writeable";
+ perms = FIRST_NAME(lv_permissions_rw);
} else if (lvi->lv->status & LVM_READ)
- perms = "read-only";
+ perms = FIRST_NAME(lv_permissions_r);
else
perms = _str_unknown;
}
@@ -1499,7 +1460,7 @@ static int _lvallocationlocked_disp(struct dm_report *rh, struct dm_pool *mem,
const void *data, void *private)
{
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,
@@ -1507,7 +1468,7 @@ static int _lvfixedminor_disp(struct dm_report *rh, struct dm_pool *mem,
const void *data, void *private)
{
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,
@@ -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);
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,
@@ -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);
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,
@@ -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;
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);
}
@@ -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;
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);
}
@@ -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;
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);
}
@@ -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;
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);
}
9 years, 9 months
master - report: report unknown/-1 for binary fields with unknown value
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=1a05862732d8e8...
Commit: 1a05862732d8e809f888313c546e97381c4e1f49
Parent: f76879ba440aa93f2e237335fe2cca6951a636bf
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Jul 8 12:15:14 2014 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Jul 8 16:16:02 2014 +0200
report: report unknown/-1 for binary fields with unknown value
Also respect --binary arg and/or report/binary_values_as_numeric
when displaying unknown values. If textual form is used, use "unknown",
if numeric value is used, use "-1" (which we already use to denote
unknown numeric values in other reports like lv_kernel_major and
lv_kernel_minor).
---
lib/report/report.c | 20 ++++++++++++++++----
1 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/lib/report/report.c b/lib/report/report.c
index 7cc3599..4ec75aa 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -192,6 +192,7 @@ static const struct dm_report_reserved_value _report_reserved_values[] = {
};
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)
{
@@ -1313,6 +1314,17 @@ static int _binary_disp(struct dm_report *rh, struct dm_pool *mem __attribute__(
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,
struct dm_report_field *field,
const void *data, void *private)
@@ -1537,7 +1549,7 @@ static int _lvsuspended_disp(struct dm_report *rh, struct dm_pool *mem,
if (lvi->info->exists)
return _binary_disp(rh, mem, field, lvi->info->suspended, "suspended", private);
- return _field_set_value(field, _str_unknown, &_reserved_number_undef_64);
+ return _binary_undef_disp(rh, mem, field, private);
}
static int _lvlivetable_disp(struct dm_report *rh, struct dm_pool *mem,
@@ -1549,7 +1561,7 @@ static int _lvlivetable_disp(struct dm_report *rh, struct dm_pool *mem,
if (lvi->info->exists)
return _binary_disp(rh, mem, field, lvi->info->live_table, "live table present", private);
- return _field_set_value(field, _str_unknown, &_reserved_number_undef_64);
+ return _binary_undef_disp(rh, mem, field, private);
}
static int _lvinactivetable_disp(struct dm_report *rh, struct dm_pool *mem,
@@ -1561,7 +1573,7 @@ static int _lvinactivetable_disp(struct dm_report *rh, struct dm_pool *mem,
if (lvi->info->exists)
return _binary_disp(rh, mem, field, lvi->info->inactive_table, "inactive table present", private);
- return _field_set_value(field, _str_unknown, &_reserved_number_undef_64);
+ return _binary_undef_disp(rh, mem, field, private);
}
static int _lvdeviceopen_disp(struct dm_report *rh, struct dm_pool *mem,
@@ -1573,7 +1585,7 @@ static int _lvdeviceopen_disp(struct dm_report *rh, struct dm_pool *mem,
if (lvi->info->exists)
return _binary_disp(rh, mem, field, lvi->info->open_count, "open", private);
- return _field_set_value(field, _str_unknown, &_reserved_number_undef_64);
+ return _binary_undef_disp(rh, mem, field, private);
}
static int _lvtargettype_disp(struct dm_report *rh, struct dm_pool *mem,
9 years, 9 months
master - conf: comment out devices/preferred_names and filter setting
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=f76879ba440aa9...
Commit: f76879ba440aa93f2e237335fe2cca6951a636bf
Parent: f6001465efe064611920b30f5b913c1d09004ded
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Jul 8 10:22:59 2014 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Jul 8 10:22:59 2014 +0200
conf: comment out devices/preferred_names and filter setting
This avoids creating void matchers which have no effect anyway and
they just use resources. Also, it makes lvm dumpconfig --type diff
to mark these settings properly as not being different from defaults
(where by default, devices/preferred_names as well as devices/filter
are void).
Also, add a few comments about builtin rules used to select device
alias in case preferred_names is not defined or it doesn't match
any of device aliases.
---
conf/example.conf.in | 23 +++++++++++++++++++++--
1 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/conf/example.conf.in b/conf/example.conf.in
index 162770a..e1afbb6 100644
--- a/conf/example.conf.in
+++ b/conf/example.conf.in
@@ -53,11 +53,30 @@ devices {
# same block device and the tools need to display a name for device,
# all the pathnames are matched against each item in the following
# list of regular expressions in turn and the first match is used.
- preferred_names = [ ]
+
+ # By default no preferred names are defined.
+ # preferred_names = [ ]
# Try to avoid using undescriptive /dev/dm-N names, if present.
# preferred_names = [ "^/dev/mpath/", "^/dev/mapper/mpath", "^/dev/[hs]d" ]
+ # In case no prefererred name matches or if preferred_names are not
+ # defined at all, builtin rules are used to determine the preference.
+ #
+ # The first builtin rule checks path prefixes and it gives preference
+ # based on this ordering (where "dev" depends on devices/dev setting):
+ # /dev/mapper > /dev/disk > /dev/dm-* > /dev/block
+ #
+ # If the ordering above cannot be applied, the path with fewer slashes
+ # gets preference then.
+ #
+ # If the number of slashes is the same, a symlink gets preference.
+ #
+ # Finally, if all the rules mentioned above are not applicable,
+ # lexicographical order is used over paths and the smallest one
+ # of all gets preference.
+
+
# A filter that tells LVM2 to only use a restricted set of devices.
# The filter consists of an array of regular expressions. These
# expressions can be delimited by a character of your choice, and
@@ -84,7 +103,7 @@ devices {
# lvmetad is used" comment that is attached to global/use_lvmetad setting.
# By default we accept every block device:
- filter = [ "a/.*/" ]
+ # filter = [ "a/.*/" ]
# Exclude the cdrom drive
# filter = [ "r|/dev/cdrom|" ]
9 years, 9 months
master - lv_manip: pool-metadata-spare is just a spare LV, not tightly bound to thin or cache
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=f6001465efe064...
Commit: f6001465efe064611920b30f5b913c1d09004ded
Parent: 4b65d7ec72869ba7e70a1c93567ef0f271ed395e
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Mon Jul 7 17:02:06 2014 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Mon Jul 7 17:02:06 2014 +0200
lv_manip: pool-metadata-spare is just a spare LV, not tightly bound to thin or cache
---
lib/metadata/lv_manip.c | 10 +++-------
1 files changed, 3 insertions(+), 7 deletions(-)
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index fc98b2a..c55b31f 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -94,12 +94,11 @@ typedef enum {
LV_TYPE_THIN_POOL,
LV_TYPE_THIN_POOL_DATA,
LV_TYPE_THIN_POOL_METADATA,
- LV_TYPE_THIN_POOL_METADATA_SPARE,
LV_TYPE_CACHE,
LV_TYPE_CACHE_POOL,
LV_TYPE_CACHE_POOL_DATA,
LV_TYPE_CACHE_POOL_METADATA,
- LV_TYPE_CACHE_POOL_METADATA_SPARE,
+ LV_TYPE_POOL_METADATA_SPARE,
LV_TYPE_VIRTUAL,
LV_TYPE_RAID,
LV_TYPE_RAID_IMAGE,
@@ -122,12 +121,11 @@ static const char *_lv_type_names[] = {
[LV_TYPE_THIN_POOL] = "thin-pool",
[LV_TYPE_THIN_POOL_DATA] = "thin-pool-data",
[LV_TYPE_THIN_POOL_METADATA] = "thin-pool-metadata",
- [LV_TYPE_THIN_POOL_METADATA_SPARE] = "thin-pool-metadata-spare",
[LV_TYPE_CACHE] = "cache",
[LV_TYPE_CACHE_POOL] = "cache-pool",
[LV_TYPE_CACHE_POOL_DATA] = "cache-pool-data",
[LV_TYPE_CACHE_POOL_METADATA] = "cache-pool-metadata",
- [LV_TYPE_CACHE_POOL_METADATA_SPARE] = "cache-pool-metadata-spare",
+ [LV_TYPE_POOL_METADATA_SPARE] = "pool-metadata-spare",
[LV_TYPE_VIRTUAL] = "virtual",
[LV_TYPE_RAID] = "raid",
[LV_TYPE_RAID_IMAGE] = "raid-image",
@@ -161,7 +159,7 @@ static lv_type_t _get_lv_type(const struct logical_volume *lv)
else if (lv_is_thin_pool_metadata(lv))
type = LV_TYPE_THIN_POOL_METADATA;
else if (lv_is_pool_metadata_spare(lv))
- type = LV_TYPE_THIN_POOL_METADATA_SPARE;
+ type = LV_TYPE_POOL_METADATA_SPARE;
else if (lv_is_cache(lv))
type = LV_TYPE_CACHE;
else if (lv_is_cache_pool(lv))
@@ -170,8 +168,6 @@ static lv_type_t _get_lv_type(const struct logical_volume *lv)
type = LV_TYPE_CACHE_POOL_DATA;
else if (lv_is_cache_pool_metadata(lv))
type = LV_TYPE_CACHE_POOL_METADATA;
- else if (lv_is_pool_metadata_spare(lv))
- type = LV_TYPE_CACHE_POOL_METADATA_SPARE;
else if (lv_is_virtual(lv))
type = LV_TYPE_VIRTUAL;
else if (lv_is_raid(lv))
9 years, 9 months
master - WHATS_NEW: commits a473435..7021c8f1
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=4b65d7ec72869b...
Commit: 4b65d7ec72869ba7e70a1c93567ef0f271ed395e
Parent: 9e1c4a3818fa2af76b7b7890939c9e7ec9cb6818
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Mon Jul 7 16:52:43 2014 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Mon Jul 7 16:52:43 2014 +0200
WHATS_NEW: commits a473435..7021c8f1
---
WHATS_NEW | 5 +++++
WHATS_NEW_DM | 1 +
2 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index ab36cb3..d4649e4 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,10 @@
Version 2.02.108 -
=================================
+ Recognize "auto"/"unmanaged" values in selection for appropriate fields only.
+ Add report/binary_values_as_numeric lvm.conf option for binary values as 0/1.
+ Add --binary arg to pvs,vgs,lvs and {pv,vg,lv}display -C for 0/1 on reports.
+ Add separate reporting fields for each each {pv,vg,lv}_attr bit.
+ Separate LV device status reporting fields out of LV fields.
Fix regression causing PVs not in VGs to be marked as allocatable (2.02.59).
Fix VG component of lvid in vgsplit/vgmerge and check in vg_validate.
Add lv_full_name, lv_parent and lv_dm_path fields to reports.
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index f25fa92..852d313 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
Version 1.02.87 -
================================
+ Add dm_report_field_reserved_value for per-field reserved value definition.
Version 1.02.86 - 23rd June 2014
================================
9 years, 9 months
master - report: addendum for previous commit
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=9e1c4a3818fa2a...
Commit: 9e1c4a3818fa2af76b7b7890939c9e7ec9cb6818
Parent: 83b55c2dfba12db95fa5247039470278741372ab
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Mon Jul 7 16:28:13 2014 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Mon Jul 7 16:28:13 2014 +0200
report: addendum for previous commit
Really call lv_info only if needed!
---
tools/reporter.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/tools/reporter.c b/tools/reporter.c
index 5e9fb24..0780283 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -91,7 +91,7 @@ static int _do_pvsegs_sub_single(struct cmd_context *cmd,
{
int ret = ECMD_PROCESSED;
struct lv_segment *seg = pvseg->lvseg;
- struct lvinfo lvinfo = {.exists = 0};
+ struct lvinfo lvinfo;
struct volume_group _free_vg = {
.cmd = cmd,
@@ -136,7 +136,8 @@ static int _do_pvsegs_sub_single(struct cmd_context *cmd,
dm_list_init(&_free_logical_volume.segs_using_this_lv);
dm_list_init(&_free_logical_volume.snapshot_segs);
- if (seg && !lv_info(cmd, seg->lv, 0, &lvinfo, 1, 1)) {
+ lvinfo.exists = 0;
+ if (seg && lv_info_needed && !lv_info(cmd, seg->lv, 0, &lvinfo, 1, 1)) {
ret = ECMD_FAILED;
goto_out;
}
9 years, 9 months
master - report: fix segfault while reporting PV/LV segment fields together with LV fields needeing device status (LVSINFO)
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=83b55c2dfba12d...
Commit: 83b55c2dfba12db95fa5247039470278741372ab
Parent: 6dc7b783c80c6834aa724df49b5d47b9b5601506
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Mon Jul 7 15:54:13 2014 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Mon Jul 7 15:54:13 2014 +0200
report: fix segfault while reporting PV/LV segment fields together with LV fields needeing device status (LVSINFO)
There was missing lv_info call for situations where there were
mixed PV/LV segment fields together with LVSINFO fields which
require extra lv_info call for LV device status. This ended up
with NULL lvinfo passed to the field reporting functions, hence
the segfault.
---
tools/reporter.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 70 insertions(+), 9 deletions(-)
diff --git a/tools/reporter.c b/tools/reporter.c
index 524d6c4..5e9fb24 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -70,12 +70,28 @@ static int _segs_single(struct cmd_context *cmd __attribute__((unused)),
return ECMD_PROCESSED;
}
-static int _pvsegs_sub_single(struct cmd_context *cmd,
- struct volume_group *vg,
- struct pv_segment *pvseg, void *handle)
+
+static int _segs_with_lv_info_single(struct cmd_context *cmd __attribute__((unused)),
+ struct lv_segment *seg, void *handle)
+{
+ struct lvinfo lvinfo;
+
+ if (!lv_info(cmd, seg->lv, 0, &lvinfo, 1, 1) ||
+ !report_object(handle, seg->lv->vg, seg->lv, NULL, seg, NULL, &lvinfo, NULL))
+ return_ECMD_FAILED;
+
+ return ECMD_PROCESSED;
+}
+
+static int _do_pvsegs_sub_single(struct cmd_context *cmd,
+ struct volume_group *vg,
+ struct pv_segment *pvseg,
+ int lv_info_needed,
+ void *handle)
{
int ret = ECMD_PROCESSED;
struct lv_segment *seg = pvseg->lvseg;
+ struct lvinfo lvinfo = {.exists = 0};
struct volume_group _free_vg = {
.cmd = cmd,
@@ -120,8 +136,13 @@ static int _pvsegs_sub_single(struct cmd_context *cmd,
dm_list_init(&_free_logical_volume.segs_using_this_lv);
dm_list_init(&_free_logical_volume.snapshot_segs);
+ if (seg && !lv_info(cmd, seg->lv, 0, &lvinfo, 1, 1)) {
+ ret = ECMD_FAILED;
+ goto_out;
+ }
+
if (!report_object(handle, vg, seg ? seg->lv : &_free_logical_volume, pvseg->pv,
- seg ? : &_free_lv_segment, pvseg, NULL, pv_label(pvseg->pv))) {
+ seg ? : &_free_lv_segment, pvseg, &lvinfo, pv_label(pvseg->pv))) {
ret = ECMD_FAILED;
goto_out;
}
@@ -130,6 +151,21 @@ static int _pvsegs_sub_single(struct cmd_context *cmd,
return ret;
}
+static int _pvsegs_sub_single(struct cmd_context *cmd,
+ struct volume_group *vg,
+ struct pv_segment *pvseg, void *handle)
+{
+ return _do_pvsegs_sub_single(cmd, vg, pvseg, 0, handle);
+}
+
+static int _pvsegs_with_lv_info_sub_single(struct cmd_context *cmd,
+ struct volume_group *vg,
+ struct pv_segment *pvseg,
+ void *handle)
+{
+ return _do_pvsegs_sub_single(cmd, vg, pvseg, 1, handle);
+}
+
static int _lvsegs_single(struct cmd_context *cmd, struct logical_volume *lv,
void *handle)
{
@@ -139,6 +175,16 @@ static int _lvsegs_single(struct cmd_context *cmd, struct logical_volume *lv,
return process_each_segment_in_lv(cmd, lv, handle, _segs_single);
}
+static int _lvsegs_with_lv_info_single(struct cmd_context *cmd,
+ struct logical_volume *lv,
+ void *handle)
+{
+ if (!arg_count(cmd, all_ARG) && !lv_is_visible(lv))
+ return ECMD_PROCESSED;
+
+ return process_each_segment_in_lv(cmd, lv, handle, _segs_with_lv_info_single);
+}
+
static int _pvsegs_single(struct cmd_context *cmd, struct volume_group *vg,
struct physical_volume *pv, void *handle)
{
@@ -146,6 +192,15 @@ static int _pvsegs_single(struct cmd_context *cmd, struct volume_group *vg,
_pvsegs_sub_single);
}
+static int _pvsegs_with_lv_info_single(struct cmd_context *cmd,
+ struct volume_group *vg,
+ struct physical_volume *pv,
+ void *handle)
+{
+ return process_each_segment_in_pv(cmd, vg, pv, handle,
+ _pvsegs_with_lv_info_sub_single);
+}
+
static int _pvs_single(struct cmd_context *cmd, struct volume_group *vg,
struct physical_volume *pv, void *handle)
{
@@ -253,7 +308,7 @@ static int _report(struct cmd_context *cmd, int argc, char **argv,
int r = ECMD_PROCESSED;
int aligned, buffered, headings, field_prefixes, quoted;
int columns_as_rows;
- unsigned args_are_pvs;
+ unsigned args_are_pvs, lv_info_needed;
aligned = find_config_tree_bool(cmd, report_aligned_CFG, NULL);
buffered = find_config_tree_bool(cmd, report_buffered_CFG, NULL);
@@ -371,12 +426,15 @@ static int _report(struct cmd_context *cmd, int argc, char **argv,
columns_as_rows, selection)))
return_ECMD_FAILED;
+ /* Do we need lv_info to be called for LV device status? */
+ lv_info_needed = (report_type & LVSINFO) ? 1 : 0;
+
/* Ensure options selected are compatible */
if (report_type & SEGS)
report_type |= LVS;
if (report_type & PVSEGS)
report_type |= PVS;
- if ((report_type & LVS) && (report_type & (PVS | LABEL)) && !args_are_pvs) {
+ if ((report_type & (LVS | LVSINFO)) && (report_type & (PVS | LABEL)) && !args_are_pvs) {
log_error("Can't report LV and PV fields at the same time");
dm_report_free(report_handle);
return ECMD_FAILED;
@@ -384,7 +442,7 @@ static int _report(struct cmd_context *cmd, int argc, char **argv,
/* Change report type if fields specified makes this necessary */
if ((report_type & PVSEGS) ||
- ((report_type & (PVS | LABEL)) && (report_type & LVS)))
+ ((report_type & (PVS | LABEL)) && (report_type & (LVS | LVSINFO))))
report_type = PVSEGS;
else if ((report_type & LABEL) && (report_type & VGS))
report_type = PVS;
@@ -427,12 +485,15 @@ static int _report(struct cmd_context *cmd, int argc, char **argv,
break;
case SEGS:
r = process_each_lv(cmd, argc, argv, 0, report_handle,
- &_lvsegs_single);
+ lv_info_needed ? &_lvsegs_with_lv_info_single
+ : &_lvsegs_single);
break;
case PVSEGS:
if (args_are_pvs)
r = process_each_pv(cmd, argc, argv, NULL, 0,
- 0, report_handle, &_pvsegs_single);
+ 0, report_handle,
+ lv_info_needed ? &_pvsegs_with_lv_info_single
+ : &_pvsegs_single);
else
r = process_each_vg(cmd, argc, argv, 0,
report_handle, &_pvsegs_in_vg);
9 years, 9 months
master - metadata: fix regression causing PVs not in VGs to be marked as allocatable
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=6dc7b783c80c68...
Commit: 6dc7b783c80c6834aa724df49b5d47b9b5601506
Parent: 7021c8f1a483d91a58ce2abc52583e73e2910da7
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Mon Jul 7 13:58:42 2014 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Mon Jul 7 14:07:21 2014 +0200
metadata: fix regression causing PVs not in VGs to be marked as allocatable
If the PV is not yet in a VG, it's not allocatable.
A regression introduced by commit 0283c439ec2dc195184a12f86a060b271476aae0
(_pv_create) and later commit a7ca10151795b4c4ed6fa4bf7d3d6b1a687430b0
(pv_read).
---
WHATS_NEW | 1 +
lib/metadata/metadata.c | 1 -
test/shell/pvchange-usage.sh | 11 +++++++++++
3 files changed, 12 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 5a1e214..ab36cb3 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.108 -
=================================
+ Fix regression causing PVs not in VGs to be marked as allocatable (2.02.59).
Fix VG component of lvid in vgsplit/vgmerge and check in vg_validate.
Add lv_full_name, lv_parent and lv_dm_path fields to reports.
Change lv_path field to suppress devices that never appear in /dev/vg.
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 50d44ec..2d69714 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -1599,7 +1599,6 @@ static struct physical_volume *_alloc_pv(struct dm_pool *mem, struct device *dev
}
pv->dev = dev;
- pv->status = ALLOCATABLE_PV;
dm_list_init(&pv->tags);
dm_list_init(&pv->segments);
diff --git a/test/shell/pvchange-usage.sh b/test/shell/pvchange-usage.sh
index ac63aec..72ab16b 100644
--- a/test/shell/pvchange-usage.sh
+++ b/test/shell/pvchange-usage.sh
@@ -19,6 +19,17 @@ check_changed_uuid_() {
aux prepare_pvs 4
+# check 'allocatable' pv attribute
+pvcreate $dev1
+check pv_field "$dev1" pv_attr ---
+vgcreate $vg1 "$dev1"
+check pv_field "$dev1" pv_attr a--
+pvchange --allocatable n "$dev1"
+check pv_field "$dev1" pv_attr ---
+vgremove -ff $vg1
+not pvchange --allocatable y "$dev1"
+pvremove -ff "$dev1"
+
for mda in 0 1 2
do
# "setup pv with metadatacopies = $mda"
9 years, 9 months
master - report: define reserved values/synonyms for some attribute fields
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=7021c8f1a483d9...
Commit: 7021c8f1a483d91a58ce2abc52583e73e2910da7
Parent: 0956fd230fea550707acb2889223438996102de4
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Fri Jul 4 12:08:52 2014 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Fri Jul 4 15:50:50 2014 +0200
report: define reserved values/synonyms for some attribute fields
All binary attr fields have synonyms so selection criteria can use
either 0/1 or words to match against the field value (base type
for these binary fields is numeric one - DM_REPORT_FIELD_TYPE_NUMBER
so words are registered as reserved values):
pv_allocatable - "allocatable"
pv_exported - "exported"
pv_missing - "missing"
vg_extendable - "extendable"
vg_exported - "exported"
vg_partial - "partial"
vg_clustered - "clustered"
lv_initial_image_sync - "initial image sync", "sync"
lv_image_synced_names - "image synced", "synced"
lv_merging_names - "merging"
lv_converting_names - "converting"
lv_allocation_locked - "allocation locked", "locked"
lv_fixed_minor - "fixed minor", "fixed"
lv_merge_failed - "merge failed", "failed"
For example, these three are all equivalent:
$ lvs -o name,fixed_minor -S 'fixed_minor=fixed'
LV FixMin
lvol8 fixed minor
$ lvs -o name,fixed_minor -S 'fixed_minor="fixed minor"'
LV FixMin
lvol8 fixed minor
$ lvs -o name,fixed_minor -S 'fixed_minor=1'
LV FixMin
lvol8 fixed minor
The same with binary output - it has no effect on this functionality:
$ lvs -o name,fixed_minor --binary -S 'fixed_minor=fixed'
LV FixMin
lvol8 1
$ lvs -o name,fixed_minor --binary -S 'fixed_minor="fixed
minor"'
LV FixMin
lvol8 1
[1] f20/~ # lvs -o name,fixed_minor --binary -S 'fixed_minor=1'
LV FixMin
lvol8 1
---
lib/report/report.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 131 insertions(+), 11 deletions(-)
diff --git a/lib/report/report.c b/lib/report/report.c
index 284a718..7cc3599 100644
--- a/lib/report/report.c
+++ b/lib/report/report.c
@@ -41,15 +41,27 @@ struct lvm_report_object {
struct label *label;
};
+/* Enum for field_num index to use in per-field reserved value definition. */
+#define FIELD(type, strct, sorttype, head, field_name, width, func, id, desc, writeable) field_ ## id,
+enum {
+#include "columns.h"
+};
+#undef FIELD
+
+
static const uint64_t _zero64 = UINT64_C(0);
static const uint64_t _one64 = UINT64_C(1);
static const char * const _str_zero = "0";
static const char * const _str_one = "1";
-static const uint64_t _reserved_number_undef_64 = UINT64_C(-1);
-static const uint64_t _reserved_number_unmanaged_64 = UINT64_C(-2);
-static const uint64_t _reserved_size_auto_64 = UINT64_C(-1);
+/*
+ * 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!
* So when stored in the struct, the _reserved_number_undef_32 is actually
@@ -57,17 +69,125 @@ static const uint64_t _reserved_size_auto_64 = UINT64_C(-1);
*/
static const int32_t _reserved_number_undef_32 = INT32_C(-1);
+/* Per-field reserved values. */
+static const struct dm_report_field_reserved_value _reserved_pv_allocatable = {field_pv_allocatable, &_one64};
+static const struct dm_report_field_reserved_value _reserved_pv_exported = {field_pv_exported, &_one64};
+static const struct dm_report_field_reserved_value _reserved_pv_missing = {field_pv_missing, &_one64};
+static const struct dm_report_field_reserved_value _reserved_vg_extendable = {field_vg_extendable, &_one64};
+static const struct dm_report_field_reserved_value _reserved_vg_exported = {field_vg_exported, &_one64};
+static const struct dm_report_field_reserved_value _reserved_vg_partial = {field_vg_partial, &_one64};
+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};
-static const char const *_reserved_number_unmanaged_64_names[]={"unmanaged", NULL};
-static const char const *_reserved_size_auto_64_names[]={"auto", NULL};
+/* Per-field reserved names. */
+static const char *_reserved_pv_allocatable_names[]={"allocatable", NULL};
+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. */
static const struct dm_report_reserved_value _report_reserved_values[] = {
{DM_REPORT_FIELD_TYPE_NUMBER, &_reserved_number_undef_64, _reserved_number_undef_64_names,
"Reserved value for undefined numeric value."},
- {DM_REPORT_FIELD_TYPE_NUMBER, &_reserved_number_unmanaged_64, _reserved_number_unmanaged_64_names,
- "Reserved value for unmanaged number of metadata copies in VG."},
- {DM_REPORT_FIELD_TYPE_SIZE, &_reserved_size_auto_64, _reserved_size_auto_64_names,
- "Reserved value for size that is automatically calculated."},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_pv_allocatable, _reserved_pv_allocatable_names,
+ "pv_allocatable reserved values"},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_pv_exported, _reserved_pv_exported_names,
+ "pv_exported reserved values"},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_pv_missing, _reserved_pv_missing_names,
+ "pv_missing reserved values"},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_extendable, _reserved_vg_extendable_names,
+ "vg_extendable reserved values"},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_exported, _reserved_vg_exported_names,
+ "vg_exported reserved values"},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_partial, _reserved_vg_partial_names,
+ "vg_partial reserved values"},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_clustered, _reserved_vg_clustered_names,
+ "vg_clustered reserved values"},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_permissions_rw, _reserved_vg_permissions_rw_names,
+ "vg_permissions reserved values (writeable)"},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_permissions_r, _reserved_vg_permissions_r_names,
+ "vg_permissions reserved values (read-only)"},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_vg_mda_copies, _reserved_vg_mda_copies_names,
+ "vg_mda_copies reserved values (unmanaged)"},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_initial_image_sync, _reserved_lv_initial_image_sync_names,
+ "lv_initial_image_sync reserved values"},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_image_synced, _reserved_lv_image_synced_names,
+ "lv_image_synced reserved values"},
+ {DM_REPORT_FIELD_TYPE_NONE, &_reserved_lv_merging, _reserved_lv_merging_names,
+ "lv_merging reserved values"},
+ {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}
};
@@ -542,7 +662,7 @@ static int _lvreadahead_disp(struct dm_report *rh, struct dm_pool *mem,
const struct logical_volume *lv = (const struct logical_volume *) data;
if (lv->read_ahead == DM_READ_AHEAD_AUTO)
- return _field_set_value(field, "auto", &_reserved_size_auto_64);
+ return _field_set_value(field, "auto", &_reserved_number_undef_64);
return _size32_disp(rh, mem, field, &lv->read_ahead, private);
}
@@ -833,7 +953,7 @@ static int _vgmdacopies_disp(struct dm_report *rh, struct dm_pool *mem,
uint32_t count = vg_mda_copies(vg);
if (count == VGMETADATACOPIES_UNMANAGED)
- return _field_set_value(field, "unmanaged", &_reserved_number_unmanaged_64);
+ return _field_set_value(field, "unmanaged", &_reserved_number_undef_64);
return _uint32_disp(rh, mem, field, &count, private);
}
9 years, 10 months