Fix free space handling with LVM LVs.

The previous commit worked for resizing LVM.
However, it is better to do special handling of LVMs in
insert/removePreviewPartition.

BUG: 399772
This commit is contained in:
Andrius Štikonas 2018-10-19 19:55:35 +01:00
parent 9fa2d194ae
commit b06af11357
2 changed files with 12 additions and 11 deletions

View File

@ -20,6 +20,7 @@
#include "core/partition.h"
#include "core/device.h"
#include "core/lvmdevice.h"
#include "jobs/job.h"
@ -51,6 +52,10 @@ void Operation::insertPreviewPartition(Device& device, Partition& p)
device.partitionTable()->removeUnallocated();
p.parent()->insert(&p);
if (device.type() == Device::Type::LVM_Device) {
const LvmDevice& lvm = static_cast<const LvmDevice&>(device);
lvm.setFreePE(lvm.freePE() - p.length());
}
device.partitionTable()->updateUnallocated(device);
}
@ -59,8 +64,14 @@ void Operation::removePreviewPartition(Device& device, Partition& p)
{
Q_ASSERT(device.partitionTable());
if (p.parent()->remove(&p))
if (p.parent()->remove(&p)) {
if (device.type() == Device::Type::LVM_Device) {
const LvmDevice& lvm = static_cast<const LvmDevice&>(device);
lvm.setFreePE(lvm.freePE() + p.length());
}
device.partitionTable()->updateUnallocated(device);
}
else
qWarning() << "failed to remove partition " << p.deviceNode() << " at " << &p << " from preview.";
}

View File

@ -121,11 +121,6 @@ bool ResizeOperation::targets(const Partition& p) const
void ResizeOperation::preview()
{
if (targetDevice().type() == Device::Type::LVM_Device) {
const LvmDevice& lvm = static_cast<const LvmDevice&>(targetDevice());
lvm.setFreePE(lvm.freePE() + partition().lastSector() - newLastSector());
}
// If the operation has already been executed, the partition will of course have newFirstSector and
// newLastSector as first and last sector. But to remove it from its original position, we need to
// temporarily set these values back to where they were before the operation was executed.
@ -144,11 +139,6 @@ void ResizeOperation::preview()
void ResizeOperation::undo()
{
if (targetDevice().type() == Device::Type::LVM_Device) {
const LvmDevice& lvm = static_cast<const LvmDevice&>(targetDevice());
lvm.setFreePE(lvm.freePE() - origLastSector() + partition().lastSector());
}
removePreviewPartition(targetDevice(), partition());
partition().setFirstSector(origFirstSector());
partition().setLastSector(origLastSector());