powersave-users  

Re: [powersave-users] suspend with kpowersave 0.7.3: always "Could not umount..."

Danny Kukawka
Wed, 19 Mar 2008 14:27:51 -0700

On Mittwoch, 19. März 2008, Andreas K. Huettel wrote:
> Dear list,
>
> I'm using kpowersave 0.7.3 (with hal 0.5.9.1-r3, without powersaved) on
> Gentoo Linux.
>
> Suspend, scheme change etc etc works fine, with one exception:
>
> When I manually initiate suspend to ram in the KPowersave menu, I always
> get a dialog box
> "Could not umount external media before suspend / standby. (Reason: Could
> not call DCOP interface to umount external media.) Suspend anyway?"
>
> If I suspend anyway (no external media are mounted), it works fine.
>
> Is this a misconfiguration or a bug? What could I do to debug it?
> Am I maybe missing some software package?

Your kdebase3 package simply don't provide the needed DCOP interface. See 
attached patch we have in the SUSE kdebase3 packages (I don't know if you 
need more than only this patch atm.).

Danny
--- kioslave/media/libmediacommon/medium.cpp
+++ kioslave/media/libmediacommon/medium.cpp
@@ -42,6 +42,7 @@ Medium::Medium(const QString &id, const 
 	loadUserLabel();
 
 	m_halmounted = false;
+    m_isHotplug = false;
 }
 
 Medium::Medium()
@@ -59,8 +60,9 @@ Medium::Medium()
 	m_properties+= QString::null; /* BASE_URL */
 	m_properties+= QString::null; /* MIME_TYPE */
 	m_properties+= QString::null; /* ICON_NAME */
-	
+
 	m_halmounted = false;
+    m_isHotplug = false;
 }
 
 const Medium Medium::create(const QStringList &properties)
--- kioslave/media/libmediacommon/medium.h
+++ kioslave/media/libmediacommon/medium.h
@@ -82,18 +82,22 @@ public:
 	void setHalMounted(bool flag) const { m_halmounted = flag; }
 	bool halMounted() const { return m_halmounted; }
 
+    void setIsHotplug( bool state ) { m_isHotplug = state; }
+    bool isHotplug() const { return m_isHotplug; }
+
 private:
 	Medium();
 	void loadUserLabel();
 
 	QStringList m_properties;
 	mutable bool m_halmounted;
-	
+    bool m_isHotplug;
+
 friend class QValueListNode<const Medium>;
 };
 
 namespace MediaManagerUtils {
-  static inline QMap<QString,QString> splitOptions(const QStringList & options) 
+  static inline QMap<QString,QString> splitOptions(const QStringList & options)
     {
       QMap<QString,QString> valids;
 
--- kioslave/media/mediamanager/mediamanager.cpp
+++ kioslave/media/mediamanager/mediamanager.cpp
@@ -330,6 +330,54 @@ void MediaManager::slotMediumChanged(con
     emit mediumChanged(name);
 }
 
+QString MediaManager::unmountAllSuspend()
+{
+    QPtrList<Medium> list = m_mediaList.list();
+
+    QPtrList<Medium>::const_iterator it = list.begin();
+    QPtrList<Medium>::const_iterator end = list.end();
+
+    QString result;
+
+    for (; it!=end; ++it)
+    {
+        if ( (*it)->isMounted() && (*it)->isHotplug() )
+        {
+            QString tmp = unmount( (*it)->id() );
+            if ( !tmp.isEmpty() ) // umount failed
+                result = tmp;
+            else
+                m_suspendResumeMountList.append( (*it)->id() );
+        }
+    }
+
+    // return last error
+    return result;
+}
+
+QString MediaManager::remountAllResume()
+{
+    QString result;
+
+    for (QStringList::const_iterator it = m_suspendResumeMountList.begin();
+         it != m_suspendResumeMountList.end();
+         ++it)
+    {
+        const Medium *m = m_mediaList.findById(*it);
+
+        if ( m && m->needMounting() )
+        {
+            QString tmp = mount( *it );
+            if ( !tmp.isEmpty() ) // mount failed
+                result = tmp;
+        }
+    }
+
+    m_suspendResumeMountList.clear();
+
+    // return last error
+    return result;
+}
 
 extern "C" {
     KDE_EXPORT KDEDModule *create_mediamanager(const QCString &obj)
--- kioslave/media/mediamanager/mediamanager.h
+++ kioslave/media/mediamanager/mediamanager.h
@@ -58,6 +58,20 @@ k_dcop:
 	bool removableUnplug(const QString &devNode);
 	bool removableCamera(const QString &devNode);
 
+        /**
+         * Unmount manually all partitions when going to suspend
+         *
+         * @return last error if any
+         */
+        QString unmountAllSuspend();
+
+        /**
+         * Remount previously unmounted partitions in unmountAllSuspend()
+         *
+         * @return last error if any
+         */
+        QString remountAllResume();
+
 k_dcop_signals:
 	void mediumAdded(const QString &name, bool allowNotification);
 	void mediumRemoved(const QString &name, bool allowNotification);
@@ -70,7 +84,7 @@ k_dcop_signals:
 
 private slots:
 	void loadBackends();
-	
+
 	void slotMediumAdded(const QString &id, const QString &name,
 	                     bool allowNotification);
 	void slotMediumRemoved(const QString &id, const QString &name,
@@ -85,6 +99,7 @@ private:
 	HALBackend *m_halbackend;
 	MediaDirNotify m_dirNotify;
 	FstabBackend *m_fstabbackend;
+        QStringList m_suspendResumeMountList;
 };
 
 #endif
--- kioslave/media/mediamanager/halbackend.cpp
+++ kioslave/media/mediamanager/halbackend.cpp
@@ -442,6 +442,8 @@ void HALBackend::setVolumeProperties(Med
         libhal_volume_get_fstype(halVolume),			/* Filesystem type */
         libhal_volume_is_mounted(halVolume) );			/* Mounted ? */
 
+    medium->setIsHotplug( libhal_drive_is_hotpluggable(halDrive) );
+
     char* name = libhal_volume_policy_compute_display_name(halDrive, halVolume, m_halStoragePolicy);
     QString volume_name = QString::fromUtf8(name);
     QString media_name = volume_name;
--- kioslave/media/mediamanager/halbackend.h
+++ kioslave/media/mediamanager/halbackend.h
@@ -96,6 +96,8 @@
 	QString mount(const Medium *medium);
 	QString unmount(const QString &id);
 
+    static bool isHotplug( const QString & id );
+
 private:
 	/**
 	* Append a device in the media list. This function will check if the device
_______________________________________________
powersave-users mailing list
powersave-users@forge.novell.com
http://forge.novell.com/mailman/listinfo/powersave-users