>From da79b4b72a6fe5fcf1a554ca1ce77cb462e8a306 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Thu, 20 Apr 2017 16:38:20 +0200 Subject: [PATCH] dax: Fix inconsistency between mmap and write(2) When a process has a PMD-sized hole mapped via mmap and later allocates part of the file underlying this area using write(2), memory mappings need not be appropriately invalidated if the file has no hole pages allocated and thus view via mmap will not show the data written by write(2). Fix the problem by always invalidating memory mappings covering part of the file for which blocks got allocated. Signed-off-by: Jan Kara --- fs/dax.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 85abd741253d..da7bc44e5725 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -1028,11 +1028,11 @@ dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data, return -EIO; /* - * Write can allocate block for an area which has a hole page mapped - * into page tables. We have to tear down these mappings so that data - * written by write(2) is visible in mmap. + * Write can allocate block for an area which has a hole page or zero + * PMD entry in the radix tree. We have to tear down these mappings so + * that data written by write(2) is visible in mmap. */ - if ((iomap->flags & IOMAP_F_NEW) && inode->i_mapping->nrpages) { + if (iomap->flags & IOMAP_F_NEW) { invalidate_inode_pages2_range(inode->i_mapping, pos >> PAGE_SHIFT, (end - 1) >> PAGE_SHIFT); -- 2.12.0