USB flash drive (NTFS) keeps writing for quite a while even after "Eject" completes
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
fuse (Ubuntu) |
Confirmed
|
Undecided
|
Unassigned |
Bug Description
Release: Ubuntu 14.04
Nautilus version: 1:3.10.1-0ubuntu9.1
Expected: After pressing "Eject" on a flash drive (formatted with NTFS -- haven't tried with FAT yet) I expected it to return only after flushing and unmounting the drive so the drive is completely safe to remove at that point
What happened: "Eject" returned after a short while. The drive still kept writing for a long time. Mount shows the drive still mounted for the period while the flash drive keeps blinking though "df" does not show the drive anymore. Removing the drive at this point results in partial file write and NTFS filesystem damage (fixable with ntfsfix but dangerous).
Steps to reproduce:
1) Insert a flash drive (tried with NTFS mounted drive though I believe FAT will show similar behaviour though latter uses "flush" mount option so may not be that prominent)
2) Try copying a large file. For testing use a size that will also mostly fit into filesystem cache so that real wait for writing is during unmount: dd if=/dev/zero of=/media/
<user> is the user name and <drive> the name where drive was mounted by nautilus as per the label.
3) "Eject" the drive from nautilus context menu after dd command above returns.
4) Eject returns shortly. However drive is still writing as seen by the blinking, or disk throughput in gkrellm, iostat. Also note that "mount" still shows the drive as mounted though "df" and other tools don't.
I have confirmed the same issue exists on all similar file managers namely nemo and caja. Haven't filed bugs against those yet.
For comparison, the gnome-disks system utility correctly unmounts, ejects and stops the drive (last one even powers down the drive so the LED on drive is switched off which one would expect nautilus "Eject" to also do) so it doesn't seem to be a bug in udisks2.
Workaround: apart from workarounds involving "sync" etc from command-line or always using command-line tools, the only way I have found to make all the GUI tools behave properly with "Eject" is to add the "sync" mount option.
While an explicit fstab entry can do it, the more user friendly way is to open the gnome-disks utility, click on gears "More action" icon after the drive has been inserted, then "Edit Mount Options", then unselect automatic mount option in the new window, then add "sync" separated by a comma after the list of options that are shown in the fourth text box.
One can select "/dev/sdb1" or whatever be the case in "Identy As" select box instead of the specific USB so that this works for all USB drives, but then it will not work for drives that are on other locations like /dev/sdc1. Perhaps one can repeat the same for all such possibiities, but one cannot be sure to cover all cases or cases where /dev/sdb1 is not a USB flash drive. This could potentially use the more complex matching criteria which I was a bit familiar with in the udev rules in older releases, but I don't know if that still works with the new infrastructure (perhaps need to look through udisks docs).
Either way adding "sync" is just a workaround and not the solution to this problem since adding that potentially loses on a lot of overall performance benefits of kernel filesystem cache. Proper solution will be to correctly unmount the drive (e.g. like what "udisks --unmount /dev/sdb1" does) and then eject. Not sure how the software manages to eject without even unmounting in the first place.