From 2c7b3f2bfa944f071c830a8192638d5c7a138331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrius=20=C5=A0tikonas?= Date: Mon, 18 Nov 2019 21:16:05 +0200 Subject: [PATCH] Fix resizing of encrypted partitions. BUG: 413883 --- src/fs/luks.cpp | 10 ++++++---- src/fs/luks2.cpp | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/fs/luks.cpp b/src/fs/luks.cpp index 6215554..dcc7cdb 100644 --- a/src/fs/luks.cpp +++ b/src/fs/luks.cpp @@ -492,18 +492,20 @@ bool luks::resize(Report& report, const QString& deviceNode, qint64 newLength) c if (mapperName().isEmpty()) return false; - if ( newLength - length() * sectorSize() > 0 ) + const qint64 sizeDiff = newLength - length() * sectorSize(); + const qint64 newPayloadSize = m_PayloadSize + sizeDiff; + if ( sizeDiff > 0 ) // grow { ExternalCommand cryptResizeCmd(report, QStringLiteral("cryptsetup"), { QStringLiteral("resize"), mapperName() }); report.line() << xi18nc("@info:progress", "Resizing LUKS crypt on partition %1.", deviceNode); if (cryptResizeCmd.run(-1) && cryptResizeCmd.exitCode() == 0) - return m_innerFs->resize(report, mapperName(), m_PayloadSize); + return m_innerFs->resize(report, mapperName(), newPayloadSize); } - else if (m_innerFs->resize(report, mapperName(), m_PayloadSize)) + else if (m_innerFs->resize(report, mapperName(), newPayloadSize)) // shrink { ExternalCommand cryptResizeCmd(report, QStringLiteral("cryptsetup"), - { QStringLiteral("--size"), QString::number(m_PayloadSize / 512), // LUKS1 payload length is specified in multiples of 512 bytes + { QStringLiteral("--size"), QString::number(newPayloadSize / 512), // LUKS1 payload length is specified in multiples of 512 bytes QStringLiteral("resize"), mapperName() }); report.line() << xi18nc("@info:progress", "Resizing LUKS crypt on partition %1.", deviceNode); if (cryptResizeCmd.run(-1) && cryptResizeCmd.exitCode() == 0) diff --git a/src/fs/luks2.cpp b/src/fs/luks2.cpp index dfc9db0..a315da0 100644 --- a/src/fs/luks2.cpp +++ b/src/fs/luks2.cpp @@ -89,7 +89,9 @@ bool luks2::resize(Report& report, const QString& deviceNode, qint64 newLength) if (mapperName().isEmpty()) return false; - if ( newLength - length() * sectorSize() > 0 ) + const qint64 sizeDiff = newLength - length() * sectorSize(); + const qint64 newPayloadSize = m_PayloadSize + sizeDiff; + if ( sizeDiff > 0 ) // grow { ExternalCommand cryptResizeCmd(report, QStringLiteral("cryptsetup"), { QStringLiteral("resize"), mapperName() }); report.line() << xi18nc("@info:progress", "Resizing LUKS crypt on partition %1.", deviceNode); @@ -102,12 +104,12 @@ bool luks2::resize(Report& report, const QString& deviceNode, qint64 newLength) if (!cryptResizeCmd.start(-1)) return false; if ( cryptResizeCmd.exitCode() == 0 ) - return m_innerFs->resize(report, mapperName(), m_PayloadSize); + return m_innerFs->resize(report, mapperName(), newPayloadSize); } - else if (m_innerFs->resize(report, mapperName(), m_PayloadSize)) + else if (m_innerFs->resize(report, mapperName(), newPayloadSize)) { ExternalCommand cryptResizeCmd(report, QStringLiteral("cryptsetup"), - { QStringLiteral("--size"), QString::number(m_PayloadSize / 512), // FIXME, LUKS2 can have different sector sizes + { QStringLiteral("--size"), QString::number(newPayloadSize / 512), // FIXME, LUKS2 can have different sector sizes QStringLiteral("resize"), mapperName() }); report.line() << xi18nc("@info:progress", "Resizing LUKS crypt on partition %1.", deviceNode); if (m_KeyLocation == KeyLocation::keyring) {