Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37570328
en ru br
ALT Linux repos
S:5.110.0-alt1

Group :: System/Libraries
RPM: kf5-solid

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs and FR  Repocop 

Patch: alt-hack-repeat-unmount.patch
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
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin