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