From d126f0488669a28e8ebc8ef1876401d84626dfb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrius=20=C5=A0tikonas?= Date: Thu, 21 Apr 2016 17:22:48 +0100 Subject: [PATCH] Add initial support for growing LUKS volumes. Added support for filling btrfs, ext and swap partitions. --- src/fs/btrfs.cpp | 3 ++- src/fs/ext2.cpp | 4 +++- src/fs/filesystem.cpp | 2 +- src/fs/linuxswap.cpp | 3 ++- src/fs/luks.cpp | 26 +++++++++++++++++++++++++- src/fs/luks.h | 1 + 6 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/fs/btrfs.cpp b/src/fs/btrfs.cpp index 34336ca..bf3f8cf 100644 --- a/src/fs/btrfs.cpp +++ b/src/fs/btrfs.cpp @@ -143,7 +143,8 @@ bool btrfs::resize(Report& report, const QString& deviceNode, qint64 length) con ExternalCommand mountCmd(report, QStringLiteral("mount"), QStringList() << QStringLiteral("-v") << QStringLiteral("-t") << QStringLiteral("btrfs") << deviceNode << tempDir.path()); if (mountCmd.run(-1) && mountCmd.exitCode() == 0) { - ExternalCommand resizeCmd(report, QStringLiteral("btrfs"), QStringList() << QStringLiteral("filesystem") << QStringLiteral("resize") << QString::number(length) << tempDir.path()); + QString len = length == -1 ? QStringLiteral("max") : QString::number(length); + ExternalCommand resizeCmd(report, QStringLiteral("btrfs"), QStringList() << QStringLiteral("filesystem") << QStringLiteral("resize") << len << tempDir.path()); if (resizeCmd.run(-1) && resizeCmd.exitCode() == 0) rval = true; diff --git a/src/fs/ext2.cpp b/src/fs/ext2.cpp index ad318be..6c9603f 100644 --- a/src/fs/ext2.cpp +++ b/src/fs/ext2.cpp @@ -137,7 +137,9 @@ bool ext2::create(Report& report, const QString& deviceNode) const bool ext2::resize(Report& report, const QString& deviceNode, qint64 length) const { const QString len = QString::number(length / 512) + QStringLiteral("s"); - ExternalCommand cmd(report, QStringLiteral("resize2fs"), QStringList() << deviceNode << len); + const QStringList command = length == -1 ? QStringList() << deviceNode : QStringList() << deviceNode << len; + + ExternalCommand cmd(report, QStringLiteral("resize2fs"), command); return cmd.run(-1) && cmd.exitCode() == 0; } diff --git a/src/fs/filesystem.cpp b/src/fs/filesystem.cpp index b3e233c..8f87611 100644 --- a/src/fs/filesystem.cpp +++ b/src/fs/filesystem.cpp @@ -185,7 +185,7 @@ bool FileSystem::create(Report& report, const QString& deviceNode) const return true; } -/** Resized a FileSystem to a given new length +/** Resize a FileSystem to a given new length @param report Report to write status information to @param deviceNode the device node for the Partition the FileSystem is on @param newLength the new length for the FileSystem in bytes diff --git a/src/fs/linuxswap.cpp b/src/fs/linuxswap.cpp index ddabaa9..29674da 100644 --- a/src/fs/linuxswap.cpp +++ b/src/fs/linuxswap.cpp @@ -83,6 +83,7 @@ bool linuxswap::create(Report& report, const QString& deviceNode) const bool linuxswap::resize(Report& report, const QString& deviceNode, qint64 length) const { + Q_UNUSED(length); const QString label = readLabel(deviceNode); const QString uuid = readUUID(deviceNode); @@ -92,7 +93,7 @@ bool linuxswap::resize(Report& report, const QString& deviceNode, qint64 length) if (!uuid.isEmpty()) args << QStringLiteral("-U") << uuid; - args << deviceNode << QString::number(length / 1024); + args << deviceNode; ExternalCommand cmd(report, QStringLiteral("mkswap"), args); return cmd.run(-1) && cmd.exitCode() == 0; diff --git a/src/fs/luks.cpp b/src/fs/luks.cpp index 54ff999..ae5864d 100644 --- a/src/fs/luks.cpp +++ b/src/fs/luks.cpp @@ -25,6 +25,7 @@ #include "util/capacity.h" #include "util/externalcommand.h" +#include "util/report.h" #include #include @@ -69,6 +70,7 @@ void luks::init() { m_Create = findExternal(QStringLiteral("cryptsetup")) ? cmdSupportFileSystem : cmdSupportNone; m_UpdateUUID = findExternal(QStringLiteral("cryptsetup")) ? cmdSupportFileSystem : cmdSupportNone; + m_Grow = findExternal(QStringLiteral("cryptsetup")) ? cmdSupportFileSystem : cmdSupportNone; m_Copy = cmdSupportCore; m_Move = cmdSupportCore; m_Backup = cmdSupportCore; @@ -129,7 +131,7 @@ bool luks::supportToolFound() const m_Create != cmdSupportNone && // m_Check != cmdSupportNone && m_UpdateUUID != cmdSupportNone && -// m_Grow != cmdSupportNone && + m_Grow != cmdSupportNone && // m_Shrink != cmdSupportNone && m_Copy != cmdSupportNone && m_Move != cmdSupportNone && @@ -418,6 +420,28 @@ FileSystem::Type luks::type() const return FileSystem::Luks; } +bool luks::resize(Report& report, const QString& deviceNode, qint64) const +{ + Q_ASSERT(m_innerFs); + + QString mapperNode = mapperName(deviceNode); + if (mapperNode.isEmpty()) + return false; + + ExternalCommand cryptResizeCmd(report, QStringLiteral("cryptsetup"), QStringList() << QStringLiteral("resize") << mapperNode); + report.line() << xi18nc("@info/plain", "Resizing LUKS crypt on partition %1.", deviceNode); + + bool rval = false; + if (cryptResizeCmd.run(-1)) + { + rval = m_innerFs->resize(report, mapperNode, -1); + } + else + report.line() << xi18nc("@info/plain", "Resizing encrypted file system on partition %1 failed.", deviceNode); + + return rval; +} + QString luks::readUUID(const QString& deviceNode) const { ExternalCommand cmd(QStringLiteral("cryptsetup"), diff --git a/src/fs/luks.h b/src/fs/luks.h index 11eaf21..4cc142e 100644 --- a/src/fs/luks.h +++ b/src/fs/luks.h @@ -89,6 +89,7 @@ public: virtual bool supportToolFound() const; virtual QString readUUID(const QString& deviceNode) const; virtual bool updateUUID(Report& report, const QString& deviceNode) const; + virtual bool resize(Report& report, const QString& deviceNode, qint64 length) const; virtual QString mountTitle() const override; virtual QString unmountTitle() const override;