Async direct IO write vs buffered read race

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I am dealing with a problem where in case that buffered read happens to
land between direct IO submission and completion page cache will contain
the stale data, while the new data will be on disk.

We are trying to avoid such problems by calling
invalidate_inode_pages2_range() before and after direct_IO() in
generic_file_direct_write() however that does not seem to be enough,
because nothing prevents buffered reads to come in afterwards populating
page cache.

Aside from the fact that mixing direct and buffered IO is not such a
good idea, we end up with page cache showing different content than
what's on disk even after aio dio completes which seems very strange
to me.

I can reproduce this on ext4 as well as xfs and kernel version going
back at least to v3.10 which leads me to believe that this might
actually be known behaviour ?

I was trying to avoid that by moving invalidate_inode_pages2_range() to
after the aio dio completion into dio_complete (or file system ->end_io
callback) but it has it's own problems - sometimes this appears to be
called from atomic context and I do not really see why...

Do you have any comments on this ? Is it actually expected behaviour ?

Thanks!
-Lukas



[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux