[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);