From b1cd46ef97898251b0e5b970c99e933e0a100a64 Mon Sep 17 00:00:00 2001 From: Chantara Tith Date: Thu, 26 May 2016 00:03:03 +0700 Subject: [PATCH] Add support for reading LVM PV info --- src/fs/lvm2_pv.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++++- src/fs/lvm2_pv.h | 7 ++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/fs/lvm2_pv.cpp b/src/fs/lvm2_pv.cpp index 85bc640..99fc26e 100644 --- a/src/fs/lvm2_pv.cpp +++ b/src/fs/lvm2_pv.cpp @@ -110,7 +110,7 @@ bool lvm2_pv::remove(Report& report, const QString& deviceNode) const bool lvm2_pv::resize(Report& report, const QString& deviceNode, qint64 length) const { - // TODO: check if the it is legal to reize + // TODO: check if the it is legal to resize const QString len = QString::number(length / 512) + QStringLiteral("s"); ExternalCommand cmd(report, QStringLiteral("lvm"), { QStringLiteral("pvresize"), QStringLiteral("--setphysicalvolumesize"), len, deviceNode }); @@ -136,4 +136,65 @@ QString lvm2_pv::getVGName(const QString& deviceNode) //PV node return QString(); } +qint64 lvm2_pv::getTotalPE(const QString& deviceNode) const { + ExternalCommand cmd( QStringLiteral("lvm"), + { QStringLiteral("pvdisplay"), QStringLiteral("--verbose"), deviceNode }); + if (cmd.run(-1) && cmd.exitCode() == 0) { + QRegularExpression re(QStringLiteral("Total PE\\h+(\\w+)")); + QRegularExpressionMatch totalPE = re.match(cmd.output()); + if (totalPE.hasMatch()) + return totalPE.captured(1).toLongLong(); + } + return -1; + +} + +qint64 lvm2_pv::getFreePE(const QString& deviceNode) const { + ExternalCommand cmd( QStringLiteral("lvm"), + { QStringLiteral("pvdisplay"), QStringLiteral("--verbose"), deviceNode }); + if (cmd.run(-1) && cmd.exitCode() == 0) { + QRegularExpression re(QStringLiteral("Free PE\\h+(\\w+)")); + QRegularExpressionMatch freePE = re.match(cmd.output()); + if (freePE.hasMatch()) + return freePE.captured(1).toLongLong(); + } + return -1; +} + +qint64 lvm2_pv::getAllocatedPE(const QString& deviceNode) const { + ExternalCommand cmd( QStringLiteral("lvm"), + { QStringLiteral("pvdisplay"), QStringLiteral("--verbose"), deviceNode }); + if (cmd.run(-1) && cmd.exitCode() == 0) { + QRegularExpression re(QStringLiteral("Allocated PE\\h+(\\d+)")); + QRegularExpressionMatch allocatedPE = re.match(cmd.output()); + if (allocatedPE.hasMatch()) + return allocatedPE.captured(1).toLongLong(); + } + return -1; +} + +qint64 lvm2_pv::getPVSize(const QString& deviceNode) const { + ExternalCommand cmd( QStringLiteral("lvm"), + { QStringLiteral("pvdisplay"), QStringLiteral("--verbose"), QStringLiteral("--units"), QStringLiteral("B"), deviceNode }); + if (cmd.run(-1) && cmd.exitCode() == 0) { + QRegularExpression re(QStringLiteral("PV Size\\h+(\\d+)")); + QRegularExpressionMatch PVSize = re.match(cmd.output()); + if (PVSize.hasMatch()) + return PVSize.captured(1).toLongLong(); + } + return -1; +} + +qint64 lvm2_pv::getPESize(const QString& deviceNode) const { + ExternalCommand cmd( QStringLiteral("lvm"), + { QStringLiteral("pvdisplay"), QStringLiteral("--verbose"), QStringLiteral("--units"), QStringLiteral("B"), deviceNode }); + if (cmd.run(-1) && cmd.exitCode() == 0) { + QRegularExpression re(QStringLiteral("PE Size\\h+(\\d+)")); + QRegularExpressionMatch PESize = re.match(cmd.output()); + if (PESize.hasMatch()) + return PESize.captured(1).toLongLong(); + } + return -1; +} + } diff --git a/src/fs/lvm2_pv.h b/src/fs/lvm2_pv.h index 5bee583..029881f 100644 --- a/src/fs/lvm2_pv.h +++ b/src/fs/lvm2_pv.h @@ -51,6 +51,7 @@ public: // bool writeLabel(Report& report, const QString& deviceNode, const QString& newLabel) override; bool updateUUID(Report& report, const QString& deviceNode) const override; + CommandSupportType supportGetUsed() const override { return m_GetUsed; } @@ -92,6 +93,12 @@ public: SupportTool supportToolName() const override; bool supportToolFound() const override; + qint64 getTotalPE(const QString& deviceNode) const; + qint64 getFreePE(const QString& deviceNode) const; + qint64 getAllocatedPE(const QString& deviceNode) const; + qint64 getPESize(const QString& deviceNode) const; // return PE size in bytes + qint64 getPVSize(const QString& deviceNode) const; // return PV size in bytes + static QString getVGName(const QString& deviceNode); public: