Merge branch 'for_linus' of git://cavan.codon.org.uk/platform-drivers-x86
[firefly-linux-kernel-4.4.55.git] / fs / f2fs / segment.c
index 4b009906658235d428f5455ca8da2f038e61997e..777f17e496e606de7f7e02103e606e291521b1f2 100644 (file)
@@ -29,7 +29,7 @@ void f2fs_balance_fs(struct f2fs_sb_info *sbi)
         * We should do GC or end up with checkpoint, if there are so many dirty
         * dir/node pages without enough free segments.
         */
-       if (has_not_enough_free_secs(sbi)) {
+       if (has_not_enough_free_secs(sbi, 0)) {
                mutex_lock(&sbi->gc_mutex);
                f2fs_gc(sbi);
        }
@@ -308,7 +308,7 @@ static unsigned int check_prefree_segments(struct f2fs_sb_info *sbi,
         * If there is not enough reserved sections,
         * we should not reuse prefree segments.
         */
-       if (has_not_enough_free_secs(sbi))
+       if (has_not_enough_free_secs(sbi, 0))
                return NULL_SEGNO;
 
        /*
@@ -536,6 +536,23 @@ static void change_curseg(struct f2fs_sb_info *sbi, int type, bool reuse)
        }
 }
 
+static int get_ssr_segment(struct f2fs_sb_info *sbi, int type)
+{
+       struct curseg_info *curseg = CURSEG_I(sbi, type);
+       const struct victim_selection *v_ops = DIRTY_I(sbi)->v_ops;
+
+       if (IS_NODESEG(type) || !has_not_enough_free_secs(sbi, 0))
+               return v_ops->get_victim(sbi,
+                               &(curseg)->next_segno, BG_GC, type, SSR);
+
+       /* For data segments, let's do SSR more intensively */
+       for (; type >= CURSEG_HOT_DATA; type--)
+               if (v_ops->get_victim(sbi, &(curseg)->next_segno,
+                                               BG_GC, type, SSR))
+                       return 1;
+       return 0;
+}
+
 /*
  * flush out current segment and replace it with new segment
  * This function should be returned with success, otherwise BUG
@@ -600,6 +617,7 @@ static void f2fs_end_io_write(struct bio *bio, int err)
                        if (page->mapping)
                                set_bit(AS_EIO, &page->mapping->flags);
                        set_ckpt_flags(p->sbi->ckpt, CP_ERROR_FLAG);
+                       p->sbi->sb->s_flags |= MS_RDONLY;
                }
                end_page_writeback(page);
                dec_page_count(p->sbi, F2FS_WRITEBACK);
@@ -815,15 +833,10 @@ static void do_write_page(struct f2fs_sb_info *sbi, struct page *page,
        mutex_unlock(&curseg->curseg_mutex);
 }
 
-int write_meta_page(struct f2fs_sb_info *sbi, struct page *page,
-                       struct writeback_control *wbc)
+void write_meta_page(struct f2fs_sb_info *sbi, struct page *page)
 {
-       if (wbc->for_reclaim)
-               return AOP_WRITEPAGE_ACTIVATE;
-
        set_page_writeback(page);
        submit_write_page(sbi, page, page->index, META);
-       return 0;
 }
 
 void write_node_page(struct f2fs_sb_info *sbi, struct page *page,