Bug 143353

Summary: "safely remove" unmounts usb flash disk while it is still in use (flashing)
Product: [I don't know] kde Reporter: khotyanovsky
Component: generalAssignee: Stephan Kulow <coolo>
Status: RESOLVED FIXED    
Severity: normal CC: cimmino.marco, shiverma
Priority: NOR    
Version: unspecified   
Target Milestone: ---   
Platform: Compiled Sources   
OS: Linux   
Latest Commit: Version Fixed In:

Description khotyanovsky 2007-03-22 19:10:00 UTC
Version:            (using KDE KDE 3.5.5)
Installed from:    Compiled From Sources
Compiler:          gcc 4.1.1  
OS:                Linux

My configuration: KDE-3.5.5, HAL, pmount, kernel 2.6.19-gentoo-r5

"Safely remove" does not wait for the usb flash to finish copying a large file.
Instead, it immediately unmounts the usb key while it is still flashing red.

1. Copy large (a few hundred Megs) file to usb key.
2. Immediately click "Safely remove".

The usb icon turns into unmounted state (which is true).
After that the user may unplug the usb key, which may result
in fat32 corruption. 

Expected behaviour would be a popped-up dialog window that asks to wait
for the usb key to finish its activity.
Comment 1 khotyanovsky 2007-03-23 18:10:44 UTC
When the usb disk is "safely removed" and its icon turns into unmounted state
the usb disk is still in /etc/mtab, so it is not really unmounted.
Comment 3 Carles Sànchez 2007-03-28 12:03:44 UTC
Exactly the same problem here. My system runs:

KDE 3.5.5 (kubuntu edgy), kernel 2.6.17-11-generic.
Comment 4 khotyanovsky 2007-03-29 07:24:00 UTC
See https://launchpad.net/ubuntu/+source/kdebase/+bug/61946
Comment 5 Wiebe Cazemier 2007-04-19 11:51:53 UTC
I have the same, KDE 3.5.5 (actually, I have had it since many releases back).

And khotyanovsky is right, the system still has it mounted. It has to, otherwise it would be unable to flush cache.

Current specs:
distro: Gentoo
KDE: 3.5.5
HAL: 0.5.7.1
Dbus: 1.0.2
kernel: 2.6.19-gentoo-r5
GCC: 4.1.1
pmount: 0.9.13 
CFLAGS: "-O2 -march=athlon-xp -pipe"

Comment 6 Stephan Kulow 2007-05-08 14:48:13 UTC
SVN commit 662500 by coolo:

make sure we unmount the device before we even try to 
eject - and give correct error message if the device is busy
BUG: 143353


 M  +7 -7      mediamanager/halbackend.cpp  
 M  +9 -5      mounthelper/kio_media_mounthelper.cpp  


--- branches/KDE/3.5/kdebase/kioslave/media/mediamanager/halbackend.cpp #662499:662500
@@ -1037,14 +1037,14 @@
         QString proclist(listUsingProcesses(medium));
 
         qerror = "<qt>";
-        qerror += i18n("Unfortunately, the device <b>%1</b> (%2) named <b>'%3'</b> and "
+        qerror += "<p>" + i18n("Unfortunately, the device <b>%1</b> (%2) named <b>'%3'</b> and "
                        "currently mounted at <b>%4</b> could not be unmounted. ").arg(
                           "system:/media/" + medium->name(),
                           medium->deviceNode(),
                           medium->prettyLabel(),
-                          medium->prettyBaseURL().pathOrURL());
-        qerror += i18n("The following error was returned by umount command:");
-        qerror += "<br><pre>" + job->errorText() + "</pre>";
+                          medium->prettyBaseURL().pathOrURL()) + "</p>";
+        qerror += "<p>" + i18n("The following error was returned by umount command:");
+        qerror += "</p><pre>" + job->errorText() + "</pre>";
 
         if (!proclist.isEmpty()) {
             qerror += proclist;
@@ -1273,13 +1273,13 @@
 
         kdDebug() << "unmount failed for " << udi << ": " << error.name << " " << error.message << endl;
         qerror = "<qt>";
-        qerror += i18n("Unfortunately, the device <b>%1</b> (%2) named <b>'%3'</b> and "
+        qerror += "<p>" + i18n("Unfortunately, the device <b>%1</b> (%2) named <b>'%3'</b> and "
                        "currently mounted at <b>%4</b> could not be unmounted. ").arg(
                           "system:/media/" + medium->name(),
                           medium->deviceNode(),
                           medium->prettyLabel(),
-                          medium->prettyBaseURL().pathOrURL());
-        qerror += i18n("Unmounting failed due to the following error:");
+                          medium->prettyBaseURL().pathOrURL()) + "</p>";
+        qerror += "<p>" + i18n("Unmounting failed due to the following error:") + "</p>";
         if (!strcmp(error.name, "org.freedesktop.Hal.Device.Volume.Busy")) {
             reason = i18n("Device is Busy:");
         } else if (!strcmp(error.name, "org.freedesktop.Hal.Device.Volume.NotMounted")) {
--- branches/KDE/3.5/kdebase/kioslave/media/mounthelper/kio_media_mounthelper.cpp #662499:662500
@@ -117,10 +117,14 @@
 			DCOPRef mediamanager("kded", "mediamanager");
 			DCOPReply reply = mediamanager.call( "unmount", medium.id());
 			if (reply.isValid())
-			reply.get(m_errorStr);
+                            reply.get(m_errorStr);
+                        if (m_errorStr.isNull())
+                            invokeEject(device, true);
+                        else
+                            error();
 			m_device = device;
-		}
-		invokeEject(device, true);
+		} else
+                    invokeEject(device, true);
 	}
 	else
 	{
@@ -130,7 +134,7 @@
 	    reply.get(m_errorStr);
 	  if (m_errorStr.isNull())
 	    ::exit(0);
-	  else 
+	  else
 	    error();
 	}
 }
@@ -201,5 +205,5 @@
 	app->dcopClient()->attach();
 	return app->exec();
 }
- 
+
 #include "kio_media_mounthelper.moc"
Comment 7 Stephan Kulow 2007-05-08 15:02:33 UTC
*** Bug 135558 has been marked as a duplicate of this bug. ***