File indexing completed on 2024-04-28 05:45:45

0001 /*
0002     SPDX-FileCopyrightText: 2016 Chantara Tith <tith.chantara@gmail.com>
0003     SPDX-FileCopyrightText: 2016-2018 Andrius Štikonas <andrius@stikonas.eu>
0004     SPDX-FileCopyrightText: 2018-2019 Caio Jordão Carvalho <caiojcarvalho@gmail.com>
0005     SPDX-FileCopyrightText: 2019 Yuri Chornoivan <yurchor@ukr.net>
0006 
0007     SPDX-License-Identifier: GPL-3.0-or-later
0008 */
0009 
0010 #ifndef KPMCORE_LVMDEVICE_H
0011 #define KPMCORE_LVMDEVICE_H
0012 
0013 #include "core/device.h"
0014 #include "core/volumemanagerdevice.h"
0015 #include "util/libpartitionmanagerexport.h"
0016 
0017 #include <QHash>
0018 #include <QString>
0019 #include <QObject>
0020 #include <QStringList>
0021 #include <QtGlobal>
0022 #include <QVector>
0023 
0024 class PartitionTable;
0025 class Report;
0026 class Partition;
0027 
0028 /** Representation of LVM Volume Group(VG).
0029 
0030     Devices are the outermost entity; they contain a PartitionTable that itself contains Partitions.
0031 
0032     @see Device, VolumeManagerDevice, PartitionTable, Partition
0033 */
0034 class LIBKPMCORE_EXPORT LvmDevice : public VolumeManagerDevice
0035 {
0036     Q_DISABLE_COPY(LvmDevice)
0037 
0038     friend class VolumeManagerDevice;
0039 
0040 public:
0041     explicit LvmDevice(const QString& name, const QString& iconName = QString());
0042     ~LvmDevice() override;
0043 
0044 public:
0045     const QStringList deviceNodes() const override;
0046     const QStringList& partitionNodes() const override;
0047     qint64 partitionSize(QString& partitionPath) const override;
0048 
0049     static QVector<const Partition*> s_DirtyPVs;
0050     static QVector<const Partition*> s_OrphanPVs;
0051 
0052     static const QStringList getVGs();
0053     static const QStringList getLVs(const QString& vgName);
0054 
0055     static qint64 getPeSize(const QString& vgName);
0056     static qint64 getTotalPE(const QString& vgName);
0057     static qint64 getAllocatedPE(const QString& vgName);
0058     static qint64 getFreePE(const QString& vgName);
0059     static QString getUUID(const QString& vgName);
0060     static QString getField(const QString& fieldName, const QString& vgName = QString());
0061 
0062     static qint64 getTotalLE(const QString& lvPath);
0063 
0064     static bool removeLV(Report& report, LvmDevice& d, Partition& p);
0065     static bool createLV(Report& report, LvmDevice& d, Partition& p, const QString& lvName);
0066     static bool createLVSnapshot(Report& report, Partition& p, const QString& name, const qint64 extents = 0);
0067     static bool resizeLV(Report& report, Partition& p);
0068     static bool deactivateLV(Report& report, const Partition& p);
0069     static bool activateLV(const QString& deviceNode);
0070 
0071     static bool removePV(Report& report, LvmDevice& d, const QString& pvPath);
0072     static bool insertPV(Report& report, LvmDevice& d, const QString& pvPath);
0073     static bool movePV(Report& report, const QString& pvPath, const QStringList& destinations = QStringList());
0074 
0075     static bool removeVG(Report& report, LvmDevice& d);
0076     static bool createVG(Report& report, const QString vgName, const QVector<const Partition*>& pvList, const qint32 peSize = 4); // peSize in megabytes
0077     static bool deactivateVG(Report& report, const LvmDevice& d);
0078     static bool activateVG(Report& report, const LvmDevice& d);
0079 
0080 protected:
0081     void initPartitions() override;
0082     const QList<Partition*> scanPartitions(PartitionTable* pTable) const;
0083     Partition* scanPartition(const QString& lvPath, PartitionTable* pTable) const;
0084     qint64 mappedSector(const QString& lvPath, qint64 sector) const override;
0085 
0086 public:
0087     qint64 peSize() const;
0088     qint64 totalPE() const;
0089     qint64 allocatedPE() const;
0090     qint64 freePE() const;
0091     void setFreePE(qint64 freePE) const;
0092     QString UUID() const;
0093     QVector <const Partition*>& physicalVolumes();
0094     const QVector <const Partition*>& physicalVolumes() const;
0095 
0096 protected:
0097     std::unique_ptr<QHash<QString, qint64>>& LVSizeMap() const;
0098 
0099 private:
0100     static void scanSystemLVM(QList<Device*>& devices);
0101 };
0102 
0103 #endif