On 2024/6/6 17:52, Chao Yu wrote:
After commit 261eeb9c1585 ("f2fs: introduce checkpoint_merge mount
option"), checkpoint can be triggered in background thread, it missed
to cover f2fs inner checkpoint operation w/ sb_{start,end}_intwrite(),
fix it.

It needs to use sb_start_intwrite_trylock(), otherwise, it will cause
deadlock as below:

- freeze_super
 - sb_wait_write(SB_FREEZE_WRITE)
 - sb_wait_write(SB_FREEZE_PAGEFAULT)
 - sb_wait_write(SB_FREEZE_FS)
                                        - sync
                                         - iterate_supers
                                          - super_lock_shared
                                           - down_read(&sb->s_umount)
                                           - sync_fs_one_sb
                                            - f2fs_sync_fs
                                             - f2fs_issue_checkpoint
                                              - wait_for_completion
                                                                        - 
issue_checkpoint_thread
                                                                         - 
sb_start_intwrite(sbi->sb);

- thaw_super
 - super_lock_excl
  - down_write(&sb->s_umount)

Thanks,


Fixes: 261eeb9c1585 ("f2fs: introduce checkpoint_merge mount option")
Cc: Daeho Jeong <daehoje...@google.com>
Signed-off-by: Chao Yu <c...@kernel.org>
---
  fs/f2fs/checkpoint.c | 5 ++++-
  1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c
index 55d444bec5c0..66eaad591b60 100644
--- a/fs/f2fs/checkpoint.c
+++ b/fs/f2fs/checkpoint.c
@@ -1828,8 +1828,11 @@ static int issue_checkpoint_thread(void *data)
        if (kthread_should_stop())
                return 0;
- if (!llist_empty(&cprc->issue_list))
+       if (!llist_empty(&cprc->issue_list)) {
+               sb_start_intwrite(sbi->sb);
                __checkpoint_and_complete_reqs(sbi);
+               sb_end_intwrite(sbi->sb);
+       }
wait_event_interruptible(*q,
                kthread_should_stop() || !llist_empty(&cprc->issue_list));


_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to