- Including vgName in CreateVolumeGroupOperation description.
- Don't delete LVM PVs that are being targeted by CreateVolumeGroupOperations. - Don't shrink or move LVM PVs that are being targeted by CreateVolumeGroupOperations.
This commit is contained in:
parent
34cfc63da4
commit
1e95d01923
|
@ -35,14 +35,15 @@
|
||||||
CreateVolumeGroupOperation::CreateVolumeGroupOperation(const QString& vgName, const QVector<const Partition*>& pvList, const qint32 peSize) :
|
CreateVolumeGroupOperation::CreateVolumeGroupOperation(const QString& vgName, const QVector<const Partition*>& pvList, const qint32 peSize) :
|
||||||
Operation(),
|
Operation(),
|
||||||
m_CreateVolumeGroupJob(new CreateVolumeGroupJob(vgName, pvList, peSize)),
|
m_CreateVolumeGroupJob(new CreateVolumeGroupJob(vgName, pvList, peSize)),
|
||||||
m_PVList(pvList)
|
m_PVList(pvList),
|
||||||
|
m_vgName(vgName)
|
||||||
{
|
{
|
||||||
addJob(createVolumeGroupJob());
|
addJob(createVolumeGroupJob());
|
||||||
}
|
}
|
||||||
|
|
||||||
QString CreateVolumeGroupOperation::description() const
|
QString CreateVolumeGroupOperation::description() const
|
||||||
{
|
{
|
||||||
return xi18nc("@info/plain", "Create a new LVM volume group.");
|
return xi18nc("@info/plain", "Create a new LVM volume group named \'%1\'.", m_vgName);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CreateVolumeGroupOperation::targets(const Partition& partition) const
|
bool CreateVolumeGroupOperation::targets(const Partition& partition) const
|
||||||
|
|
|
@ -69,6 +69,7 @@ protected:
|
||||||
private:
|
private:
|
||||||
CreateVolumeGroupJob* m_CreateVolumeGroupJob;
|
CreateVolumeGroupJob* m_CreateVolumeGroupJob;
|
||||||
const QVector<const Partition*> m_PVList;
|
const QVector<const Partition*> m_PVList;
|
||||||
|
QString m_vgName;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.*
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.*
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
|
#include "ops/createvolumegroupoperation.h"
|
||||||
#include "ops/deleteoperation.h"
|
#include "ops/deleteoperation.h"
|
||||||
|
|
||||||
#include "core/partition.h"
|
#include "core/partition.h"
|
||||||
|
@ -110,7 +111,7 @@ void DeleteOperation::checkAdjustLogicalNumbers(Partition& p, bool undo)
|
||||||
@param p the Partition in question, may be nullptr.
|
@param p the Partition in question, may be nullptr.
|
||||||
@return true if @p p can be deleted.
|
@return true if @p p can be deleted.
|
||||||
*/
|
*/
|
||||||
bool DeleteOperation::canDelete(const Partition* p)
|
bool DeleteOperation::canDelete(const Partition* p, const QList<Operation *> pendingOps)
|
||||||
{
|
{
|
||||||
if (p == nullptr)
|
if (p == nullptr)
|
||||||
return false;
|
return false;
|
||||||
|
@ -118,6 +119,26 @@ bool DeleteOperation::canDelete(const Partition* p)
|
||||||
if (p->isMounted())
|
if (p->isMounted())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (p->fileSystem().type() == FileSystem::Type::Lvm2_PV) {
|
||||||
|
// See if there is a newly created VG targeting this partition
|
||||||
|
for (Operation *op : qAsConst(pendingOps)) {
|
||||||
|
if (dynamic_cast<CreateVolumeGroupOperation *>(op) && op->targets(*p))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (p->fileSystem().type() == FileSystem::Type::Luks || p->fileSystem().type() == FileSystem::Type::Luks2) {
|
||||||
|
// See if innerFS is LVM
|
||||||
|
FileSystem *fs = static_cast<const FS::luks *>(&p->fileSystem())->innerFS();
|
||||||
|
|
||||||
|
if (fs->type() == FileSystem::Type::Lvm2_PV) {
|
||||||
|
// See if there is a newly created VG targeting this partition
|
||||||
|
for (Operation *op : qAsConst(pendingOps)) {
|
||||||
|
if (dynamic_cast<CreateVolumeGroupOperation *>(op) && op->targets(*p))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (p->roles().has(PartitionRole::Unallocated))
|
if (p->roles().has(PartitionRole::Unallocated))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ public:
|
||||||
bool targets(const Device& d) const override;
|
bool targets(const Device& d) const override;
|
||||||
bool targets(const Partition& p) const override;
|
bool targets(const Partition& p) const override;
|
||||||
|
|
||||||
static bool canDelete(const Partition* p);
|
static bool canDelete(const Partition* p, const QList<Operation *> pendingOps = QList<Operation *>());
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Device& targetDevice() {
|
Device& targetDevice() {
|
||||||
|
|
|
@ -30,8 +30,10 @@
|
||||||
#include "jobs/movefilesystemjob.h"
|
#include "jobs/movefilesystemjob.h"
|
||||||
|
|
||||||
#include "ops/checkoperation.h"
|
#include "ops/checkoperation.h"
|
||||||
|
#include "ops/createvolumegroupoperation.h"
|
||||||
|
|
||||||
#include "fs/filesystem.h"
|
#include "fs/filesystem.h"
|
||||||
|
#include "fs/luks.h"
|
||||||
|
|
||||||
#include "util/capacity.h"
|
#include "util/capacity.h"
|
||||||
#include "util/report.h"
|
#include "util/report.h"
|
||||||
|
@ -346,11 +348,31 @@ bool ResizeOperation::canGrow(const Partition* p)
|
||||||
@param p the Partition in question, may be nullptr.
|
@param p the Partition in question, may be nullptr.
|
||||||
@return true if @p p can be shrunk.
|
@return true if @p p can be shrunk.
|
||||||
*/
|
*/
|
||||||
bool ResizeOperation::canShrink(const Partition* p)
|
bool ResizeOperation::canShrink(const Partition* p, const QList<Operation *> pendingOps)
|
||||||
{
|
{
|
||||||
if (p == nullptr)
|
if (p == nullptr)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (p->fileSystem().type() == FileSystem::Type::Lvm2_PV) {
|
||||||
|
// See if there is a newly created VG targeting this partition
|
||||||
|
for (Operation *op : qAsConst(pendingOps)) {
|
||||||
|
if (dynamic_cast<CreateVolumeGroupOperation *>(op) && op->targets(*p))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (p->fileSystem().type() == FileSystem::Type::Luks || p->fileSystem().type() == FileSystem::Type::Luks2) {
|
||||||
|
// See if innerFS is LVM
|
||||||
|
FileSystem *fs = static_cast<const FS::luks *>(&p->fileSystem())->innerFS();
|
||||||
|
|
||||||
|
if (fs->type() == FileSystem::Type::Lvm2_PV) {
|
||||||
|
// See if there is a newly created VG targeting this partition
|
||||||
|
for (Operation *op : qAsConst(pendingOps)) {
|
||||||
|
if (dynamic_cast<CreateVolumeGroupOperation *>(op) && op->targets(*p))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// we can always grow, shrink or move a partition not yet written to disk
|
// we can always grow, shrink or move a partition not yet written to disk
|
||||||
if (p->state() == Partition::State::New && !p->roles().has(PartitionRole::Luks))
|
if (p->state() == Partition::State::New && !p->roles().has(PartitionRole::Luks))
|
||||||
return true;
|
return true;
|
||||||
|
@ -368,11 +390,31 @@ bool ResizeOperation::canShrink(const Partition* p)
|
||||||
@param p the Partition in question, may be nullptr.
|
@param p the Partition in question, may be nullptr.
|
||||||
@return true if @p p can be moved.
|
@return true if @p p can be moved.
|
||||||
*/
|
*/
|
||||||
bool ResizeOperation::canMove(const Partition* p)
|
bool ResizeOperation::canMove(const Partition* p, const QList<Operation *> pendingOps)
|
||||||
{
|
{
|
||||||
if (p == nullptr)
|
if (p == nullptr)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (p->fileSystem().type() == FileSystem::Type::Lvm2_PV) {
|
||||||
|
// See if there is a newly created VG targeting this partition
|
||||||
|
for (Operation *op : qAsConst(pendingOps)) {
|
||||||
|
if (dynamic_cast<CreateVolumeGroupOperation *>(op) && op->targets(*p))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (p->fileSystem().type() == FileSystem::Type::Luks || p->fileSystem().type() == FileSystem::Type::Luks2) {
|
||||||
|
// See if innerFS is LVM
|
||||||
|
FileSystem *fs = static_cast<const FS::luks *>(&p->fileSystem())->innerFS();
|
||||||
|
|
||||||
|
if (fs->type() == FileSystem::Type::Lvm2_PV) {
|
||||||
|
// See if there is a newly created VG targeting this partition
|
||||||
|
for (Operation *op : qAsConst(pendingOps)) {
|
||||||
|
if (dynamic_cast<CreateVolumeGroupOperation *>(op) && op->targets(*p))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// we can always grow, shrink or move a partition not yet written to disk
|
// we can always grow, shrink or move a partition not yet written to disk
|
||||||
if (p->state() == Partition::State::New)
|
if (p->state() == Partition::State::New)
|
||||||
// too many bad things can happen for LUKS partitions
|
// too many bad things can happen for LUKS partitions
|
||||||
|
|
|
@ -86,8 +86,8 @@ public:
|
||||||
bool targets(const Partition& p) const override;
|
bool targets(const Partition& p) const override;
|
||||||
|
|
||||||
static bool canGrow(const Partition* p);
|
static bool canGrow(const Partition* p);
|
||||||
static bool canShrink(const Partition* p);
|
static bool canShrink(const Partition* p, const QList<Operation *> pendingOps = QList<Operation *>());
|
||||||
static bool canMove(const Partition* p);
|
static bool canMove(const Partition* p, const QList<Operation *> pendingOps = QList<Operation *>());
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Device& targetDevice() {
|
Device& targetDevice() {
|
||||||
|
|
Loading…
Reference in New Issue