From 9ba2eb25f017800c3d00eac2bbc3c99451c3bae2 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Fri, 9 Oct 2020 00:09:20 -0400 Subject: [PATCH] bcachefs: Fix __bch2_truncate_page() __bch2_truncate_page() will mark some of the blocks in a page as unallocated. But, if the page is mmapped (and writable), every block in the page needs to be marked dirty, else those blocks won't be written by __bch2_writepage(). The solution is to change those userspace mappings to RO, so that we force bch2_page_mkwrite() to be called again. Signed-off-by: Kent Overstreet Signed-off-by: Kent Overstreet --- fs/bcachefs/fs-io.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c index c0995723ddd2..0290f7410a5c 100644 --- a/fs/bcachefs/fs-io.c +++ b/fs/bcachefs/fs-io.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -2160,6 +2161,12 @@ static int __bch2_truncate_page(struct bch_inode_info *inode, ret = bch2_get_page_disk_reservation(c, inode, page, false); BUG_ON(ret); + /* + * This removes any writeable userspace mappings; we need to force + * .page_mkwrite to be called again before any mmapped writes, to + * redirty the full page: + */ + page_mkclean(page); filemap_dirty_folio(mapping, page_folio(page)); unlock: unlock_page(page); -- 2.20.1