From 5c90f5dab32d89aa5381a0078f5fc5658870a985 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 17 Feb 2026 18:40:09 +0100 Subject: [PATCH] 6.19-stable patches added patches: revert-f2fs-block-cache-dio-write-during-f2fs_enable_checkpoint.patch --- ...-write-during-f2fs_enable_checkpoint.patch | 159 ++++++++++++++++++ queue-6.19/series | 1 + 2 files changed, 160 insertions(+) create mode 100644 queue-6.19/revert-f2fs-block-cache-dio-write-during-f2fs_enable_checkpoint.patch diff --git a/queue-6.19/revert-f2fs-block-cache-dio-write-during-f2fs_enable_checkpoint.patch b/queue-6.19/revert-f2fs-block-cache-dio-write-during-f2fs_enable_checkpoint.patch new file mode 100644 index 0000000000..9adf134853 --- /dev/null +++ b/queue-6.19/revert-f2fs-block-cache-dio-write-during-f2fs_enable_checkpoint.patch @@ -0,0 +1,159 @@ +From stable+bounces-216860-greg=kroah.com@vger.kernel.org Tue Feb 17 17:14:38 2026 +From: Sasha Levin +Date: Tue, 17 Feb 2026 11:14:32 -0500 +Subject: Revert "f2fs: block cache/dio write during f2fs_enable_checkpoint()" +To: stable@vger.kernel.org +Cc: Chao Yu , stable@kernel.org, Jaegeuk Kim , Sasha Levin +Message-ID: <20260217161432.3763097-1-sashal@kernel.org> + +From: Chao Yu + +[ Upstream commit 3996b70209f145bfcf2afc7d05dd92c27b233b48 ] + +This reverts commit 196c81fdd438f7ac429d5639090a9816abb9760a. + +Original patch may cause below deadlock, revert it. + +write remount +- write_begin + - lock_page --- lock A + - prepare_write_begin + - f2fs_map_lock + - f2fs_enable_checkpoint + - down_write(cp_enable_rwsem) --- lock B + - sync_inode_sb + - writepages + - lock_page --- lock A + - down_read(cp_enable_rwsem) --- lock A + +Cc: stable@kernel.org +Fixes: 196c81fdd438 ("f2fs: block cache/dio write during f2fs_enable_checkpoint()") +Signed-off-by: Chao Yu +Signed-off-by: Jaegeuk Kim +[ drop tracing bits ] +Signed-off-by: Sasha Levin +Signed-off-by: Greg Kroah-Hartman +--- + fs/f2fs/data.c | 2 -- + fs/f2fs/f2fs.h | 3 +-- + fs/f2fs/super.c | 38 ++++++++------------------------------ + 3 files changed, 9 insertions(+), 34 deletions(-) + +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -1424,7 +1424,6 @@ static int __allocate_data_block(struct + + static void f2fs_map_lock(struct f2fs_sb_info *sbi, int flag) + { +- f2fs_down_read(&sbi->cp_enable_rwsem); + if (flag == F2FS_GET_BLOCK_PRE_AIO) + f2fs_down_read(&sbi->node_change); + else +@@ -1437,7 +1436,6 @@ static void f2fs_map_unlock(struct f2fs_ + f2fs_up_read(&sbi->node_change); + else + f2fs_unlock_op(sbi); +- f2fs_up_read(&sbi->cp_enable_rwsem); + } + + int f2fs_get_block_locked(struct dnode_of_data *dn, pgoff_t index) +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -287,7 +287,7 @@ enum { + #define DEF_CP_INTERVAL 60 /* 60 secs */ + #define DEF_IDLE_INTERVAL 5 /* 5 secs */ + #define DEF_DISABLE_INTERVAL 5 /* 5 secs */ +-#define DEF_ENABLE_INTERVAL 5 /* 5 secs */ ++#define DEF_ENABLE_INTERVAL 16 /* 16 secs */ + #define DEF_DISABLE_QUICK_INTERVAL 1 /* 1 secs */ + #define DEF_UMOUNT_DISCARD_TIMEOUT 5 /* 5 secs */ + +@@ -1720,7 +1720,6 @@ struct f2fs_sb_info { + long interval_time[MAX_TIME]; /* to store thresholds */ + struct ckpt_req_control cprc_info; /* for checkpoint request control */ + struct cp_stats cp_stats; /* for time stat of checkpoint */ +- struct f2fs_rwsem cp_enable_rwsem; /* block cache/dio write */ + + struct inode_management im[MAX_INO_ENTRY]; /* manage inode cache */ + +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -2636,11 +2636,10 @@ restore_flag: + static int f2fs_enable_checkpoint(struct f2fs_sb_info *sbi) + { + unsigned int nr_pages = get_pages(sbi, F2FS_DIRTY_DATA) / 16; +- long long start, writeback, lock, sync_inode, end; ++ long long start, writeback, end; + int ret; + +- f2fs_info(sbi, "%s start, meta: %lld, node: %lld, data: %lld", +- __func__, ++ f2fs_info(sbi, "f2fs_enable_checkpoint() starts, meta: %lld, node: %lld, data: %lld", + get_pages(sbi, F2FS_DIRTY_META), + get_pages(sbi, F2FS_DIRTY_NODES), + get_pages(sbi, F2FS_DIRTY_DATA)); +@@ -2659,18 +2658,11 @@ static int f2fs_enable_checkpoint(struct + } + writeback = ktime_get(); + +- f2fs_down_write(&sbi->cp_enable_rwsem); +- +- lock = ktime_get(); +- +- if (get_pages(sbi, F2FS_DIRTY_DATA)) +- sync_inodes_sb(sbi->sb); ++ sync_inodes_sb(sbi->sb); + + if (unlikely(get_pages(sbi, F2FS_DIRTY_DATA))) +- f2fs_warn(sbi, "%s: has some unwritten data: %lld", +- __func__, get_pages(sbi, F2FS_DIRTY_DATA)); +- +- sync_inode = ktime_get(); ++ f2fs_warn(sbi, "checkpoint=enable has some unwritten data: %lld", ++ get_pages(sbi, F2FS_DIRTY_DATA)); + + f2fs_down_write(&sbi->gc_lock); + f2fs_dirty_to_prefree(sbi); +@@ -2679,13 +2671,6 @@ static int f2fs_enable_checkpoint(struct + set_sbi_flag(sbi, SBI_IS_DIRTY); + f2fs_up_write(&sbi->gc_lock); + +- f2fs_info(sbi, "%s sync_fs, meta: %lld, imeta: %lld, node: %lld, dents: %lld, qdata: %lld", +- __func__, +- get_pages(sbi, F2FS_DIRTY_META), +- get_pages(sbi, F2FS_DIRTY_IMETA), +- get_pages(sbi, F2FS_DIRTY_NODES), +- get_pages(sbi, F2FS_DIRTY_DENTS), +- get_pages(sbi, F2FS_DIRTY_QDATA)); + ret = f2fs_sync_fs(sbi->sb, 1); + if (ret) + f2fs_err(sbi, "%s sync_fs failed, ret: %d", __func__, ret); +@@ -2693,17 +2678,11 @@ static int f2fs_enable_checkpoint(struct + /* Let's ensure there's no pending checkpoint anymore */ + f2fs_flush_ckpt_thread(sbi); + +- f2fs_up_write(&sbi->cp_enable_rwsem); +- + end = ktime_get(); + +- f2fs_info(sbi, "%s end, writeback:%llu, " +- "lock:%llu, sync_inode:%llu, sync_fs:%llu", +- __func__, +- ktime_ms_delta(writeback, start), +- ktime_ms_delta(lock, writeback), +- ktime_ms_delta(sync_inode, lock), +- ktime_ms_delta(end, sync_inode)); ++ f2fs_info(sbi, "f2fs_enable_checkpoint() finishes, writeback:%llu, sync:%llu", ++ ktime_ms_delta(writeback, start), ++ ktime_ms_delta(end, writeback)); + return ret; + } + +@@ -4904,7 +4883,6 @@ try_onemore: + init_f2fs_rwsem(&sbi->node_change); + spin_lock_init(&sbi->stat_lock); + init_f2fs_rwsem(&sbi->cp_rwsem); +- init_f2fs_rwsem(&sbi->cp_enable_rwsem); + init_f2fs_rwsem(&sbi->quota_sem); + init_waitqueue_head(&sbi->cp_wait); + spin_lock_init(&sbi->error_lock); diff --git a/queue-6.19/series b/queue-6.19/series index d10043ceda..01f1bff73c 100644 --- a/queue-6.19/series +++ b/queue-6.19/series @@ -12,3 +12,4 @@ f2fs-support-non-4kb-block-size-without-packed_ssa-feature.patch f2fs-fix-to-avoid-mapping-wrong-physical-block-for-swapfile.patch f2fs-optimize-f2fs_overwrite_io-for-f2fs_iomap_begin.patch iommu-arm-smmu-qcom-do-not-register-driver-in-probe.patch +revert-f2fs-block-cache-dio-write-during-f2fs_enable_checkpoint.patch -- 2.47.3