mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-25 15:24:17 +08:00
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 <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
61ce38b862
commit
9ba2eb25f0
@ -27,6 +27,7 @@
|
||||
#include <linux/migrate.h>
|
||||
#include <linux/mmu_context.h>
|
||||
#include <linux/pagevec.h>
|
||||
#include <linux/rmap.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/task_io_accounting_ops.h>
|
||||
#include <linux/uio.h>
|
||||
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user