From: Erqi Chen <chenerqi@xxxxxxxxx> clear_page_dirty_for_io(page) before mapping->a_ops->invalidatepage(). invalidatepage() clears page's private flag, if dirty flag is not cleared, the page may cause BUG_ON failure in ceph_set_page_dirty(). Fixes: https://tracker.ceph.com/issues/40862 Signed-off-by: Erqi Chen chenerqi@xxxxxxxxx --- fs/ceph/addr.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c index e078cc5..5ad63bf 100644 --- a/fs/ceph/addr.c +++ b/fs/ceph/addr.c @@ -914,9 +914,11 @@ static int ceph_writepages_start(struct address_space *mapping, dout("%p page eof %llu\n", page, ceph_wbc.i_size); if (ceph_wbc.size_stable || - page_offset(page) >= i_size_read(inode)) - mapping->a_ops->invalidatepage(page, - 0, PAGE_SIZE); + page_offset(page) >= i_size_read(inode)) { + if (clear_page_dirty_for_io(page)) + mapping->a_ops->invalidatepage(page, + 0, PAGE_SIZE); + } unlock_page(page); continue; } -- 1.8.3.1