| From 7fcfa625f4bdba955d0fb0b717dc576b1e48b470 Mon Sep 17 00:00:00 2001 |
| From: Theodore Ts'o <tytso@mit.edu> |
| Date: Wed, 30 Sep 2009 22:57:41 -0400 |
| Subject: [PATCH 50/85] ext4: fix a BUG_ON crash by checking that page has buffers attached to it |
| |
| (cherry picked from commit 1f94533d9cd75f6d2826018d54a971b9cc085992) |
| |
| In ext4_num_dirty_pages() we were calling page_buffers() before |
| checking to see if the page actually had pages attached to it; this |
| would cause a BUG check crash in the inline function page_buffers(). |
| |
| Thanks to Markus Trippelsdorf for reporting this bug. |
| |
| Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| fs/ext4/inode.c | 22 +++++++++++----------- |
| 1 file changed, 11 insertions(+), 11 deletions(-) |
| |
| --- a/fs/ext4/inode.c |
| +++ b/fs/ext4/inode.c |
| @@ -1147,8 +1147,8 @@ static int check_block_validity(struct i |
| } |
| |
| /* |
| - * Return the number of dirty pages in the given inode starting at |
| - * page frame idx. |
| + * Return the number of contiguous dirty pages in a given inode |
| + * starting at page frame idx. |
| */ |
| static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx, |
| unsigned int max_pages) |
| @@ -1182,15 +1182,15 @@ static pgoff_t ext4_num_dirty_pages(stru |
| unlock_page(page); |
| break; |
| } |
| - head = page_buffers(page); |
| - bh = head; |
| - do { |
| - if (!buffer_delay(bh) && |
| - !buffer_unwritten(bh)) { |
| - done = 1; |
| - break; |
| - } |
| - } while ((bh = bh->b_this_page) != head); |
| + if (page_has_buffers(page)) { |
| + bh = head = page_buffers(page); |
| + do { |
| + if (!buffer_delay(bh) && |
| + !buffer_unwritten(bh)) |
| + done = 1; |
| + bh = bh->b_this_page; |
| + } while (!done && (bh != head)); |
| + } |
| unlock_page(page); |
| if (done) |
| break; |