diff --git a/src/core/lvmdevice.cpp b/src/core/lvmdevice.cpp index 96957be..203fb0b 100644 --- a/src/core/lvmdevice.cpp +++ b/src/core/lvmdevice.cpp @@ -83,6 +83,12 @@ LvmDevice::LvmDevice(const QString& vgName, const QString& iconName) */ QVector LvmDevice::s_DirtyPVs; + +/** + * shared list of PVs paths that are member of VGs that will be deleted soon. + */ +QVector LvmDevice::s_OrphanPVs; + LvmDevice::~LvmDevice() { } @@ -199,6 +205,8 @@ Partition* LvmDevice::scanPartition(const QString& lvPath, PartitionTable* pTabl */ void LvmDevice::scanSystemLVM(QList& devices) { + LvmDevice::s_OrphanPVs.clear(); + QList lvmList; for (const auto &vgName : getVGs()) { lvmList.append(new LvmDevice(vgName)); diff --git a/src/core/lvmdevice.h b/src/core/lvmdevice.h index f4413d8..089719b 100644 --- a/src/core/lvmdevice.h +++ b/src/core/lvmdevice.h @@ -55,6 +55,7 @@ public: qint64 partitionSize(QString& partitionPath) const override; static QVector s_DirtyPVs; + static QVector s_OrphanPVs; static void scanSystemLVM(QList& devices); diff --git a/src/ops/removevolumegroupoperation.cpp b/src/ops/removevolumegroupoperation.cpp index 605de3b..1c16433 100644 --- a/src/ops/removevolumegroupoperation.cpp +++ b/src/ops/removevolumegroupoperation.cpp @@ -18,6 +18,7 @@ #include "ops/removevolumegroupoperation.h" #include "jobs/removevolumegroupjob.h" +#include "core/lvmdevice.h" #include "core/partition.h" #include "core/partitiontable.h" #include "core/volumemanagerdevice.h" @@ -45,11 +46,28 @@ QString RemoveVolumeGroupOperation::description() const void RemoveVolumeGroupOperation::preview() { m_PartitionTable = device().partitionTable(); + + if (device().type() == Device::Type::LVM_Device) { + LvmDevice& lvm = static_cast(device()); + + LvmDevice::s_OrphanPVs << lvm.physicalVolumes(); + } + device().setPartitionTable(new PartitionTable(PartitionTable::vmd, 0, device().totalLogical() - 1)); } void RemoveVolumeGroupOperation::undo() { + if (device().type() == Device::Type::LVM_Device) { + LvmDevice& lvm = static_cast(device()); + + const QVector constOrphanList = LvmDevice::s_OrphanPVs; + + for (const Partition* p : constOrphanList) + if (lvm.physicalVolumes().contains(p)) + LvmDevice::s_OrphanPVs.removeAll(p); + } + device().setPartitionTable(m_PartitionTable); }