When doing a direct/sync write, we need to invalidate the page cache in the range being written to. If we don't do this, the cache will include invalid data as we just did a write that avoided the page cache. Signed-off-by: Luís Henriques <lhenriques@xxxxxxx> --- fs/ceph/file.c | 9 +++++++++ 1 file changed, 9 insertions(+) Ok, here's a new attempt. After discussion in this thread and on IRC, I think this is the right fix. generic/647 now passes with and without encryption. Thanks! Changes since v2: - Invalidation needs to be done after a write Changes since v1: - Replaced truncate_inode_pages_range() by invalidate_inode_pages2_range - Call fscache_invalidate with FSCACHE_INVAL_DIO_WRITE if we're doing DIO diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 5072570c2203..63e67eb60310 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -1938,6 +1938,15 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos, break; } ceph_clear_error_write(ci); + ret = invalidate_inode_pages2_range( + inode->i_mapping, + pos >> PAGE_SHIFT, + (pos + len - 1) >> PAGE_SHIFT); + if (ret < 0) { + dout("invalidate_inode_pages2_range returned %d\n", + ret); + ret = 0; + } pos += len; written += len; dout("sync_write written %d\n", written);