186d7f5d3SJohn Marino /* $NetBSD: reporter.c,v 1.1.1.3 2009/12/02 00:25:55 haad Exp $ */
286d7f5d3SJohn Marino
386d7f5d3SJohn Marino /*
486d7f5d3SJohn Marino * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
586d7f5d3SJohn Marino * Copyright (C) 2004-2009 Red Hat, Inc. All rights reserved.
686d7f5d3SJohn Marino *
786d7f5d3SJohn Marino * This file is part of LVM2.
886d7f5d3SJohn Marino *
986d7f5d3SJohn Marino * This copyrighted material is made available to anyone wishing to use,
1086d7f5d3SJohn Marino * modify, copy, or redistribute it subject to the terms and conditions
1186d7f5d3SJohn Marino * of the GNU Lesser General Public License v.2.1.
1286d7f5d3SJohn Marino *
1386d7f5d3SJohn Marino * You should have received a copy of the GNU Lesser General Public License
1486d7f5d3SJohn Marino * along with this program; if not, write to the Free Software Foundation,
1586d7f5d3SJohn Marino * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1686d7f5d3SJohn Marino */
1786d7f5d3SJohn Marino
1886d7f5d3SJohn Marino #include "tools.h"
1986d7f5d3SJohn Marino #include "report.h"
2086d7f5d3SJohn Marino
_vgs_single(struct cmd_context * cmd __attribute ((unused)),const char * vg_name,struct volume_group * vg,void * handle)2186d7f5d3SJohn Marino static int _vgs_single(struct cmd_context *cmd __attribute((unused)),
2286d7f5d3SJohn Marino const char *vg_name, struct volume_group *vg,
2386d7f5d3SJohn Marino void *handle)
2486d7f5d3SJohn Marino {
2586d7f5d3SJohn Marino if (!report_object(handle, vg, NULL, NULL, NULL, NULL)) {
2686d7f5d3SJohn Marino stack;
2786d7f5d3SJohn Marino return ECMD_FAILED;
2886d7f5d3SJohn Marino }
2986d7f5d3SJohn Marino
3086d7f5d3SJohn Marino check_current_backup(vg);
3186d7f5d3SJohn Marino
3286d7f5d3SJohn Marino return ECMD_PROCESSED;
3386d7f5d3SJohn Marino }
3486d7f5d3SJohn Marino
_lvs_single(struct cmd_context * cmd,struct logical_volume * lv,void * handle)3586d7f5d3SJohn Marino static int _lvs_single(struct cmd_context *cmd, struct logical_volume *lv,
3686d7f5d3SJohn Marino void *handle)
3786d7f5d3SJohn Marino {
3886d7f5d3SJohn Marino if (!arg_count(cmd, all_ARG) && !lv_is_visible(lv))
3986d7f5d3SJohn Marino return ECMD_PROCESSED;
4086d7f5d3SJohn Marino
4186d7f5d3SJohn Marino if (!report_object(handle, lv->vg, lv, NULL, NULL, NULL)) {
4286d7f5d3SJohn Marino stack;
4386d7f5d3SJohn Marino return ECMD_FAILED;
4486d7f5d3SJohn Marino }
4586d7f5d3SJohn Marino
4686d7f5d3SJohn Marino return ECMD_PROCESSED;
4786d7f5d3SJohn Marino }
4886d7f5d3SJohn Marino
_segs_single(struct cmd_context * cmd __attribute ((unused)),struct lv_segment * seg,void * handle)4986d7f5d3SJohn Marino static int _segs_single(struct cmd_context *cmd __attribute((unused)),
5086d7f5d3SJohn Marino struct lv_segment *seg, void *handle)
5186d7f5d3SJohn Marino {
5286d7f5d3SJohn Marino if (!report_object(handle, seg->lv->vg, seg->lv, NULL, seg, NULL)) {
5386d7f5d3SJohn Marino stack;
5486d7f5d3SJohn Marino return ECMD_FAILED;
5586d7f5d3SJohn Marino }
5686d7f5d3SJohn Marino
5786d7f5d3SJohn Marino return ECMD_PROCESSED;
5886d7f5d3SJohn Marino }
5986d7f5d3SJohn Marino
_pvsegs_sub_single(struct cmd_context * cmd,struct volume_group * vg,struct pv_segment * pvseg,void * handle)6086d7f5d3SJohn Marino static int _pvsegs_sub_single(struct cmd_context *cmd,
6186d7f5d3SJohn Marino struct volume_group *vg,
6286d7f5d3SJohn Marino struct pv_segment *pvseg, void *handle)
6386d7f5d3SJohn Marino {
6486d7f5d3SJohn Marino int ret = ECMD_PROCESSED;
6586d7f5d3SJohn Marino struct lv_segment *seg = pvseg->lvseg;
6686d7f5d3SJohn Marino
6786d7f5d3SJohn Marino struct volume_group _free_vg = {
6886d7f5d3SJohn Marino .cmd = cmd,
6986d7f5d3SJohn Marino .name = (char *)"",
7086d7f5d3SJohn Marino };
7186d7f5d3SJohn Marino
7286d7f5d3SJohn Marino struct logical_volume _free_logical_volume = {
7386d7f5d3SJohn Marino .vg = vg ?: &_free_vg,
7486d7f5d3SJohn Marino .name = (char *) "",
7586d7f5d3SJohn Marino .snapshot = NULL,
7686d7f5d3SJohn Marino .status = VISIBLE_LV,
7786d7f5d3SJohn Marino .major = -1,
7886d7f5d3SJohn Marino .minor = -1,
7986d7f5d3SJohn Marino };
8086d7f5d3SJohn Marino
8186d7f5d3SJohn Marino struct lv_segment _free_lv_segment = {
8286d7f5d3SJohn Marino .lv = &_free_logical_volume,
8386d7f5d3SJohn Marino .le = 0,
8486d7f5d3SJohn Marino .status = 0,
8586d7f5d3SJohn Marino .stripe_size = 0,
8686d7f5d3SJohn Marino .area_count = 0,
8786d7f5d3SJohn Marino .area_len = 0,
8886d7f5d3SJohn Marino .origin = NULL,
8986d7f5d3SJohn Marino .cow = NULL,
9086d7f5d3SJohn Marino .chunk_size = 0,
9186d7f5d3SJohn Marino .region_size = 0,
9286d7f5d3SJohn Marino .extents_copied = 0,
9386d7f5d3SJohn Marino .log_lv = NULL,
9486d7f5d3SJohn Marino .areas = NULL,
9586d7f5d3SJohn Marino };
9686d7f5d3SJohn Marino
9786d7f5d3SJohn Marino _free_lv_segment.segtype = get_segtype_from_string(cmd, "free");
9886d7f5d3SJohn Marino _free_lv_segment.len = pvseg->len;
9986d7f5d3SJohn Marino dm_list_init(&_free_vg.pvs);
10086d7f5d3SJohn Marino dm_list_init(&_free_vg.lvs);
10186d7f5d3SJohn Marino dm_list_init(&_free_vg.tags);
10286d7f5d3SJohn Marino dm_list_init(&_free_lv_segment.tags);
10386d7f5d3SJohn Marino dm_list_init(&_free_lv_segment.origin_list);
10486d7f5d3SJohn Marino dm_list_init(&_free_logical_volume.tags);
10586d7f5d3SJohn Marino dm_list_init(&_free_logical_volume.segments);
10686d7f5d3SJohn Marino dm_list_init(&_free_logical_volume.segs_using_this_lv);
10786d7f5d3SJohn Marino dm_list_init(&_free_logical_volume.snapshot_segs);
10886d7f5d3SJohn Marino
10986d7f5d3SJohn Marino if (!report_object(handle, vg, seg ? seg->lv : &_free_logical_volume, pvseg->pv,
11086d7f5d3SJohn Marino seg ? : &_free_lv_segment, pvseg)) {
11186d7f5d3SJohn Marino stack;
11286d7f5d3SJohn Marino ret = ECMD_FAILED;
11386d7f5d3SJohn Marino }
11486d7f5d3SJohn Marino
11586d7f5d3SJohn Marino return ret;
11686d7f5d3SJohn Marino }
11786d7f5d3SJohn Marino
_lvsegs_single(struct cmd_context * cmd,struct logical_volume * lv,void * handle)11886d7f5d3SJohn Marino static int _lvsegs_single(struct cmd_context *cmd, struct logical_volume *lv,
11986d7f5d3SJohn Marino void *handle)
12086d7f5d3SJohn Marino {
12186d7f5d3SJohn Marino if (!arg_count(cmd, all_ARG) && !lv_is_visible(lv))
12286d7f5d3SJohn Marino return ECMD_PROCESSED;
12386d7f5d3SJohn Marino
12486d7f5d3SJohn Marino return process_each_segment_in_lv(cmd, lv, handle, _segs_single);
12586d7f5d3SJohn Marino }
12686d7f5d3SJohn Marino
_pvsegs_single(struct cmd_context * cmd,struct volume_group * vg,struct physical_volume * pv,void * handle)12786d7f5d3SJohn Marino static int _pvsegs_single(struct cmd_context *cmd, struct volume_group *vg,
12886d7f5d3SJohn Marino struct physical_volume *pv, void *handle)
12986d7f5d3SJohn Marino {
13086d7f5d3SJohn Marino return process_each_segment_in_pv(cmd, vg, pv, handle,
13186d7f5d3SJohn Marino _pvsegs_sub_single);
13286d7f5d3SJohn Marino }
13386d7f5d3SJohn Marino
_pvs_single(struct cmd_context * cmd,struct volume_group * vg,struct physical_volume * pv,void * handle)13486d7f5d3SJohn Marino static int _pvs_single(struct cmd_context *cmd, struct volume_group *vg,
13586d7f5d3SJohn Marino struct physical_volume *pv, void *handle)
13686d7f5d3SJohn Marino {
13786d7f5d3SJohn Marino struct pv_list *pvl;
13886d7f5d3SJohn Marino int ret = ECMD_PROCESSED;
13986d7f5d3SJohn Marino const char *vg_name = NULL;
14086d7f5d3SJohn Marino struct volume_group *old_vg = vg;
14186d7f5d3SJohn Marino
14286d7f5d3SJohn Marino if (is_pv(pv) && !is_orphan(pv) && !vg) {
14386d7f5d3SJohn Marino vg_name = pv_vg_name(pv);
14486d7f5d3SJohn Marino
14586d7f5d3SJohn Marino vg = vg_read(cmd, vg_name, (char *)&pv->vgid, 0);
14686d7f5d3SJohn Marino if (vg_read_error(vg)) {
14786d7f5d3SJohn Marino log_error("Skipping volume group %s", vg_name);
14886d7f5d3SJohn Marino vg_release(vg);
14986d7f5d3SJohn Marino return ECMD_FAILED;
15086d7f5d3SJohn Marino }
15186d7f5d3SJohn Marino
15286d7f5d3SJohn Marino /*
15386d7f5d3SJohn Marino * Replace possibly incomplete PV structure with new one
15486d7f5d3SJohn Marino * allocated in vg_read_internal() path.
15586d7f5d3SJohn Marino */
15686d7f5d3SJohn Marino if (!(pvl = find_pv_in_vg(vg, pv_dev_name(pv)))) {
15786d7f5d3SJohn Marino log_error("Unable to find \"%s\" in volume group \"%s\"",
15886d7f5d3SJohn Marino pv_dev_name(pv), vg->name);
15986d7f5d3SJohn Marino ret = ECMD_FAILED;
16086d7f5d3SJohn Marino goto out;
16186d7f5d3SJohn Marino }
16286d7f5d3SJohn Marino
16386d7f5d3SJohn Marino pv = pvl->pv;
16486d7f5d3SJohn Marino }
16586d7f5d3SJohn Marino
16686d7f5d3SJohn Marino if (!report_object(handle, vg, NULL, pv, NULL, NULL)) {
16786d7f5d3SJohn Marino stack;
16886d7f5d3SJohn Marino ret = ECMD_FAILED;
16986d7f5d3SJohn Marino }
17086d7f5d3SJohn Marino
17186d7f5d3SJohn Marino out:
17286d7f5d3SJohn Marino if (vg_name)
17386d7f5d3SJohn Marino unlock_vg(cmd, vg_name);
17486d7f5d3SJohn Marino
17586d7f5d3SJohn Marino if (!old_vg)
17686d7f5d3SJohn Marino vg_release(vg);
17786d7f5d3SJohn Marino
17886d7f5d3SJohn Marino return ret;
17986d7f5d3SJohn Marino }
18086d7f5d3SJohn Marino
_label_single(struct cmd_context * cmd,struct volume_group * vg,struct physical_volume * pv,void * handle)18186d7f5d3SJohn Marino static int _label_single(struct cmd_context *cmd, struct volume_group *vg,
18286d7f5d3SJohn Marino struct physical_volume *pv, void *handle)
18386d7f5d3SJohn Marino {
18486d7f5d3SJohn Marino if (!report_object(handle, vg, NULL, pv, NULL, NULL)) {
18586d7f5d3SJohn Marino stack;
18686d7f5d3SJohn Marino return ECMD_FAILED;
18786d7f5d3SJohn Marino }
18886d7f5d3SJohn Marino
18986d7f5d3SJohn Marino return ECMD_PROCESSED;
19086d7f5d3SJohn Marino }
19186d7f5d3SJohn Marino
_pvs_in_vg(struct cmd_context * cmd,const char * vg_name,struct volume_group * vg,void * handle)19286d7f5d3SJohn Marino static int _pvs_in_vg(struct cmd_context *cmd, const char *vg_name,
19386d7f5d3SJohn Marino struct volume_group *vg,
19486d7f5d3SJohn Marino void *handle)
19586d7f5d3SJohn Marino {
19686d7f5d3SJohn Marino if (vg_read_error(vg)) {
19786d7f5d3SJohn Marino stack;
19886d7f5d3SJohn Marino return ECMD_FAILED;
19986d7f5d3SJohn Marino }
20086d7f5d3SJohn Marino
20186d7f5d3SJohn Marino return process_each_pv_in_vg(cmd, vg, NULL, handle, &_pvs_single);
20286d7f5d3SJohn Marino }
20386d7f5d3SJohn Marino
_pvsegs_in_vg(struct cmd_context * cmd,const char * vg_name,struct volume_group * vg,void * handle)20486d7f5d3SJohn Marino static int _pvsegs_in_vg(struct cmd_context *cmd, const char *vg_name,
20586d7f5d3SJohn Marino struct volume_group *vg,
20686d7f5d3SJohn Marino void *handle)
20786d7f5d3SJohn Marino {
20886d7f5d3SJohn Marino if (vg_read_error(vg)) {
20986d7f5d3SJohn Marino stack;
21086d7f5d3SJohn Marino return ECMD_FAILED;
21186d7f5d3SJohn Marino }
21286d7f5d3SJohn Marino
21386d7f5d3SJohn Marino return process_each_pv_in_vg(cmd, vg, NULL, handle, &_pvsegs_single);
21486d7f5d3SJohn Marino }
21586d7f5d3SJohn Marino
_report(struct cmd_context * cmd,int argc,char ** argv,report_type_t report_type)21686d7f5d3SJohn Marino static int _report(struct cmd_context *cmd, int argc, char **argv,
21786d7f5d3SJohn Marino report_type_t report_type)
21886d7f5d3SJohn Marino {
21986d7f5d3SJohn Marino void *report_handle;
22086d7f5d3SJohn Marino const char *opts;
22186d7f5d3SJohn Marino char *str;
22286d7f5d3SJohn Marino const char *keys = NULL, *options = NULL, *separator;
22386d7f5d3SJohn Marino int r = ECMD_PROCESSED;
22486d7f5d3SJohn Marino int aligned, buffered, headings, field_prefixes, quoted;
22586d7f5d3SJohn Marino int columns_as_rows;
22686d7f5d3SJohn Marino unsigned args_are_pvs;
22786d7f5d3SJohn Marino
22886d7f5d3SJohn Marino aligned = find_config_tree_int(cmd, "report/aligned",
22986d7f5d3SJohn Marino DEFAULT_REP_ALIGNED);
23086d7f5d3SJohn Marino buffered = find_config_tree_int(cmd, "report/buffered",
23186d7f5d3SJohn Marino DEFAULT_REP_BUFFERED);
23286d7f5d3SJohn Marino headings = find_config_tree_int(cmd, "report/headings",
23386d7f5d3SJohn Marino DEFAULT_REP_HEADINGS);
23486d7f5d3SJohn Marino separator = find_config_tree_str(cmd, "report/separator",
23586d7f5d3SJohn Marino DEFAULT_REP_SEPARATOR);
23686d7f5d3SJohn Marino field_prefixes = find_config_tree_int(cmd, "report/prefixes",
23786d7f5d3SJohn Marino DEFAULT_REP_PREFIXES);
23886d7f5d3SJohn Marino quoted = find_config_tree_int(cmd, "report/quoted",
23986d7f5d3SJohn Marino DEFAULT_REP_QUOTED);
24086d7f5d3SJohn Marino columns_as_rows = find_config_tree_int(cmd, "report/columns_as_rows",
24186d7f5d3SJohn Marino DEFAULT_REP_COLUMNS_AS_ROWS);
24286d7f5d3SJohn Marino
24386d7f5d3SJohn Marino args_are_pvs = (report_type == PVS ||
24486d7f5d3SJohn Marino report_type == LABEL ||
24586d7f5d3SJohn Marino report_type == PVSEGS) ? 1 : 0;
24686d7f5d3SJohn Marino
24786d7f5d3SJohn Marino switch (report_type) {
24886d7f5d3SJohn Marino case LVS:
24986d7f5d3SJohn Marino keys = find_config_tree_str(cmd, "report/lvs_sort",
25086d7f5d3SJohn Marino DEFAULT_LVS_SORT);
25186d7f5d3SJohn Marino if (!arg_count(cmd, verbose_ARG))
25286d7f5d3SJohn Marino options = find_config_tree_str(cmd,
25386d7f5d3SJohn Marino "report/lvs_cols",
25486d7f5d3SJohn Marino DEFAULT_LVS_COLS);
25586d7f5d3SJohn Marino else
25686d7f5d3SJohn Marino options = find_config_tree_str(cmd,
25786d7f5d3SJohn Marino "report/lvs_cols_verbose",
25886d7f5d3SJohn Marino DEFAULT_LVS_COLS_VERB);
25986d7f5d3SJohn Marino break;
26086d7f5d3SJohn Marino case VGS:
26186d7f5d3SJohn Marino keys = find_config_tree_str(cmd, "report/vgs_sort",
26286d7f5d3SJohn Marino DEFAULT_VGS_SORT);
26386d7f5d3SJohn Marino if (!arg_count(cmd, verbose_ARG))
26486d7f5d3SJohn Marino options = find_config_tree_str(cmd,
26586d7f5d3SJohn Marino "report/vgs_cols",
26686d7f5d3SJohn Marino DEFAULT_VGS_COLS);
26786d7f5d3SJohn Marino else
26886d7f5d3SJohn Marino options = find_config_tree_str(cmd,
26986d7f5d3SJohn Marino "report/vgs_cols_verbose",
27086d7f5d3SJohn Marino DEFAULT_VGS_COLS_VERB);
27186d7f5d3SJohn Marino break;
27286d7f5d3SJohn Marino case LABEL:
27386d7f5d3SJohn Marino case PVS:
27486d7f5d3SJohn Marino keys = find_config_tree_str(cmd, "report/pvs_sort",
27586d7f5d3SJohn Marino DEFAULT_PVS_SORT);
27686d7f5d3SJohn Marino if (!arg_count(cmd, verbose_ARG))
27786d7f5d3SJohn Marino options = find_config_tree_str(cmd,
27886d7f5d3SJohn Marino "report/pvs_cols",
27986d7f5d3SJohn Marino DEFAULT_PVS_COLS);
28086d7f5d3SJohn Marino else
28186d7f5d3SJohn Marino options = find_config_tree_str(cmd,
28286d7f5d3SJohn Marino "report/pvs_cols_verbose",
28386d7f5d3SJohn Marino DEFAULT_PVS_COLS_VERB);
28486d7f5d3SJohn Marino break;
28586d7f5d3SJohn Marino case SEGS:
28686d7f5d3SJohn Marino keys = find_config_tree_str(cmd, "report/segs_sort",
28786d7f5d3SJohn Marino DEFAULT_SEGS_SORT);
28886d7f5d3SJohn Marino if (!arg_count(cmd, verbose_ARG))
28986d7f5d3SJohn Marino options = find_config_tree_str(cmd,
29086d7f5d3SJohn Marino "report/segs_cols",
29186d7f5d3SJohn Marino DEFAULT_SEGS_COLS);
29286d7f5d3SJohn Marino else
29386d7f5d3SJohn Marino options = find_config_tree_str(cmd,
29486d7f5d3SJohn Marino "report/segs_cols_verbose",
29586d7f5d3SJohn Marino DEFAULT_SEGS_COLS_VERB);
29686d7f5d3SJohn Marino break;
29786d7f5d3SJohn Marino case PVSEGS:
29886d7f5d3SJohn Marino keys = find_config_tree_str(cmd, "report/pvsegs_sort",
29986d7f5d3SJohn Marino DEFAULT_PVSEGS_SORT);
30086d7f5d3SJohn Marino if (!arg_count(cmd, verbose_ARG))
30186d7f5d3SJohn Marino options = find_config_tree_str(cmd,
30286d7f5d3SJohn Marino "report/pvsegs_cols",
30386d7f5d3SJohn Marino DEFAULT_PVSEGS_COLS);
30486d7f5d3SJohn Marino else
30586d7f5d3SJohn Marino options = find_config_tree_str(cmd,
30686d7f5d3SJohn Marino "report/pvsegs_cols_verbose",
30786d7f5d3SJohn Marino DEFAULT_PVSEGS_COLS_VERB);
30886d7f5d3SJohn Marino break;
30986d7f5d3SJohn Marino }
31086d7f5d3SJohn Marino
31186d7f5d3SJohn Marino /* If -o supplied use it, else use default for report_type */
31286d7f5d3SJohn Marino if (arg_count(cmd, options_ARG)) {
31386d7f5d3SJohn Marino opts = arg_str_value(cmd, options_ARG, "");
31486d7f5d3SJohn Marino if (!opts || !*opts) {
31586d7f5d3SJohn Marino log_error("Invalid options string: %s", opts);
31686d7f5d3SJohn Marino return EINVALID_CMD_LINE;
31786d7f5d3SJohn Marino }
31886d7f5d3SJohn Marino if (*opts == '+') {
31986d7f5d3SJohn Marino if (!(str = dm_pool_alloc(cmd->mem,
32086d7f5d3SJohn Marino strlen(options) + strlen(opts) + 1))) {
32186d7f5d3SJohn Marino log_error("options string allocation failed");
32286d7f5d3SJohn Marino return ECMD_FAILED;
32386d7f5d3SJohn Marino }
32486d7f5d3SJohn Marino strcpy(str, options);
32586d7f5d3SJohn Marino strcat(str, ",");
32686d7f5d3SJohn Marino strcat(str, opts + 1);
32786d7f5d3SJohn Marino options = str;
32886d7f5d3SJohn Marino } else
32986d7f5d3SJohn Marino options = opts;
33086d7f5d3SJohn Marino }
33186d7f5d3SJohn Marino
33286d7f5d3SJohn Marino /* -O overrides default sort settings */
33386d7f5d3SJohn Marino keys = arg_str_value(cmd, sort_ARG, keys);
33486d7f5d3SJohn Marino
33586d7f5d3SJohn Marino separator = arg_str_value(cmd, separator_ARG, separator);
33686d7f5d3SJohn Marino if (arg_count(cmd, separator_ARG))
33786d7f5d3SJohn Marino aligned = 0;
33886d7f5d3SJohn Marino if (arg_count(cmd, aligned_ARG))
33986d7f5d3SJohn Marino aligned = 1;
34086d7f5d3SJohn Marino if (arg_count(cmd, unbuffered_ARG) && !arg_count(cmd, sort_ARG))
34186d7f5d3SJohn Marino buffered = 0;
34286d7f5d3SJohn Marino if (arg_count(cmd, noheadings_ARG))
34386d7f5d3SJohn Marino headings = 0;
34486d7f5d3SJohn Marino if (arg_count(cmd, nameprefixes_ARG)) {
34586d7f5d3SJohn Marino aligned = 0;
34686d7f5d3SJohn Marino field_prefixes = 1;
34786d7f5d3SJohn Marino }
34886d7f5d3SJohn Marino if (arg_count(cmd, unquoted_ARG))
34986d7f5d3SJohn Marino quoted = 0;
35086d7f5d3SJohn Marino if (arg_count(cmd, rows_ARG))
35186d7f5d3SJohn Marino columns_as_rows = 1;
35286d7f5d3SJohn Marino
35386d7f5d3SJohn Marino if (!(report_handle = report_init(cmd, options, keys, &report_type,
35486d7f5d3SJohn Marino separator, aligned, buffered,
35586d7f5d3SJohn Marino headings, field_prefixes, quoted,
35686d7f5d3SJohn Marino columns_as_rows))) {
35786d7f5d3SJohn Marino stack;
35886d7f5d3SJohn Marino return ECMD_FAILED;
35986d7f5d3SJohn Marino }
36086d7f5d3SJohn Marino
36186d7f5d3SJohn Marino /* Ensure options selected are compatible */
36286d7f5d3SJohn Marino if (report_type & SEGS)
36386d7f5d3SJohn Marino report_type |= LVS;
36486d7f5d3SJohn Marino if (report_type & PVSEGS)
36586d7f5d3SJohn Marino report_type |= PVS;
36686d7f5d3SJohn Marino if ((report_type & LVS) && (report_type & (PVS | LABEL)) && !args_are_pvs) {
36786d7f5d3SJohn Marino log_error("Can't report LV and PV fields at the same time");
36886d7f5d3SJohn Marino dm_report_free(report_handle);
36986d7f5d3SJohn Marino return ECMD_FAILED;
37086d7f5d3SJohn Marino }
37186d7f5d3SJohn Marino
37286d7f5d3SJohn Marino /* Change report type if fields specified makes this necessary */
37386d7f5d3SJohn Marino if ((report_type & PVSEGS) ||
37486d7f5d3SJohn Marino ((report_type & (PVS | LABEL)) && (report_type & LVS)))
37586d7f5d3SJohn Marino report_type = PVSEGS;
37686d7f5d3SJohn Marino else if ((report_type & LABEL) && (report_type & VGS))
37786d7f5d3SJohn Marino report_type = PVS;
37886d7f5d3SJohn Marino else if (report_type & PVS)
37986d7f5d3SJohn Marino report_type = PVS;
38086d7f5d3SJohn Marino else if (report_type & SEGS)
38186d7f5d3SJohn Marino report_type = SEGS;
38286d7f5d3SJohn Marino else if (report_type & LVS)
38386d7f5d3SJohn Marino report_type = LVS;
38486d7f5d3SJohn Marino
38586d7f5d3SJohn Marino switch (report_type) {
38686d7f5d3SJohn Marino case LVS:
38786d7f5d3SJohn Marino r = process_each_lv(cmd, argc, argv, 0, report_handle,
38886d7f5d3SJohn Marino &_lvs_single);
38986d7f5d3SJohn Marino break;
39086d7f5d3SJohn Marino case VGS:
39186d7f5d3SJohn Marino r = process_each_vg(cmd, argc, argv, 0,
39286d7f5d3SJohn Marino report_handle, &_vgs_single);
39386d7f5d3SJohn Marino break;
39486d7f5d3SJohn Marino case LABEL:
39586d7f5d3SJohn Marino r = process_each_pv(cmd, argc, argv, NULL, READ_WITHOUT_LOCK,
39686d7f5d3SJohn Marino 1, report_handle, &_label_single);
39786d7f5d3SJohn Marino break;
39886d7f5d3SJohn Marino case PVS:
39986d7f5d3SJohn Marino if (args_are_pvs)
40086d7f5d3SJohn Marino r = process_each_pv(cmd, argc, argv, NULL, 0,
40186d7f5d3SJohn Marino 0, report_handle, &_pvs_single);
40286d7f5d3SJohn Marino else
40386d7f5d3SJohn Marino r = process_each_vg(cmd, argc, argv, 0,
40486d7f5d3SJohn Marino report_handle, &_pvs_in_vg);
40586d7f5d3SJohn Marino break;
40686d7f5d3SJohn Marino case SEGS:
40786d7f5d3SJohn Marino r = process_each_lv(cmd, argc, argv, 0, report_handle,
40886d7f5d3SJohn Marino &_lvsegs_single);
40986d7f5d3SJohn Marino break;
41086d7f5d3SJohn Marino case PVSEGS:
41186d7f5d3SJohn Marino if (args_are_pvs)
41286d7f5d3SJohn Marino r = process_each_pv(cmd, argc, argv, NULL, 0,
41386d7f5d3SJohn Marino 0, report_handle, &_pvsegs_single);
41486d7f5d3SJohn Marino else
41586d7f5d3SJohn Marino r = process_each_vg(cmd, argc, argv, 0,
41686d7f5d3SJohn Marino report_handle, &_pvsegs_in_vg);
41786d7f5d3SJohn Marino break;
41886d7f5d3SJohn Marino }
41986d7f5d3SJohn Marino
42086d7f5d3SJohn Marino dm_report_output(report_handle);
42186d7f5d3SJohn Marino
42286d7f5d3SJohn Marino dm_report_free(report_handle);
42386d7f5d3SJohn Marino return r;
42486d7f5d3SJohn Marino }
42586d7f5d3SJohn Marino
lvs(struct cmd_context * cmd,int argc,char ** argv)42686d7f5d3SJohn Marino int lvs(struct cmd_context *cmd, int argc, char **argv)
42786d7f5d3SJohn Marino {
42886d7f5d3SJohn Marino report_type_t type;
42986d7f5d3SJohn Marino
43086d7f5d3SJohn Marino if (arg_count(cmd, segments_ARG))
43186d7f5d3SJohn Marino type = SEGS;
43286d7f5d3SJohn Marino else
43386d7f5d3SJohn Marino type = LVS;
43486d7f5d3SJohn Marino
43586d7f5d3SJohn Marino return _report(cmd, argc, argv, type);
43686d7f5d3SJohn Marino }
43786d7f5d3SJohn Marino
vgs(struct cmd_context * cmd,int argc,char ** argv)43886d7f5d3SJohn Marino int vgs(struct cmd_context *cmd, int argc, char **argv)
43986d7f5d3SJohn Marino {
44086d7f5d3SJohn Marino return _report(cmd, argc, argv, VGS);
44186d7f5d3SJohn Marino }
44286d7f5d3SJohn Marino
pvs(struct cmd_context * cmd,int argc,char ** argv)44386d7f5d3SJohn Marino int pvs(struct cmd_context *cmd, int argc, char **argv)
44486d7f5d3SJohn Marino {
44586d7f5d3SJohn Marino report_type_t type;
44686d7f5d3SJohn Marino
44786d7f5d3SJohn Marino if (arg_count(cmd, segments_ARG))
44886d7f5d3SJohn Marino type = PVSEGS;
44986d7f5d3SJohn Marino else
45086d7f5d3SJohn Marino type = LABEL;
45186d7f5d3SJohn Marino
45286d7f5d3SJohn Marino return _report(cmd, argc, argv, type);
45386d7f5d3SJohn Marino }
454