On Fri, Apr 14, 2017 at 05:07:49PM +0300, Andrey Ryabinin wrote: > We've noticed that after direct IO write, buffered read sometimes gets > stale data which is coming from the cleancache. That is not good. > The reason for this is that some direct write hooks call call invalidate_inode_pages2[_range]() > conditionally iff mapping->nrpages is not zero, so we may not invalidate > data in the cleancache. > > Another odd thing is that we check only for ->nrpages and don't check for ->nrexceptional, Yikes. > but invalidate_inode_pages2[_range] also invalidates exceptional entries as well. > So we invalidate exceptional entries only if ->nrpages != 0? This doesn't feel right. > > - Patch 1 fixes direct IO writes by removing ->nrpages check. > - Patch 2 fixes similar case in invalidate_bdev(). > Note: I only fixed conditional cleancache_invalidate_inode() here. > Do we also need to add ->nrexceptional check in into invalidate_bdev()? > > - Patches 3-4: some optimizations. Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> Thanks! > > Andrey Ryabinin (4): > fs: fix data invalidation in the cleancache during direct IO > fs/block_dev: always invalidate cleancache in invalidate_bdev() > mm/truncate: bail out early from invalidate_inode_pages2_range() if > mapping is empty > mm/truncate: avoid pointless cleancache_invalidate_inode() calls. > > fs/9p/vfs_file.c | 2 +- > fs/block_dev.c | 11 +++++------ > fs/cifs/inode.c | 2 +- > fs/dax.c | 2 +- > fs/iomap.c | 16 +++++++--------- > fs/nfs/direct.c | 6 ++---- > fs/nfs/inode.c | 8 +++++--- > mm/filemap.c | 26 +++++++++++--------------- > mm/truncate.c | 13 +++++++++---- > 9 files changed, 42 insertions(+), 44 deletions(-) > > -- > 2.10.2 >