Group :: System/Libraries
RPM: kf5-solid
Main Changelog Spec Patches Sources Download Gear Bugs and FR Repocop
Patch: alt-hack-repeat-unmount.patch
Download
Download
From 50a7f0ec65d1690f27fe7d4bb05de5c4209b06e0 Mon Sep 17 00:00:00 2001
From: Aleksei Nikiforov <darktemplar@altlinux.org>
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 <QDomDocument>
#include <QGuiApplication>
#include <QWindow>
+#include <QTimer>
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