X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=fs%2Fnilfs2%2Fsegment.c;h=51ff3d0a4ee256445f8ddbe9e85d7ff2ae2a7798;hb=1ee5332cf67c2f5f468ad1a59033d57453bcad1a;hp=8b5e4778cf28bc780fcf516400ccc7a2e963c076;hpb=8227b29722fdbac72357aae155d171a5c777670c;p=mv-sheeva.git diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 8b5e4778cf2..51ff3d0a4ee 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c @@ -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); }