From 50a7f0ec65d1690f27fe7d4bb05de5c4209b06e0 Mon Sep 17 00:00:00 2001 From: Aleksei Nikiforov Date: Fri, 27 Mar 2020 17:15:25 +0300 Subject: [PATCH] Repeat unmount few times in case of errors --- .../backends/udisks2/udisksstorageaccess.cpp | 18 +++++++++++++----- .../backends/udisks2/udisksstorageaccess.h | 10 +++++++--- 2 files changed, 20 insertions(+), 8 deletions(-) --- a/solid/src/solid/devices/backends/udisks2/udisksstorageaccess.cpp +++ b/solid/src/solid/devices/backends/udisks2/udisksstorageaccess.cpp @@ -15,6 +15,7 @@ #include #include #include +#include using namespace Solid::Backends::UDisks2; @@ -23,6 +24,7 @@ StorageAccess::StorageAccess(Device *dev , m_setupInProgress(false) , m_teardownInProgress(false) , m_passphraseRequested(false) + , m_unmountRetryCount(0) { connect(device, SIGNAL(changed()), this, SLOT(checkAccessibility())); updateCache(); @@ -132,6 +134,7 @@ bool StorageAccess::teardown() return false; } m_teardownInProgress = true; + m_unmountRetryCount = 0; m_device->broadcastActionRequested("teardown"); return unmount(); @@ -214,11 +217,16 @@ void StorageAccess::slotDBusError(const checkAccessibility(); } else if (m_teardownInProgress) { - m_teardownInProgress = false; - m_device->broadcastActionDone("teardown", // - m_device->errorToSolidError(error.name()), - m_device->errorToString(error.name()) + ": " + error.message()); - checkAccessibility(); + if (m_unmountRetryCount++ < s_unmountRetryMaxCount) { + // repeat unmount request in few seconds + QTimer::singleShot(std::chrono::milliseconds(s_unmountRetryWaitTime), this, &StorageAccess::unmount); + } else { + m_teardownInProgress = false; + m_device->broadcastActionDone("teardown", // + m_device->errorToSolidError(error.name()), + m_device->errorToString(error.name()) + ": " + error.message()); + checkAccessibility(); + } } } @@ -240,6 +248,7 @@ void StorageAccess::slotSetupDone(int er void StorageAccess::slotTeardownRequested() { m_teardownInProgress = true; + m_unmountRetryCount = 0; Q_EMIT teardownRequested(m_device->udi()); } diff --git a/solid/src/solid/devices/backends/udisks2/udisksstorageaccess.h b/solid/src/solid/devices/backends/udisks2/udisksstorageaccess.h index deec593..76d2dee 100644 --- a/solid/src/solid/devices/backends/udisks2/udisksstorageaccess.h +++ b/solid/src/solid/devices/backends/udisks2/udisksstorageaccess.h @@ -72,15 +72,15 @@ private Q_SLOTS: void checkAccessibility(); + bool mount(); + bool unmount(); + private: /// @return true if this device is luks and unlocked bool isLuksDevice() const; void updateCache(); - bool mount(); - bool unmount(); - bool requestPassphrase(); void callCryptoSetup(const QString &passphrase); bool callCryptoTeardown(bool actOnParent = false); @@ -95,6 +95,10 @@ private: bool m_passphraseRequested; QString m_lastReturnObject; + int m_unmountRetryCount; + static const int s_unmountRetryMaxCount = 5; + static const int s_unmountRetryWaitTime = 2000; // in milliseconds + static const int s_unmountTimeout = 0x7fffffff; }; } -- 2.25.2