From af7bbe5a6c00a95d2e2deb0accbe2c0ed375df02 Mon Sep 17 00:00:00 2001 From: Heinz Mauelshagen Date: Tue, 5 Feb 2002 14:31:57 +0000 Subject: [PATCH] Poor mans lvmdiskscan --- tools/Makefile.in | 1 + tools/commands.h | 3 +- tools/lvmdiskscan.c | 146 ++++++++++++++++++++++++++++++++++++++++++++ tools/stub.h | 1 - 4 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 tools/lvmdiskscan.c diff --git a/tools/Makefile.in b/tools/Makefile.in index 1c82b288f..bff661830 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -28,6 +28,7 @@ SOURCES=\ lvextend.c \ lvm.c \ lvmchange.c \ + lvmdiskscan.c \ lvreduce.c \ lvremove.c \ lvrename.c \ diff --git a/tools/commands.h b/tools/commands.h index 6e5049c12..3c8acea24 100644 --- a/tools/commands.h +++ b/tools/commands.h @@ -149,8 +149,7 @@ xx(lvmdiskscan, "lvmdiskscan\n" "\t[-d/--debug]\n" "\t[-h/-?/--help]\n" - "\t[-l/--lvmpartition]\n" - "\t[-v/--verbose]\n", + "\t[-l/--lvmpartition]\n", lvmpartition_ARG) diff --git a/tools/lvmdiskscan.c b/tools/lvmdiskscan.c new file mode 100644 index 000000000..a20b917d9 --- /dev/null +++ b/tools/lvmdiskscan.c @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2002 Sistina Software + * + * This file is released under the GPL. + * + */ + +/* + * Changelog + * + * 05/02/2002 - First drop [HM] + */ + +#include "tools.h" + +int _get_max_dev_name_len(void); +void _count(struct device*, int*, int*); +void _print(struct device*, uint64_t, char*); +int _check_device(struct device*); + +int disks_found = 0; +int parts_found = 0; +int pv_disks_found = 0; +int pv_parts_found = 0; +int max_len; + +int lvmdiskscan(int argc, char **argv) +{ + uint64_t size; + struct dev_iter *iter; + struct device *dev; + struct physical_volume *pv; + + if (arg_count(lvmpartition_ARG)) + log_print("WARNING: only considering LVM devices"); + + max_len = _get_max_dev_name_len(); + + if (!(iter = dev_iter_create(fid->cmd->filter))) { + log_error("dev_iter_create failed"); + return 0; + } + + /* Do scan */ + for (dev = dev_iter_get(iter); dev; dev = dev_iter_get(iter)) { + /* Try if it is a PV first */ + if((pv = fid->ops->pv_read(fid, dev_name(dev)))) { + if(!dev_get_size(dev, &size)) { + log_error("Couldn't get size of \"%s\"", + dev_name(dev)); + continue; + } + _print(dev, size, "LVM physical volume"); + _count(dev, &pv_disks_found, &pv_parts_found); + continue; + } + /* If user just wants PVs we are done */ + if (arg_count(lvmpartition_ARG)) continue; + + /* What other device is it? */ + if(!_check_device(dev)) continue; + } + dev_iter_destroy(iter); + + /* Display totals */ + if (!arg_count(lvmpartition_ARG)) { + log_print("%d disk%s", + disks_found, disks_found == 1 ? "" : "s"); + log_print("%d partition%s", + parts_found, parts_found == 1 ? "" : "s"); + } + log_print("%d LVM physical volume whole disk%s", + pv_disks_found, pv_disks_found == 1 ? "" : "s"); + log_print("%d LVM physical volume%s", + pv_parts_found, pv_parts_found == 1 ? "" : "s"); + + return 0; +} + + +int _check_device(struct device *dev) { + char buffer; + uint64_t size; + + if (!dev_open(dev, 0)) { + return 0; + } + if (dev_read(dev, 0, 1, &buffer) != 1) { + dev_close(dev); + return 0; + } + if(!dev_get_size(dev, &size)) { + log_error("Couldn't get size of \"%s\"", + dev_name(dev)); + } + _print(dev, size, NULL); + _count(dev, &disks_found, &parts_found); + if (!dev_close(dev)) { + log_error("dev_close on \"%s\" failed", dev_name(dev)); + return 0; + } + return 1; +} + + +int _get_max_dev_name_len(void) { + int len = 0; + int max_len = 0; + struct dev_iter *iter; + struct device *dev; + + if (!(iter = dev_iter_create(fid->cmd->filter))) { + log_error("dev_iter_create failed"); + return 0; + } + + /* Do scan */ + for (dev = dev_iter_get(iter); dev; dev = dev_iter_get(iter)) { + len = strlen(dev_name(dev)); + if (len > max_len) max_len = len; + } + dev_iter_destroy(iter); + + return max_len; +} + + +void _count(struct device *dev, int *disks, int *parts) { + int c = dev_name(dev)[strlen(dev_name(dev))-1]; + + if(!isdigit(c)) (*disks)++; + else (*parts)++; +} + +void _print(struct device *dev, uint64_t size, char *what) { + char *dummy = display_size(size/2, SIZE_SHORT); + const char *name = dev_name(dev); + + if(!what) { + + what = ""; + } + + log_print("%-*s [%15s] %s", max_len, name, dummy, what); + dbg_free(dummy); +} diff --git a/tools/stub.h b/tools/stub.h index 908ee753b..e0bcb107d 100644 --- a/tools/stub.h +++ b/tools/stub.h @@ -7,7 +7,6 @@ #define unimplemented \ { log_error("Command not implemented yet."); return ECMD_FAILED;} int e2fsadm(int argc, char **argv) unimplemented -int lvmdiskscan(int argc, char **argv) unimplemented int lvmsadc(int argc, char **argv) unimplemented int lvmsar(int argc, char **argv) unimplemented int pvdata(int argc, char **argv) unimplemented -- 2.43.5