From: Markus Trippelsdorf Date: Thu, 18 Nov 2010 02:46:06 +0000 (-0500) Subject: ext4: fix setting random pages PageUptodate X-Git-Tag: v2.6.37-rc3~1^2~5 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=08da1193d2c8c7a25d0cef7f85d0b9f1ad7c583a;p=~shefty%2Frdma-dev.git 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 Tested-by: Markus Trippelsdorf Signed-off-by: Markus Trippelsdorf Signed-off-by: "Theodore Ts'o" --- diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index 7f5451cd1d3..beacce11ac5 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -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;