|
@@ -1859,12 +1859,26 @@ static void nilfs_end_page_io(struct page *page, int err)
|
|
|
if (!page)
|
|
|
return;
|
|
|
|
|
|
- if (buffer_nilfs_node(page_buffers(page)) && !PageWriteback(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.
|
|
|
*/
|
|
|
+ if (PageDirty(page)) {
|
|
|
+ /*
|
|
|
+ * For pages holding split b-tree node buffers, dirty
|
|
|
+ * flag on the buffers may be cleared discretely.
|
|
|
+ * In that case, the page is once redirtied for
|
|
|
+ * remaining buffers, and it must be cancelled if
|
|
|
+ * all the buffers get cleaned later.
|
|
|
+ */
|
|
|
+ lock_page(page);
|
|
|
+ if (nilfs_page_buffers_clean(page))
|
|
|
+ __nilfs_clear_page_dirty(page);
|
|
|
+ unlock_page(page);
|
|
|
+ }
|
|
|
return;
|
|
|
+ }
|
|
|
|
|
|
__nilfs_end_page_io(page, err);
|
|
|
}
|