Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2:
nilfs2: fix missing unlock in error path of nilfs_mdt_write_page
nilfs2: fix oops due to inconsistent state in page with discrete b-tree nodes

+18 -2
+3 -1
fs/nilfs2/mdt.c
··· 412 412 return 0; /* Do not request flush for shadow page cache */ 413 413 if (!sb) { 414 414 writer = nilfs_get_writer(NILFS_MDT(inode)->mi_nilfs); 415 - if (!writer) 415 + if (!writer) { 416 + nilfs_put_writer(NILFS_MDT(inode)->mi_nilfs); 416 417 return -EROFS; 418 + } 417 419 sb = writer->s_super; 418 420 } 419 421
+15 -1
fs/nilfs2/segment.c
··· 1859 1859 if (!page) 1860 1860 return; 1861 1861 1862 - if (buffer_nilfs_node(page_buffers(page)) && !PageWriteback(page)) 1862 + if (buffer_nilfs_node(page_buffers(page)) && !PageWriteback(page)) { 1863 1863 /* 1864 1864 * For b-tree node pages, this function may be called twice 1865 1865 * or more because they might be split in a segment. 1866 1866 */ 1867 + if (PageDirty(page)) { 1868 + /* 1869 + * For pages holding split b-tree node buffers, dirty 1870 + * flag on the buffers may be cleared discretely. 1871 + * In that case, the page is once redirtied for 1872 + * remaining buffers, and it must be cancelled if 1873 + * all the buffers get cleaned later. 1874 + */ 1875 + lock_page(page); 1876 + if (nilfs_page_buffers_clean(page)) 1877 + __nilfs_clear_page_dirty(page); 1878 + unlock_page(page); 1879 + } 1867 1880 return; 1881 + } 1868 1882 1869 1883 __nilfs_end_page_io(page, err); 1870 1884 }