ext4: fix a BUG_ON crash by checking that page has buffers attached to it
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>
This commit is contained in:
@@ -1146,8 +1146,8 @@ static int check_block_validity(struct inode *inode, const char *msg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the number of dirty pages in the given inode starting at
|
* Return the number of contiguous dirty pages in a given inode
|
||||||
* page frame idx.
|
* starting at page frame idx.
|
||||||
*/
|
*/
|
||||||
static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx,
|
static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx,
|
||||||
unsigned int max_pages)
|
unsigned int max_pages)
|
||||||
@@ -1181,15 +1181,15 @@ static pgoff_t ext4_num_dirty_pages(struct inode *inode, pgoff_t idx,
|
|||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
head = page_buffers(page);
|
if (page_has_buffers(page)) {
|
||||||
bh = head;
|
bh = head = page_buffers(page);
|
||||||
do {
|
do {
|
||||||
if (!buffer_delay(bh) &&
|
if (!buffer_delay(bh) &&
|
||||||
!buffer_unwritten(bh)) {
|
!buffer_unwritten(bh))
|
||||||
done = 1;
|
done = 1;
|
||||||
break;
|
bh = bh->b_this_page;
|
||||||
|
} while (!done && (bh != head));
|
||||||
}
|
}
|
||||||
} while ((bh = bh->b_this_page) != head);
|
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
if (done)
|
if (done)
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user