[lvm-devel] master - report: define reserved values/synonyms for some attribute fields
Peter Rajnoha
prajnoha at fedoraproject.org
Fri Jul 4 14:00:27 UTC 2014
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=7021c8f1a483d91a58ce2abc52583e73e2910da7
Commit: 7021c8f1a483d91a58ce2abc52583e73e2910da7
Parent: 0956fd230fea550707acb2889223438996102de4
Author: Peter Rajnoha <prajnoha at redhat.com>
AuthorDate: Fri Jul 4 12:08:52 2014 +0200
Committer: Peter Rajnoha <prajnoha at 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);
}
More information about the lvm-devel
mailing list