From 3f7c5ca7228cf2c65e5d535e80cd1fb930a98b04 Mon Sep 17 00:00:00 2001 From: Caio Carvalho Date: Thu, 12 Jul 2018 14:08:24 -0300 Subject: [PATCH] Reassemble Software RAID when commit partition table. --- src/core/raid/softwareraid.cpp | 18 ++++++++++-------- src/core/raid/softwareraid.h | 6 ++---- src/plugins/sfdisk/sfdiskpartitiontable.cpp | 7 +++++++ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/core/raid/softwareraid.cpp b/src/core/raid/softwareraid.cpp index 8dfd604..3fc6938 100644 --- a/src/core/raid/softwareraid.cpp +++ b/src/core/raid/softwareraid.cpp @@ -218,18 +218,20 @@ bool SoftwareRAID::deleteSoftwareRAID(Report &report, return false; } -bool SoftwareRAID::assembleSoftwareRAID(Report &report, const SoftwareRAID &raidDevice) +bool SoftwareRAID::assembleSoftwareRAID(const SoftwareRAID &raidDevice) { - Q_UNUSED(report) - Q_UNUSED(raidDevice) - return false; + ExternalCommand cmd(QStringLiteral("mdadm"), + { QStringLiteral("--assemble"), QStringLiteral("--scan"), raidDevice.deviceNode() }); + + return cmd.run(-1) && cmd.exitCode() == 0; } -bool SoftwareRAID::stopSoftwareRAID(Report &report, const SoftwareRAID &raidDevice) +bool SoftwareRAID::stopSoftwareRAID(const SoftwareRAID &raidDevice) { - Q_UNUSED(report) - Q_UNUSED(raidDevice) - return false; + ExternalCommand cmd(QStringLiteral("mdadm"), + { QStringLiteral("--stop"), raidDevice.deviceNode() }); + + return cmd.run(-1) && cmd.exitCode() == 0; } void SoftwareRAID::initPartitions() diff --git a/src/core/raid/softwareraid.h b/src/core/raid/softwareraid.h index edafb10..6145388 100644 --- a/src/core/raid/softwareraid.h +++ b/src/core/raid/softwareraid.h @@ -65,11 +65,9 @@ public: static bool deleteSoftwareRAID(Report& report, SoftwareRAID& raidDevice); - static bool assembleSoftwareRAID(Report& report, - const SoftwareRAID& raidDevice); + static bool assembleSoftwareRAID(const SoftwareRAID& raidDevice); - static bool stopSoftwareRAID(Report& report, - const SoftwareRAID& raidDevice); + static bool stopSoftwareRAID(const SoftwareRAID& raidDevice); protected: void initPartitions() override; diff --git a/src/plugins/sfdisk/sfdiskpartitiontable.cpp b/src/plugins/sfdisk/sfdiskpartitiontable.cpp index 5faf5c8..c794d01 100644 --- a/src/plugins/sfdisk/sfdiskpartitiontable.cpp +++ b/src/plugins/sfdisk/sfdiskpartitiontable.cpp @@ -57,6 +57,13 @@ bool SfdiskPartitionTable::commit(quint32 timeout) ExternalCommand(QStringLiteral("blockdev"), { QStringLiteral("--rereadpt"), m_device->deviceNode() }).run(); ExternalCommand(QStringLiteral("udevadm"), { QStringLiteral("trigger") }).run(); + if (m_device->type() == Device::Type::SoftwareRAID_Device) + { + const SoftwareRAID& raid = static_cast(*m_device); + SoftwareRAID::stopSoftwareRAID(raid); + SoftwareRAID::assembleSoftwareRAID(raid); + } + return true; }