10

I am running a fresh install on Debian 8, and I often have to wait a ridiculous time before my flashdrives get ejected (ranging from 1 to 10.. 15 minutes). During this time, I can't access anything concerning the drive because I get the error An operation is already pending.

It seems like it has nothing to see with the flashdrive format (I've tried FAT, ext4, NTFS), but it also seems to start when I start putting files on them. (nothing heavy though, ~500Mb).

What could be causing this problem? Is there something I can do to speed up ejection?

iago-lito
  • 396

2 Answers2

25

Although I don't know if this is the actual explanation/solution to your question, I believe this is an issue with USB in general.

If you copy large files or many files, the USB device will deliver a message to the host saying "I am about to send you these files". The device will then asynchronously send all files and will take the time it needs to do so. This means that when you do a cp /my/flash/drive/foo.txt /home/bar/foo.txt the device will tell the operating system that files are being copied and then send the files.

The only way I know of to check if all data actually has been transferred is to enter sync after doing a command that copies/moves or deletes files on a flash drive. The sync command will then just block until the drive is finished with transferring data. After that it should be safe to unmount/eject an USB flashdrive.


[EDIT]: Check this post to watch progress of the sync operation: the number printed when you run

watch grep -e Dirty: -e Writeback: /proc/meminfo

should decrease down to zero as background data transfers occur. When it's done, your sync will be completed and your flashdrive will eject.


Another common problem with ejecting USB storage devices is that atleast Debian will not allow it if there is a program, terminal or similar currently working on files/folders on that flash drive. So if you have changed directory to a folder on that flashdrive in a terminal and then try to eject the flash drive using another terminal, it will not allow that until you have changed directory to somewhere else not on the flashdrive in the first terminal.

Mogget
  • 1,353
2

This is likely due to accumulation of cached writes that haven't been written to the device yet, as described in "The pernicious USB-stick stall problem".

As a workaround you can limit the amount of dirty memory due to outstanding IO:

echo $((16*1024*1024)) | sudo tee /proc/sys/vm/dirty_background_bytes
echo $((48*1024*1024)) | sudo tee /proc/sys/vm/dirty_bytes
kynan
  • 3,586