summaryrefslogtreecommitdiff
path: root/libdm/libdm-report.c
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2016-06-16 11:23:56 +0200
committerPeter Rajnoha <prajnoha@redhat.com>2016-06-20 10:42:18 +0200
commita9fe57db1c285ef7052a1054891f5eb7dbbb01b2 (patch)
tree877c567aba0e512b4a2ca26a0eb085458f453e81 /libdm/libdm-report.c
parent9c8f912ea79d9b836c814b3d12cc331de634617e (diff)
downloadlvm2-a9fe57db1c285ef7052a1054891f5eb7dbbb01b2.tar.gz
libdm: report: implement DM_REPORT_GROUP_SINGLE for a group containing single report only
There's no change in output for this report group type - with this type, we only make sure there's always only one report in a group at a time, not more.
Diffstat (limited to 'libdm/libdm-report.c')
-rw-r--r--libdm/libdm-report.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c
index ab87ba7a2..7ea5ebf60 100644
--- a/libdm/libdm-report.c
+++ b/libdm/libdm-report.c
@@ -4485,6 +4485,11 @@ out:
return r;
}
+static int _report_group_create_single(struct dm_report_group *group)
+{
+ return 1;
+}
+
struct dm_report_group *dm_report_group_create(dm_report_group_type_t type, void *data)
{
struct dm_report_group *group;
@@ -4513,6 +4518,10 @@ struct dm_report_group *dm_report_group_create(dm_report_group_type_t type, void
dm_list_add_h(&group->items, &item->list);
switch (type) {
+ case DM_REPORT_GROUP_SINGLE:
+ if (!_report_group_create_single(group))
+ goto_bad;
+ break;
default:
goto_bad;
}
@@ -4523,6 +4532,25 @@ bad:
return NULL;
}
+static int _report_group_push_single(struct report_group_item *item, void *data)
+{
+ struct report_group_item *item_iter;
+ unsigned count = 0;
+
+ dm_list_iterate_items(item_iter, &item->group->items) {
+ if (item_iter->report)
+ count++;
+ }
+
+ if (count > 1) {
+ log_error("dm_report: unable to add more than one report "
+ "to current report group");
+ return 0;
+ }
+
+ return 1;
+}
+
int dm_report_group_push(struct dm_report_group *group, struct dm_report *report, void *data)
{
struct report_group_item *item, *tmp_item;
@@ -4552,6 +4580,10 @@ int dm_report_group_push(struct dm_report_group *group, struct dm_report *report
dm_list_add_h(&group->items, &item->list);
switch (group->type) {
+ case DM_REPORT_GROUP_SINGLE:
+ if (!_report_group_push_single(item, data))
+ goto_bad;
+ break;
default:
goto_bad;
}
@@ -4563,6 +4595,11 @@ bad:
return 0;
}
+static int _report_group_pop_single(struct report_group_item *item)
+{
+ return 1;
+}
+
int dm_report_group_pop(struct dm_report_group *group)
{
struct report_group_item *item;
@@ -4576,6 +4613,10 @@ int dm_report_group_pop(struct dm_report_group *group)
}
switch (group->type) {
+ case DM_REPORT_GROUP_SINGLE:
+ if (!_report_group_pop_single(item))
+ return_0;
+ break;
default:
return 0;
}
@@ -4594,6 +4635,11 @@ int dm_report_group_pop(struct dm_report_group *group)
return 1;
}
+static int _report_group_destroy_single(void)
+{
+ return 1;
+}
+
int dm_report_group_destroy(struct dm_report_group *group)
{
struct report_group_item *item, *tmp_item;
@@ -4610,6 +4656,10 @@ int dm_report_group_destroy(struct dm_report_group *group)
}
switch (group->type) {
+ case DM_REPORT_GROUP_SINGLE:
+ if (!_report_group_destroy_single())
+ goto_out;
+ break;
default:
goto_out;
}