diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/f2fs/checkpoint.c | 29 | ||||
-rw-r--r-- | fs/f2fs/gc.c | 2 |
2 files changed, 23 insertions, 8 deletions
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index 293d0486a40f..8f5dff1989a8 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c | |||
@@ -81,17 +81,18 @@ static int f2fs_write_meta_page(struct page *page, | |||
81 | struct inode *inode = page->mapping->host; | 81 | struct inode *inode = page->mapping->host; |
82 | struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 82 | struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); |
83 | 83 | ||
84 | /* Should not write any meta pages, if any IO error was occurred */ | 84 | if (unlikely(sbi->por_doing)) |
85 | if (unlikely(sbi->por_doing || | ||
86 | is_set_ckpt_flags(F2FS_CKPT(sbi), CP_ERROR_FLAG))) | ||
87 | goto redirty_out; | 85 | goto redirty_out; |
88 | |||
89 | if (wbc->for_reclaim) | 86 | if (wbc->for_reclaim) |
90 | goto redirty_out; | 87 | goto redirty_out; |
91 | 88 | ||
92 | wait_on_page_writeback(page); | 89 | /* Should not write any meta pages, if any IO error was occurred */ |
90 | if (unlikely(is_set_ckpt_flags(F2FS_CKPT(sbi), CP_ERROR_FLAG))) | ||
91 | goto no_write; | ||
93 | 92 | ||
93 | wait_on_page_writeback(page); | ||
94 | write_meta_page(sbi, page); | 94 | write_meta_page(sbi, page); |
95 | no_write: | ||
95 | dec_page_count(sbi, F2FS_DIRTY_META); | 96 | dec_page_count(sbi, F2FS_DIRTY_META); |
96 | unlock_page(page); | 97 | unlock_page(page); |
97 | return 0; | 98 | return 0; |
@@ -148,10 +149,22 @@ long sync_meta_pages(struct f2fs_sb_info *sbi, enum page_type type, | |||
148 | 149 | ||
149 | for (i = 0; i < nr_pages; i++) { | 150 | for (i = 0; i < nr_pages; i++) { |
150 | struct page *page = pvec.pages[i]; | 151 | struct page *page = pvec.pages[i]; |
152 | |||
151 | lock_page(page); | 153 | lock_page(page); |
152 | f2fs_bug_on(page->mapping != mapping); | 154 | |
153 | f2fs_bug_on(!PageDirty(page)); | 155 | if (unlikely(page->mapping != mapping)) { |
154 | clear_page_dirty_for_io(page); | 156 | continue_unlock: |
157 | unlock_page(page); | ||
158 | continue; | ||
159 | } | ||
160 | if (!PageDirty(page)) { | ||
161 | /* someone wrote it for us */ | ||
162 | goto continue_unlock; | ||
163 | } | ||
164 | |||
165 | if (!clear_page_dirty_for_io(page)) | ||
166 | goto continue_unlock; | ||
167 | |||
155 | if (f2fs_write_meta_page(page, &wbc)) { | 168 | if (f2fs_write_meta_page(page, &wbc)) { |
156 | unlock_page(page); | 169 | unlock_page(page); |
157 | break; | 170 | break; |
diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index ea0371e854b4..b0f57628fe55 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c | |||
@@ -701,6 +701,8 @@ int f2fs_gc(struct f2fs_sb_info *sbi) | |||
701 | gc_more: | 701 | gc_more: |
702 | if (unlikely(!(sbi->sb->s_flags & MS_ACTIVE))) | 702 | if (unlikely(!(sbi->sb->s_flags & MS_ACTIVE))) |
703 | goto stop; | 703 | goto stop; |
704 | if (unlikely(is_set_ckpt_flags(F2FS_CKPT(sbi), CP_ERROR_FLAG))) | ||
705 | goto stop; | ||
704 | 706 | ||
705 | if (gc_type == BG_GC && has_not_enough_free_secs(sbi, nfree)) { | 707 | if (gc_type == BG_GC && has_not_enough_free_secs(sbi, nfree)) { |
706 | gc_type = FG_GC; | 708 | gc_type = FG_GC; |