186d7f5d3SJohn Marino /* $NetBSD: lvscan.c,v 1.1.1.3 2009/12/02 00:25:53 haad Exp $ */
286d7f5d3SJohn Marino
386d7f5d3SJohn Marino /*
486d7f5d3SJohn Marino * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
586d7f5d3SJohn Marino * Copyright (C) 2004-2006 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
lvscan_single(struct cmd_context * cmd,struct logical_volume * lv,void * handle __attribute ((unused)))2086d7f5d3SJohn Marino static int lvscan_single(struct cmd_context *cmd, struct logical_volume *lv,
2186d7f5d3SJohn Marino void *handle __attribute((unused)))
2286d7f5d3SJohn Marino {
2386d7f5d3SJohn Marino struct lvinfo info;
2486d7f5d3SJohn Marino int lv_total = 0;
2586d7f5d3SJohn Marino uint64_t lv_capacity_total = 0;
2686d7f5d3SJohn Marino int inkernel, snap_active = 1;
2786d7f5d3SJohn Marino struct lv_segment *snap_seg = NULL;
2886d7f5d3SJohn Marino float snap_percent; /* fused, fsize; */
2986d7f5d3SJohn Marino percent_range_t percent_range;
3086d7f5d3SJohn Marino
3186d7f5d3SJohn Marino const char *active_str, *snapshot_str;
3286d7f5d3SJohn Marino
3386d7f5d3SJohn Marino if (!arg_count(cmd, all_ARG) && !lv_is_visible(lv))
3486d7f5d3SJohn Marino return ECMD_PROCESSED;
3586d7f5d3SJohn Marino
3686d7f5d3SJohn Marino inkernel = lv_info(cmd, lv, &info, 1, 0) && info.exists;
3786d7f5d3SJohn Marino if (lv_is_origin(lv)) {
3886d7f5d3SJohn Marino dm_list_iterate_items_gen(snap_seg, &lv->snapshot_segs,
3986d7f5d3SJohn Marino origin_list) {
4086d7f5d3SJohn Marino if (inkernel &&
4186d7f5d3SJohn Marino (snap_active = lv_snapshot_percent(snap_seg->cow,
4286d7f5d3SJohn Marino &snap_percent,
4386d7f5d3SJohn Marino &percent_range)))
4486d7f5d3SJohn Marino if (percent_range == PERCENT_INVALID)
4586d7f5d3SJohn Marino snap_active = 0;
4686d7f5d3SJohn Marino }
4786d7f5d3SJohn Marino snap_seg = NULL;
4886d7f5d3SJohn Marino } else if (lv_is_cow(lv)) {
4986d7f5d3SJohn Marino if (inkernel &&
5086d7f5d3SJohn Marino (snap_active = lv_snapshot_percent(lv, &snap_percent,
5186d7f5d3SJohn Marino &percent_range)))
5286d7f5d3SJohn Marino if (percent_range == PERCENT_INVALID)
5386d7f5d3SJohn Marino snap_active = 0;
5486d7f5d3SJohn Marino }
5586d7f5d3SJohn Marino
5686d7f5d3SJohn Marino /* FIXME Add -D arg to skip this! */
5786d7f5d3SJohn Marino if (inkernel && snap_active)
5886d7f5d3SJohn Marino active_str = "ACTIVE ";
5986d7f5d3SJohn Marino else
6086d7f5d3SJohn Marino active_str = "inactive ";
6186d7f5d3SJohn Marino
6286d7f5d3SJohn Marino if (lv_is_origin(lv))
6386d7f5d3SJohn Marino snapshot_str = "Original";
6486d7f5d3SJohn Marino else if (lv_is_cow(lv))
6586d7f5d3SJohn Marino snapshot_str = "Snapshot";
6686d7f5d3SJohn Marino else
6786d7f5d3SJohn Marino snapshot_str = " ";
6886d7f5d3SJohn Marino
6986d7f5d3SJohn Marino log_print("%s%s '%s%s/%s' [%s] %s", active_str, snapshot_str,
7086d7f5d3SJohn Marino cmd->dev_dir, lv->vg->name, lv->name,
7186d7f5d3SJohn Marino display_size(cmd, lv->size),
7286d7f5d3SJohn Marino get_alloc_string(lv->alloc));
7386d7f5d3SJohn Marino
7486d7f5d3SJohn Marino lv_total++;
7586d7f5d3SJohn Marino
7686d7f5d3SJohn Marino lv_capacity_total += lv->size;
7786d7f5d3SJohn Marino
7886d7f5d3SJohn Marino return ECMD_PROCESSED;
7986d7f5d3SJohn Marino }
8086d7f5d3SJohn Marino
lvscan(struct cmd_context * cmd,int argc,char ** argv)8186d7f5d3SJohn Marino int lvscan(struct cmd_context *cmd, int argc, char **argv)
8286d7f5d3SJohn Marino {
8386d7f5d3SJohn Marino if (argc) {
8486d7f5d3SJohn Marino log_error("No additional command line arguments allowed");
8586d7f5d3SJohn Marino return EINVALID_CMD_LINE;
8686d7f5d3SJohn Marino }
8786d7f5d3SJohn Marino
8886d7f5d3SJohn Marino return process_each_lv(cmd, argc, argv, 0, NULL,
8986d7f5d3SJohn Marino &lvscan_single);
9086d7f5d3SJohn Marino }
91