diff options
author | Peter Rajnoha <prajnoha@redhat.com> | 2014-04-25 11:48:30 +0200 |
---|---|---|
committer | Peter Rajnoha <prajnoha@redhat.com> | 2014-04-25 11:48:30 +0200 |
commit | 745e7966913ec72fa1b1ec332c3d7f939a884af9 (patch) | |
tree | 10ebefb32f6f7a77f8439ea9889b95265286c102 | |
parent | e50fbad0214823c098c7cf65423682fd3ad06418 (diff) | |
download | lvm2-745e7966913ec72fa1b1ec332c3d7f939a884af9.tar.gz |
condout: use _check_report_condition in dm_report_object to report only objects that satisfy the report condition
-rw-r--r-- | libdm/libdm-report.c | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c index 0bb03c740..2d7daf272 100644 --- a/libdm/libdm-report.c +++ b/libdm/libdm-report.c @@ -906,18 +906,19 @@ static int _check_report_condition(struct dm_report *rh, struct dm_list *fields) int dm_report_object(struct dm_report *rh, void *object) { struct field_properties *fp; - struct row *row; + struct row *row = NULL; struct dm_report_field *field; void *data = NULL; + int r = 0; if (!rh) { log_error(INTERNAL_ERROR "dm_report handler is NULL."); - return 0; + goto out; } if (!(row = dm_pool_zalloc(rh->mem, sizeof(*row)))) { log_error("dm_report_object: struct row allocation failed"); - return 0; + goto out; } row->rh = rh; @@ -928,24 +929,27 @@ int dm_report_object(struct dm_report *rh, void *object) rh->keys_count))) { log_error("dm_report_object: " "row sort value structure allocation failed"); - return 0; + goto out; } dm_list_init(&row->fields); - dm_list_add(&rh->rows, &row->list); /* For each field to be displayed, call its report_fn */ dm_list_iterate_items(fp, &rh->field_props) { if (!(field = dm_pool_zalloc(rh->mem, sizeof(*field)))) { log_error("dm_report_object: " "struct dm_report_field allocation failed"); - return 0; + goto out; } field->props = fp; data = _report_get_field_data(rh, fp, object); - if (!data) - return 0; + if (!data) { + log_error("dm_report_object: " + "no data assigned to field %s", + rh->fields[fp->field_num].id); + goto out; + } if (!rh->fields[fp->field_num].report_fn(rh, rh->mem, field, data, @@ -953,9 +957,20 @@ int dm_report_object(struct dm_report *rh, void *object) log_error("dm_report_object: " "report function failed for field %s", rh->fields[fp->field_num].id); - return 0; + goto out; } + dm_list_add(&row->fields, &field->list); + } + + if (!_check_report_condition(rh, &row->fields)) { + r = 1; + goto out; + } + + dm_list_add(&rh->rows, &row->list); + + dm_list_iterate_items(field, &row->fields) { if (((int) strlen(field->report_string) > field->props->width)) field->props->width = (int) strlen(field->report_string); @@ -963,13 +978,16 @@ int dm_report_object(struct dm_report *rh, void *object) (field->props->flags & FLD_SORT_KEY)) { (*row->sort_fields)[field->props->sort_posn] = field; } - dm_list_add(&row->fields, &field->list); } if (!(rh->flags & DM_REPORT_OUTPUT_BUFFERED)) return dm_report_output(rh); - return 1; + r = 1; +out: + if (!r) + dm_pool_free(rh->mem, row); + return r; } /* |