conduct checkpoint to reclaim the prefree segments
                              to free segments. By default, 100 segments, 200MB.
 
+ ipu_policy                   This parameter controls the policy of in-place
+                              updates in f2fs. There are five policies:
+                               0: F2FS_IPU_FORCE, 1: F2FS_IPU_SSR,
+                               2: F2FS_IPU_UTIL,  3: F2FS_IPU_SSR_UTIL,
+                               4: F2FS_IPU_DISABLE.
+
+ min_ipu_util                 This parameter controls the threshold to trigger
+                              in-place-updates. The number indicates percentage
+                              of the filesystem utilization, and used by
+                              F2FS_IPU_UTIL and F2FS_IPU_SSR_UTIL policies.
+
 ================================================================================
 USAGE
 ================================================================================
 
        struct list_head discard_list;          /* 4KB discard list */
        int nr_discards;                        /* # of discards in the list */
        int max_discards;                       /* max. discards to be issued */
+
+       unsigned int ipu_policy;        /* in-place-update policy */
+       unsigned int min_ipu_util;      /* in-place-update threshold */
 };
 
 /*
 
        sm_info->main_segments = le32_to_cpu(raw_super->segment_count_main);
        sm_info->ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr);
        sm_info->rec_prefree_segments = DEF_RECLAIM_PREFREE_SEGMENTS;
+       sm_info->ipu_policy = F2FS_IPU_DISABLE;
+       sm_info->min_ipu_util = DEF_MIN_IPU_UTIL;
 
        INIT_LIST_HEAD(&sm_info->discard_list);
        sm_info->nr_discards = 0;
 
 
 /*
  * Sometimes f2fs may be better to drop out-of-place update policy.
- * So, if fs utilization is over MIN_IPU_UTIL, then f2fs tries to write
- * data in the original place likewise other traditional file systems.
- * But, currently set 100 in percentage, which means it is disabled.
- * See below need_inplace_update().
+ * And, users can control the policy through sysfs entries.
+ * There are five policies with triggering conditions as follows.
+ * F2FS_IPU_FORCE - all the time,
+ * F2FS_IPU_SSR - if SSR mode is activated,
+ * F2FS_IPU_UTIL - if FS utilization is over threashold,
+ * F2FS_IPU_SSR_UTIL - if SSR mode is activated and FS utilization is over
+ *                     threashold,
+ * F2FS_IPUT_DISABLE - disable IPU. (=default option)
  */
-#define MIN_IPU_UTIL           100
+#define DEF_MIN_IPU_UTIL       70
+
+enum {
+       F2FS_IPU_FORCE,
+       F2FS_IPU_SSR,
+       F2FS_IPU_UTIL,
+       F2FS_IPU_SSR_UTIL,
+       F2FS_IPU_DISABLE,
+};
+
 static inline bool need_inplace_update(struct inode *inode)
 {
        struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
+
+       /* IPU can be done only for the user data */
        if (S_ISDIR(inode->i_mode))
                return false;
-       if (need_SSR(sbi) && utilization(sbi) > MIN_IPU_UTIL)
+
+       switch (SM_I(sbi)->ipu_policy) {
+       case F2FS_IPU_FORCE:
                return true;
+       case F2FS_IPU_SSR:
+               if (need_SSR(sbi))
+                       return true;
+               break;
+       case F2FS_IPU_UTIL:
+               if (utilization(sbi) > SM_I(sbi)->min_ipu_util)
+                       return true;
+               break;
+       case F2FS_IPU_SSR_UTIL:
+               if (need_SSR(sbi) && utilization(sbi) > SM_I(sbi)->min_ipu_util)
+                       return true;
+               break;
+       case F2FS_IPU_DISABLE:
+               break;
+       }
        return false;
 }
 
 
 F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_idle, gc_idle);
 F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, reclaim_segments, rec_prefree_segments);
 F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, max_small_discards, max_discards);
+F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, ipu_policy, ipu_policy);
+F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, min_ipu_util, min_ipu_util);
 
 #define ATTR_LIST(name) (&f2fs_attr_##name.attr)
 static struct attribute *f2fs_attrs[] = {
        ATTR_LIST(gc_idle),
        ATTR_LIST(reclaim_segments),
        ATTR_LIST(max_small_discards),
+       ATTR_LIST(ipu_policy),
+       ATTR_LIST(min_ipu_util),
        NULL,
 };