From 7cd1fd6eb743223cf84bfc9a293f83e8553393b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrius=20=C5=A0tikonas?= Date: Fri, 29 Apr 2016 17:55:55 +0100 Subject: [PATCH] Initial LUKS shrink support. --- src/fs/luks.cpp | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/fs/luks.cpp b/src/fs/luks.cpp index 5791962..1146d7f 100644 --- a/src/fs/luks.cpp +++ b/src/fs/luks.cpp @@ -73,6 +73,7 @@ void luks::init() m_GetLabel = cmdSupportFileSystem; m_UpdateUUID = findExternal(QStringLiteral("cryptsetup")) ? cmdSupportFileSystem : cmdSupportNone; m_Grow = findExternal(QStringLiteral("cryptsetup")) ? cmdSupportFileSystem : cmdSupportNone; + m_Shrink = m_Grow; m_Check = cmdSupportCore; m_Copy = cmdSupportCore; m_Move = cmdSupportCore; @@ -90,7 +91,7 @@ bool luks::supportToolFound() const m_Check != cmdSupportNone && m_UpdateUUID != cmdSupportNone && m_Grow != cmdSupportNone && -// m_Shrink != cmdSupportNone && + m_Shrink != cmdSupportNone && m_Copy != cmdSupportNone && m_Move != cmdSupportNone && m_Backup != cmdSupportNone && @@ -474,7 +475,7 @@ bool luks::writeLabel(Report& report, const QString& deviceNode, const QString& return m_innerFs->writeLabel(report, mapperName(deviceNode), newLabel); } -bool luks::resize(Report& report, const QString& deviceNode, qint64) const +bool luks::resize(Report& report, const QString& deviceNode, qint64 newLength) const { Q_ASSERT(m_innerFs); @@ -482,18 +483,28 @@ bool luks::resize(Report& report, const QString& deviceNode, qint64) const if (mapperNode.isEmpty()) return false; - ExternalCommand cryptResizeCmd(report, QStringLiteral("cryptsetup"), { QStringLiteral("resize"), mapperNode }); - report.line() << xi18nc("@info/plain", "Resizing LUKS crypt on partition %1.", deviceNode); - - bool rval = false; - if (cryptResizeCmd.run(-1)) + if ( newLength - length() > 0 ) { - rval = m_innerFs->resize(report, mapperNode, -1); - } - else - report.line() << xi18nc("@info/plain", "Resizing encrypted file system on partition %1 failed.", deviceNode); + ExternalCommand cryptResizeCmd(report, QStringLiteral("cryptsetup"), { QStringLiteral("resize"), mapperNode }); + report.line() << xi18nc("@info/plain", "Resizing LUKS crypt on partition %1.", deviceNode); - return rval; + if (cryptResizeCmd.run(-1)) + { + return m_innerFs->resize(report, mapperNode, -1); + } + else + report.line() << xi18nc("@info/plain", "Resizing encrypted file system on partition %1 failed.", deviceNode); + } + else if (m_innerFs->resize(report, mapperNode, newLength - getPayloadOffset(deviceNode).toInt() * m_logicalSectorSize)) + { + ExternalCommand cryptResizeCmd(report, QStringLiteral("cryptsetup"), { QStringLiteral("-b"), QString::number(newLength), QStringLiteral("resize"), mapperNode }); + report.line() << xi18nc("@info/plain", "Resizing LUKS crypt on partition %1.", deviceNode); + if (cryptResizeCmd.run(-1)) + { + return true; + } + } + return false; } QString luks::readUUID(const QString& deviceNode) const