nilfs2: fix issue with flush kernel thread after remount in RO mode because of driver...
[linux-2.6-block.git] / fs / nilfs2 / inode.c
index 6b49f14eac8cdadf4bebc9f4ff9c1869b5107f12..ba7a1da7634b2a19a7a01da2dba9712fd6e2971b 100644 (file)
@@ -175,6 +175,11 @@ static int nilfs_writepages(struct address_space *mapping,
        struct inode *inode = mapping->host;
        int err = 0;
 
+       if (inode->i_sb->s_flags & MS_RDONLY) {
+               nilfs_clear_dirty_pages(mapping, false);
+               return -EROFS;
+       }
+
        if (wbc->sync_mode == WB_SYNC_ALL)
                err = nilfs_construct_dsync_segment(inode->i_sb, inode,
                                                    wbc->range_start,
@@ -187,6 +192,18 @@ static int nilfs_writepage(struct page *page, struct writeback_control *wbc)
        struct inode *inode = page->mapping->host;
        int err;
 
+       if (inode && (inode->i_sb->s_flags & MS_RDONLY)) {
+               /*
+                * It means that filesystem was remounted in read-only
+                * mode because of error or metadata corruption. But we
+                * have dirty pages that try to be flushed in background.
+                * So, here we simply discard this dirty page.
+                */
+               nilfs_clear_dirty_page(page, false);
+               unlock_page(page);
+               return -EROFS;
+       }
+
        redirty_page_for_writepage(wbc, page);
        unlock_page(page);