提交 203681f6 编写于 作者: J Jaegeuk Kim

f2fs: fix f2fs_write_meta_page at no checkpoint status

If f2fs entered errorneous checkpoint status, it should skip writing meta
pages instead of redirtying the pages out.
Otherwise, it cannot unmount the partition even though f2fs is under read-only
status.
Signed-off-by: NJaegeuk Kim <jaegeuk.kim@samsung.com>
上级 bd859c65
...@@ -81,17 +81,18 @@ static int f2fs_write_meta_page(struct page *page, ...@@ -81,17 +81,18 @@ static int f2fs_write_meta_page(struct page *page,
struct inode *inode = page->mapping->host; struct inode *inode = page->mapping->host;
struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
/* Should not write any meta pages, if any IO error was occurred */ if (unlikely(sbi->por_doing))
if (unlikely(sbi->por_doing ||
is_set_ckpt_flags(F2FS_CKPT(sbi), CP_ERROR_FLAG)))
goto redirty_out; goto redirty_out;
if (wbc->for_reclaim) if (wbc->for_reclaim)
goto redirty_out; goto redirty_out;
wait_on_page_writeback(page); /* Should not write any meta pages, if any IO error was occurred */
if (unlikely(is_set_ckpt_flags(F2FS_CKPT(sbi), CP_ERROR_FLAG)))
goto no_write;
wait_on_page_writeback(page);
write_meta_page(sbi, page); write_meta_page(sbi, page);
no_write:
dec_page_count(sbi, F2FS_DIRTY_META); dec_page_count(sbi, F2FS_DIRTY_META);
unlock_page(page); unlock_page(page);
return 0; return 0;
...@@ -148,10 +149,22 @@ long sync_meta_pages(struct f2fs_sb_info *sbi, enum page_type type, ...@@ -148,10 +149,22 @@ long sync_meta_pages(struct f2fs_sb_info *sbi, enum page_type type,
for (i = 0; i < nr_pages; i++) { for (i = 0; i < nr_pages; i++) {
struct page *page = pvec.pages[i]; struct page *page = pvec.pages[i];
lock_page(page); lock_page(page);
f2fs_bug_on(page->mapping != mapping);
f2fs_bug_on(!PageDirty(page)); if (unlikely(page->mapping != mapping)) {
clear_page_dirty_for_io(page); continue_unlock:
unlock_page(page);
continue;
}
if (!PageDirty(page)) {
/* someone wrote it for us */
goto continue_unlock;
}
if (!clear_page_dirty_for_io(page))
goto continue_unlock;
if (f2fs_write_meta_page(page, &wbc)) { if (f2fs_write_meta_page(page, &wbc)) {
unlock_page(page); unlock_page(page);
break; break;
......
...@@ -701,6 +701,8 @@ int f2fs_gc(struct f2fs_sb_info *sbi) ...@@ -701,6 +701,8 @@ int f2fs_gc(struct f2fs_sb_info *sbi)
gc_more: gc_more:
if (unlikely(!(sbi->sb->s_flags & MS_ACTIVE))) if (unlikely(!(sbi->sb->s_flags & MS_ACTIVE)))
goto stop; goto stop;
if (unlikely(is_set_ckpt_flags(F2FS_CKPT(sbi), CP_ERROR_FLAG)))
goto stop;
if (gc_type == BG_GC && has_not_enough_free_secs(sbi, nfree)) { if (gc_type == BG_GC && has_not_enough_free_secs(sbi, nfree)) {
gc_type = FG_GC; gc_type = FG_GC;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册