|
@@ -1829,26 +1829,13 @@ static int nilfs_segctor_write(struct nilfs_sc_info *sci,
|
|
|
err = nilfs_segbuf_write(segbuf, &wi);
|
|
|
|
|
|
res = nilfs_segbuf_wait(segbuf, &wi);
|
|
|
- err = unlikely(err) ? : res;
|
|
|
- if (unlikely(err))
|
|
|
+ err = err ? : res;
|
|
|
+ if (err)
|
|
|
return err;
|
|
|
}
|
|
|
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;
|
|
|
}
|