On Tue, 2019-07-23 at 15:55 +0800, erqi chen wrote: > 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 Looks good. I'll plan to do a bit of testing with this today and then merge it into the testing branch. Thanks, -- Jeff Layton <jlayton@xxxxxxxxxx>