[f2fs] Try SSR/IPU/checkpoint for every allocation

This change is helpful to secure free segments without GC and
to prevent from wasting segments in a sync io manner.

TODO: It will be removed after GC IMPL or cache IMPLE.

Test: fx test fs-tests
Failed tests: RwFullDiskTest.PartialWriteSucceedsForFullDisk/F2fs

Change-Id: I6d7eecc187589ad80a618e1ff3640cfb5938dfce
Reviewed-on: https://fuchsia-review.googlesource.com/c/third_party/f2fs/+/539561
Reviewed-by: Brett Wilson <brettw@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index fc5046e..d257f1a 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -11,7 +11,7 @@
   f2fs_bu_debug = false
 
   # Enforce every allocation in a ssr manner [for test]
-  f2fs_force_ssr = false
+  f2fs_force_ssr = true
 
   # Enable f2fs_roll_forward
   f2fs_roll_fwd = false
diff --git a/segment.cc b/segment.cc
index 9b5a917..aab275b 100644
--- a/segment.cc
+++ b/segment.cc
@@ -231,7 +231,7 @@
  * But, currently set 100 in percentage, which means it is disabled.
  * See below need_inplace_update().
  */
-constexpr uint32_t kMinIpuUtil = 50;
+constexpr uint32_t kMinIpuUtil = 0;
 bool SegMgr::NeedInplaceUpdate(VnodeF2fs *vnode) {
   if (S_ISDIR(vnode->i_mode_))
     return false;
@@ -417,8 +417,9 @@
     fs_->Nodemgr().SyncNodePages(0, &wbc);
   }
 
-  // TODO: IMPL GC
-  if (HasNotEnoughFreeSecs() && PrefreeSegments()) {
+  // TODO: need to change after gc IMPL
+  // Without GC, f2fs needs to secure free segments aggressively.
+  if (/*HasNotEnoughFreeSecs() &&*/ PrefreeSegments()) {
 #if 0  // porting needed
     // mtx_lock(&sbi.gc_mutex);
     // F2fsGc(&sbi, 1);
@@ -934,9 +935,13 @@
   // ofs_unit = NeedSSR() ? 1 : sbi.segs_per_sec;
   // curseg->next_segno = CheckPrefreeSegments(ofs_unit, type);
 
+  // TODO: Temporarily enable ssr for warm node segments
+  // when the kMountDisableRollForward bit is clear.
+  // It is very helpful not to waste node segments in the current sync io impl.
+  // Need to remove it after gc IMPL or cache.
   if (curseg->next_segno != kNullSegNo) {
     ChangeCurseg(type, false);
-  } else if (type == CursegType::kCursegWarmNode) {
+  } else if (!TestOpt(&sbi, kMountDisableRollForward) && type == CursegType::kCursegWarmNode) {
     NewCurseg(type, false);
   } else if (NeedSSR() && GetSsrSegment(type)) {
     ChangeCurseg(type, true);