diff options
author | Peter Rajnoha <prajnoha@redhat.com> | 2014-04-28 11:58:04 +0200 |
---|---|---|
committer | Peter Rajnoha <prajnoha@redhat.com> | 2014-05-09 08:51:00 +0200 |
commit | 4966d6bf9681f94779edc333b05bfcdee58c2770 (patch) | |
tree | 398c1d5d5bec86f7b2385d649dfd20e7f02af45c | |
parent | fda0e49393ec9e31a78ea5d9a41d74d82c2523dd (diff) | |
download | lvm2-4966d6bf9681f94779edc333b05bfcdee58c2770.tar.gz |
selout: use _check_report_selection in dm_report_object to report only objects that satisfy the report selection
-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 883f34f69..47f4d4fba 100644 --- a/libdm/libdm-report.c +++ b/libdm/libdm-report.c @@ -940,18 +940,19 @@ static int _check_report_selection(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; @@ -962,24 +963,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, @@ -987,9 +991,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_selection(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); @@ -997,13 +1012,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; } /* |