--- a/src/calibre/__init__.py 2019-07-21 13:24:51.302383981 +0200
+++ b/src/calibre/__init__.py 2019-07-21 13:03:23.170204400 +0200
@@ -726,3 +660,21 @@
def fsync(fileobj):
fileobj.flush()
os.fsync(fileobj.fileno())
+ if islinux and getattr(fileobj, 'name', None):
+ # On Linux kernels after 5.1.9 and 4.19.50 using fsync without any
+ # following activity causes Kindles to eject. Instead of fixing this in
+ # the obvious way, which is to have the kernel send some harmless
+ # filesystem activity after the FSYNC, the kernel developers seem to
+ # think the correct solution is to disable FSYNC using a mount flag
+ # which users will have to turn on manually. So instead we create some
+ # harmless filesystem activity, and who cares about performance.
+ # See https://bugs.launchpad.net/calibre/+bug/1834641
+ # and https://bugzilla.kernel.org/show_bug.cgi?id=203973
+ # To check for the existence of the bug, simply run:
+ # python -c "p = '/run/media/kovid/Kindle/driveinfo.calibre'; f = open(p, 'r+b'); os.fsync(f.fileno());"
+ # this will cause the Kindle to disconnect.
+ try:
+ os.utime(fileobj.name, None)
+ except Exception:
+ import traceback
+ traceback.print_exc()