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 /fs/ext4 | |
parent | d14e7683ecf06aa4365ee96adf74494114341dbe (diff) | |
download | linux-6dcc693bc57f198bd85a7881eb59a915366fae1e.tar.gz linux-6dcc693bc57f198bd85a7881eb59a915366fae1e.tar.bz2 linux-6dcc693bc57f198bd85a7881eb59a915366fae1e.zip |
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>
Diffstat (limited to 'fs/ext4')
-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) return __set_page_dirty_nobuffers(page); } +static int ext4_set_page_dirty(struct page *page) +{ + WARN_ON_ONCE(!PageLocked(page) && !PageDirty(page)); + WARN_ON_ONCE(!page_has_buffers(page)); + return __set_page_dirty_buffers(page); +} + static const struct address_space_operations ext4_aops = { .readpage = ext4_readpage, .readpages = ext4_readpages, @@ -3721,6 +3728,7 @@ static const struct address_space_operations ext4_aops = { .writepages = ext4_writepages, .write_begin = ext4_write_begin, .write_end = ext4_write_end, + .set_page_dirty = ext4_set_page_dirty, .bmap = ext4_bmap, .invalidatepage = ext4_invalidatepage, .releasepage = ext4_releasepage, @@ -3753,6 +3761,7 @@ static const struct address_space_operations ext4_da_aops = { .writepages = ext4_writepages, .write_begin = ext4_da_write_begin, .write_end = ext4_da_write_end, + .set_page_dirty = ext4_set_page_dirty, .bmap = ext4_bmap, .invalidatepage = ext4_da_invalidatepage, .releasepage = ext4_releasepage, |