diff options
author | Peter Rajnoha <prajnoha@redhat.com> | 2016-06-16 11:23:56 +0200 |
---|---|---|
committer | Peter Rajnoha <prajnoha@redhat.com> | 2016-06-20 10:42:18 +0200 |
commit | a9fe57db1c285ef7052a1054891f5eb7dbbb01b2 (patch) | |
tree | 877c567aba0e512b4a2ca26a0eb085458f453e81 /libdm/libdm-report.c | |
parent | 9c8f912ea79d9b836c814b3d12cc331de634617e (diff) | |
download | lvm2-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.c | 50 |
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; } |