ext4: fix setting random pages PageUptodate
ext4_end_bio calls put_page and kmem_cache_free before calling SetPageUpdate(). This can result in setting the PageUptodate bit on random pages and causes the following BUG: BUG: Bad page state in process rm pfn:52e54 page:ffffea0001222260 count:0 mapcount:0 mapping: (null) index:0x0 arch kernel: page flags: 0x4000000000000008(uptodate) Fix the problem by moving put_io_page() after the SetPageUpdate() call. Thanks to Hugh Dickins for analyzing this problem. Reported-by: Markus Trippelsdorf <markus@trippelsdorf.de> Tested-by: Markus Trippelsdorf <markus@trippelsdorf.de> Signed-off-by: Markus Trippelsdorf <markus@trippelsdorf.de> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
Родитель
e53beacd23
Коммит
08da1193d2
|
@ -237,8 +237,6 @@ static void ext4_end_bio(struct bio *bio, int error)
|
|||
} while (bh != head);
|
||||
}
|
||||
|
||||
put_io_page(io_end->pages[i]);
|
||||
|
||||
/*
|
||||
* If this is a partial write which happened to make
|
||||
* all buffers uptodate then we can optimize away a
|
||||
|
@ -248,6 +246,8 @@ static void ext4_end_bio(struct bio *bio, int error)
|
|||
*/
|
||||
if (!partial_write)
|
||||
SetPageUptodate(page);
|
||||
|
||||
put_io_page(io_end->pages[i]);
|
||||
}
|
||||
io_end->num_io_pages = 0;
|
||||
inode = io_end->inode;
|
||||
|
|
Загрузка…
Ссылка в новой задаче