diff options
| author | Jan Kara <jack@suse.cz> | 2016-12-01 11:46:40 -0500 |
|---|---|---|
| committer | Theodore Ts'o <tytso@mit.edu> | 2016-12-01 11:46:40 -0500 |
| commit | 6dcc693bc57f198bd85a7881eb59a915366fae1e (patch) | |
| tree | 9ef8f62d5450572910d93a735aa2f7f5ea56be34 | |
| parent | d14e7683ecf06aa4365ee96adf74494114341dbe (diff) | |
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 <jack@suse.cz>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
| -rw-r--r-- | fs/ext4/inode.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 861f848159e8..7d95b6174980 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -3714,6 +3714,13 @@ static int ext4_journalled_set_page_dirty(struct page *page) | |||
| 3714 | return __set_page_dirty_nobuffers(page); | 3714 | return __set_page_dirty_nobuffers(page); |
| 3715 | } | 3715 | } |
| 3716 | 3716 | ||
| 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 | |||
| 3717 | static const struct address_space_operations ext4_aops = { | 3724 | static const struct address_space_operations ext4_aops = { |
| 3718 | .readpage = ext4_readpage, | 3725 | .readpage = ext4_readpage, |
| 3719 | .readpages = ext4_readpages, | 3726 | .readpages = ext4_readpages, |
| @@ -3721,6 +3728,7 @@ static const struct address_space_operations ext4_aops = { | |||
| 3721 | .writepages = ext4_writepages, | 3728 | .writepages = ext4_writepages, |
| 3722 | .write_begin = ext4_write_begin, | 3729 | .write_begin = ext4_write_begin, |
| 3723 | .write_end = ext4_write_end, | 3730 | .write_end = ext4_write_end, |
| 3731 | .set_page_dirty = ext4_set_page_dirty, | ||
| 3724 | .bmap = ext4_bmap, | 3732 | .bmap = ext4_bmap, |
| 3725 | .invalidatepage = ext4_invalidatepage, | 3733 | .invalidatepage = ext4_invalidatepage, |
| 3726 | .releasepage = ext4_releasepage, | 3734 | .releasepage = ext4_releasepage, |
| @@ -3753,6 +3761,7 @@ static const struct address_space_operations ext4_da_aops = { | |||
| 3753 | .writepages = ext4_writepages, | 3761 | .writepages = ext4_writepages, |
| 3754 | .write_begin = ext4_da_write_begin, | 3762 | .write_begin = ext4_da_write_begin, |
| 3755 | .write_end = ext4_da_write_end, | 3763 | .write_end = ext4_da_write_end, |
| 3764 | .set_page_dirty = ext4_set_page_dirty, | ||
| 3756 | .bmap = ext4_bmap, | 3765 | .bmap = ext4_bmap, |
| 3757 | .invalidatepage = ext4_da_invalidatepage, | 3766 | .invalidatepage = ext4_da_invalidatepage, |
| 3758 | .releasepage = ext4_releasepage, | 3767 | .releasepage = ext4_releasepage, |
