hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/fs/ocfs2/aops.c
....@@ -1981,11 +1981,25 @@
19811981 }
19821982
19831983 if (unlikely(copied < len) && wc->w_target_page) {
1984
+ loff_t new_isize;
1985
+
19841986 if (!PageUptodate(wc->w_target_page))
19851987 copied = 0;
19861988
1987
- ocfs2_zero_new_buffers(wc->w_target_page, start+copied,
1988
- start+len);
1989
+ new_isize = max_t(loff_t, i_size_read(inode), pos + copied);
1990
+ if (new_isize > page_offset(wc->w_target_page))
1991
+ ocfs2_zero_new_buffers(wc->w_target_page, start+copied,
1992
+ start+len);
1993
+ else {
1994
+ /*
1995
+ * When page is fully beyond new isize (data copy
1996
+ * failed), do not bother zeroing the page. Invalidate
1997
+ * it instead so that writeback does not get confused
1998
+ * put page & buffer dirty bits into inconsistent
1999
+ * state.
2000
+ */
2001
+ block_invalidatepage(wc->w_target_page, 0, PAGE_SIZE);
2002
+ }
19892003 }
19902004 if (wc->w_target_page)
19912005 flush_dcache_page(wc->w_target_page);