|
@@ -1836,19 +1836,6 @@ static int nilfs_segctor_write(struct nilfs_sc_info *sci,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int nilfs_page_has_uncleared_buffer(struct page *page)
|
|
|
-{
|
|
|
- struct buffer_head *head, *bh;
|
|
|
-
|
|
|
- head = bh = page_buffers(page);
|
|
|
- do {
|
|
|
- if (buffer_dirty(bh) && !list_empty(&bh->b_assoc_buffers))
|
|
|
- return 1;
|
|
|
- bh = bh->b_this_page;
|
|
|
- } while (bh != head);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static void __nilfs_end_page_io(struct page *page, int err)
|
|
|
{
|
|
|
if (!err) {
|
|
@@ -1872,12 +1859,11 @@ static void nilfs_end_page_io(struct page *page, int err)
|
|
|
if (!page)
|
|
|
return;
|
|
|
|
|
|
- if (buffer_nilfs_node(page_buffers(page)) &&
|
|
|
- nilfs_page_has_uncleared_buffer(page))
|
|
|
- /* For b-tree node pages, this function may be called twice
|
|
|
- or more because they might be split in a segment.
|
|
|
- This check assures that cleanup has been done for all
|
|
|
- buffers in a split btnode page. */
|
|
|
+ if (buffer_nilfs_node(page_buffers(page)) && !PageWriteback(page))
|
|
|
+ /*
|
|
|
+ * For b-tree node pages, this function may be called twice
|
|
|
+ * or more because they might be split in a segment.
|
|
|
+ */
|
|
|
return;
|
|
|
|
|
|
__nilfs_end_page_io(page, err);
|
|
@@ -1940,7 +1926,7 @@ static void nilfs_segctor_abort_write(struct nilfs_sc_info *sci,
|
|
|
}
|
|
|
if (bh->b_page != fs_page) {
|
|
|
nilfs_end_page_io(fs_page, err);
|
|
|
- if (unlikely(fs_page == failed_page))
|
|
|
+ if (fs_page && fs_page == failed_page)
|
|
|
goto done;
|
|
|
fs_page = bh->b_page;
|
|
|
}
|