f2fs: switch discard_policy.timeout to bool type
[linux-2.6-microblaze.git] / fs / f2fs / checkpoint.c
index 44e84ac..852890b 100644 (file)
@@ -50,9 +50,6 @@ repeat:
        return page;
 }
 
-/*
- * We guarantee no failure on the returned page.
- */
 static struct page *__get_meta_page(struct f2fs_sb_info *sbi, pgoff_t index,
                                                        bool is_meta)
 {
@@ -206,7 +203,7 @@ bool f2fs_is_valid_blkaddr(struct f2fs_sb_info *sbi,
 }
 
 /*
- * Readahead CP/NAT/SIT/SSA pages
+ * Readahead CP/NAT/SIT/SSA/POR pages
  */
 int f2fs_ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages,
                                                        int type, bool sync)
@@ -898,7 +895,7 @@ int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi)
                return -ENOMEM;
        /*
         * Finding out valid cp block involves read both
-        * sets( cp pack1 and cp pack 2)
+        * sets( cp pack 1 and cp pack 2)
         */
        cp_start_blk_no = le32_to_cpu(fsb->cp_blkaddr);
        cp1 = validate_checkpoint(sbi, cp_start_blk_no, &cp1_version);
@@ -1250,20 +1247,20 @@ static void unblock_operations(struct f2fs_sb_info *sbi)
        f2fs_unlock_all(sbi);
 }
 
-void f2fs_wait_on_all_pages_writeback(struct f2fs_sb_info *sbi)
+void f2fs_wait_on_all_pages(struct f2fs_sb_info *sbi, int type)
 {
        DEFINE_WAIT(wait);
 
        for (;;) {
                prepare_to_wait(&sbi->cp_wait, &wait, TASK_UNINTERRUPTIBLE);
 
-               if (!get_pages(sbi, F2FS_WB_CP_DATA))
+               if (!get_pages(sbi, type))
                        break;
 
                if (unlikely(f2fs_cp_error(sbi)))
                        break;
 
-               io_schedule_timeout(5*HZ);
+               io_schedule_timeout(DEFAULT_IO_TIMEOUT);
        }
        finish_wait(&sbi->cp_wait, &wait);
 }
@@ -1301,10 +1298,14 @@ static void update_ckpt_flags(struct f2fs_sb_info *sbi, struct cp_control *cpc)
        else
                __clear_ckpt_flags(ckpt, CP_ORPHAN_PRESENT_FLAG);
 
-       if (is_sbi_flag_set(sbi, SBI_NEED_FSCK) ||
-               is_sbi_flag_set(sbi, SBI_IS_RESIZEFS))
+       if (is_sbi_flag_set(sbi, SBI_NEED_FSCK))
                __set_ckpt_flags(ckpt, CP_FSCK_FLAG);
 
+       if (is_sbi_flag_set(sbi, SBI_IS_RESIZEFS))
+               __set_ckpt_flags(ckpt, CP_RESIZEFS_FLAG);
+       else
+               __clear_ckpt_flags(ckpt, CP_RESIZEFS_FLAG);
+
        if (is_sbi_flag_set(sbi, SBI_CP_DISABLED))
                __set_ckpt_flags(ckpt, CP_DISABLED_FLAG);
        else
@@ -1384,13 +1385,8 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
 
        /* Flush all the NAT/SIT pages */
        f2fs_sync_meta_pages(sbi, META, LONG_MAX, FS_CP_META_IO);
-       f2fs_bug_on(sbi, get_pages(sbi, F2FS_DIRTY_META) &&
-                                       !f2fs_cp_error(sbi));
 
-       /*
-        * modify checkpoint
-        * version number is already updated
-        */
+       /* start to update checkpoint, cp ver is already updated previously */
        ckpt->elapsed_time = cpu_to_le64(get_mtime(sbi, true));
        ckpt->free_segment_count = cpu_to_le32(free_segments(sbi));
        for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) {
@@ -1493,11 +1489,11 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
 
        /* Here, we have one bio having CP pack except cp pack 2 page */
        f2fs_sync_meta_pages(sbi, META, LONG_MAX, FS_CP_META_IO);
-       f2fs_bug_on(sbi, get_pages(sbi, F2FS_DIRTY_META) &&
-                                       !f2fs_cp_error(sbi));
+       /* Wait for all dirty meta pages to be submitted for IO */
+       f2fs_wait_on_all_pages(sbi, F2FS_DIRTY_META);
 
        /* wait for previous submitted meta pages writeback */
-       f2fs_wait_on_all_pages_writeback(sbi);
+       f2fs_wait_on_all_pages(sbi, F2FS_WB_CP_DATA);
 
        /* flush all device cache */
        err = f2fs_flush_device_cache(sbi);
@@ -1506,7 +1502,7 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
 
        /* barrier and flush checkpoint cp pack 2 page if it can */
        commit_checkpoint(sbi, ckpt, start_blk);
-       f2fs_wait_on_all_pages_writeback(sbi);
+       f2fs_wait_on_all_pages(sbi, F2FS_WB_CP_DATA);
 
        /*
         * invalidate intermediate page cache borrowed from meta inode which are
@@ -1543,9 +1539,6 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
        return unlikely(f2fs_cp_error(sbi)) ? -EIO : 0;
 }
 
-/*
- * We guarantee that this checkpoint procedure will not fail.
- */
 int f2fs_write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
 {
        struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
@@ -1613,7 +1606,6 @@ int f2fs_write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc)
 
        f2fs_flush_sit_entries(sbi, cpc);
 
-       /* unlock all the fs_lock[] in do_checkpoint() */
        err = do_checkpoint(sbi, cpc);
        if (err)
                f2fs_release_discard_addrs(sbi);
@@ -1626,7 +1618,7 @@ stop:
        if (cpc->reason & CP_RECOVERY)
                f2fs_notice(sbi, "checkpoint: version = %llx", ckpt_ver);
 
-       /* do checkpoint periodically */
+       /* update CP_TIME to trigger checkpoint periodically */
        f2fs_update_time(sbi, CP_TIME);
        trace_f2fs_write_checkpoint(sbi->sb, cpc->reason, "finish checkpoint");
 out: