Skip to content

Commit 6dcc693

Browse files
jankaratytso
authored andcommitted
ext4: warn when page is dirtied without buffers
Warn when a page is dirtied without buffers (as that will likely lead to a crash in ext4_writepages()) or when it gets newly dirtied without the page being locked (as there is nothing that prevents buffers to get stripped just before calling set_page_dirty() under memory pressure). Signed-off-by: Jan Kara <[email protected]> Signed-off-by: Theodore Ts'o <[email protected]>
1 parent d14e768 commit 6dcc693

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

fs/ext4/inode.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3714,13 +3714,21 @@ static int ext4_journalled_set_page_dirty(struct page *page)
37143714
return __set_page_dirty_nobuffers(page);
37153715
}
37163716

3717+
static int ext4_set_page_dirty(struct page *page)
3718+
{
3719+
WARN_ON_ONCE(!PageLocked(page) && !PageDirty(page));
3720+
WARN_ON_ONCE(!page_has_buffers(page));
3721+
return __set_page_dirty_buffers(page);
3722+
}
3723+
37173724
static const struct address_space_operations ext4_aops = {
37183725
.readpage = ext4_readpage,
37193726
.readpages = ext4_readpages,
37203727
.writepage = ext4_writepage,
37213728
.writepages = ext4_writepages,
37223729
.write_begin = ext4_write_begin,
37233730
.write_end = ext4_write_end,
3731+
.set_page_dirty = ext4_set_page_dirty,
37243732
.bmap = ext4_bmap,
37253733
.invalidatepage = ext4_invalidatepage,
37263734
.releasepage = ext4_releasepage,
@@ -3753,6 +3761,7 @@ static const struct address_space_operations ext4_da_aops = {
37533761
.writepages = ext4_writepages,
37543762
.write_begin = ext4_da_write_begin,
37553763
.write_end = ext4_da_write_end,
3764+
.set_page_dirty = ext4_set_page_dirty,
37563765
.bmap = ext4_bmap,
37573766
.invalidatepage = ext4_da_invalidatepage,
37583767
.releasepage = ext4_releasepage,

0 commit comments

Comments
 (0)