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); It might be cleaner to just add: && clear_page_dirty_for_io(page) to the existing if statement -- that will reduce the level of indentation (which is already pretty far here). > + } > unlock_page(page); > continue; > } > -- > 1.8.3.1 This patch looks good at first glance, but there is some whitespace damage here and it does not apply. It looks like you may have cut and pasted it into an email? Could you resend it? Maybe look into using the git-send-email script to send it. Thanks, -- Jeff Layton <jlayton@xxxxxxxxxx>