Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Revert "f2fs: block cache/dio write during f2fs_enable_checkpoint()"

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 <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

authored by

Chao Yu and committed by
Jaegeuk Kim
3996b702 0eda086d

+9 -34
-2
fs/f2fs/data.c
··· 1474 1474 struct f2fs_lock_context *lc, 1475 1475 int flag) 1476 1476 { 1477 - f2fs_down_read(&sbi->cp_enable_rwsem); 1478 1477 if (flag == F2FS_GET_BLOCK_PRE_AIO) 1479 1478 f2fs_down_read_trace(&sbi->node_change, lc); 1480 1479 else ··· 1488 1489 f2fs_up_read_trace(&sbi->node_change, lc); 1489 1490 else 1490 1491 f2fs_unlock_op(sbi, lc); 1491 - f2fs_up_read(&sbi->cp_enable_rwsem); 1492 1492 } 1493 1493 1494 1494 int f2fs_get_block_locked(struct dnode_of_data *dn, pgoff_t index)
+1 -2
fs/f2fs/f2fs.h
··· 311 311 #define DEF_CP_INTERVAL 60 /* 60 secs */ 312 312 #define DEF_IDLE_INTERVAL 5 /* 5 secs */ 313 313 #define DEF_DISABLE_INTERVAL 5 /* 5 secs */ 314 - #define DEF_ENABLE_INTERVAL 5 /* 5 secs */ 314 + #define DEF_ENABLE_INTERVAL 16 /* 16 secs */ 315 315 #define DEF_DISABLE_QUICK_INTERVAL 1 /* 1 secs */ 316 316 #define DEF_UMOUNT_DISCARD_TIMEOUT 5 /* 5 secs */ 317 317 ··· 1762 1762 long interval_time[MAX_TIME]; /* to store thresholds */ 1763 1763 struct ckpt_req_control cprc_info; /* for checkpoint request control */ 1764 1764 struct cp_stats cp_stats; /* for time stat of checkpoint */ 1765 - struct f2fs_rwsem cp_enable_rwsem; /* block cache/dio write */ 1766 1765 1767 1766 struct inode_management im[MAX_INO_ENTRY]; /* manage inode cache */ 1768 1767
+8 -30
fs/f2fs/super.c
··· 2687 2687 static int f2fs_enable_checkpoint(struct f2fs_sb_info *sbi) 2688 2688 { 2689 2689 unsigned int nr_pages = get_pages(sbi, F2FS_DIRTY_DATA) / 16; 2690 - long long start, writeback, lock, sync_inode, end; 2690 + long long start, writeback, end; 2691 2691 int ret; 2692 2692 struct f2fs_lock_context lc; 2693 2693 2694 - f2fs_info(sbi, "%s start, meta: %lld, node: %lld, data: %lld", 2695 - __func__, 2694 + f2fs_info(sbi, "f2fs_enable_checkpoint() starts, meta: %lld, node: %lld, data: %lld", 2696 2695 get_pages(sbi, F2FS_DIRTY_META), 2697 2696 get_pages(sbi, F2FS_DIRTY_NODES), 2698 2697 get_pages(sbi, F2FS_DIRTY_DATA)); ··· 2710 2711 } 2711 2712 writeback = ktime_get(); 2712 2713 2713 - f2fs_down_write(&sbi->cp_enable_rwsem); 2714 - 2715 - lock = ktime_get(); 2716 - 2717 - if (get_pages(sbi, F2FS_DIRTY_DATA)) 2718 - sync_inodes_sb(sbi->sb); 2714 + sync_inodes_sb(sbi->sb); 2719 2715 2720 2716 if (unlikely(get_pages(sbi, F2FS_DIRTY_DATA))) 2721 - f2fs_warn(sbi, "%s: has some unwritten data: %lld", 2722 - __func__, get_pages(sbi, F2FS_DIRTY_DATA)); 2723 - 2724 - sync_inode = ktime_get(); 2717 + f2fs_warn(sbi, "checkpoint=enable has some unwritten data: %lld", 2718 + get_pages(sbi, F2FS_DIRTY_DATA)); 2725 2719 2726 2720 f2fs_down_write_trace(&sbi->gc_lock, &lc); 2727 2721 f2fs_dirty_to_prefree(sbi); ··· 2723 2731 set_sbi_flag(sbi, SBI_IS_DIRTY); 2724 2732 f2fs_up_write_trace(&sbi->gc_lock, &lc); 2725 2733 2726 - f2fs_info(sbi, "%s sync_fs, meta: %lld, imeta: %lld, node: %lld, dents: %lld, qdata: %lld", 2727 - __func__, 2728 - get_pages(sbi, F2FS_DIRTY_META), 2729 - get_pages(sbi, F2FS_DIRTY_IMETA), 2730 - get_pages(sbi, F2FS_DIRTY_NODES), 2731 - get_pages(sbi, F2FS_DIRTY_DENTS), 2732 - get_pages(sbi, F2FS_DIRTY_QDATA)); 2733 2734 ret = f2fs_sync_fs(sbi->sb, 1); 2734 2735 if (ret) 2735 2736 f2fs_err(sbi, "%s sync_fs failed, ret: %d", __func__, ret); ··· 2730 2745 /* Let's ensure there's no pending checkpoint anymore */ 2731 2746 f2fs_flush_ckpt_thread(sbi); 2732 2747 2733 - f2fs_up_write(&sbi->cp_enable_rwsem); 2734 - 2735 2748 end = ktime_get(); 2736 2749 2737 - f2fs_info(sbi, "%s end, writeback:%llu, " 2738 - "lock:%llu, sync_inode:%llu, sync_fs:%llu", 2739 - __func__, 2740 - ktime_ms_delta(writeback, start), 2741 - ktime_ms_delta(lock, writeback), 2742 - ktime_ms_delta(sync_inode, lock), 2743 - ktime_ms_delta(end, sync_inode)); 2750 + f2fs_info(sbi, "f2fs_enable_checkpoint() finishes, writeback:%llu, sync:%llu", 2751 + ktime_ms_delta(writeback, start), 2752 + ktime_ms_delta(end, writeback)); 2744 2753 return ret; 2745 2754 } 2746 2755 ··· 4931 4952 init_f2fs_rwsem_trace(&sbi->node_change, sbi, LOCK_NAME_NODE_CHANGE); 4932 4953 spin_lock_init(&sbi->stat_lock); 4933 4954 init_f2fs_rwsem_trace(&sbi->cp_rwsem, sbi, LOCK_NAME_CP_RWSEM); 4934 - init_f2fs_rwsem(&sbi->cp_enable_rwsem); 4935 4955 init_f2fs_rwsem(&sbi->quota_sem); 4936 4956 init_waitqueue_head(&sbi->cp_wait); 4937 4957 spin_lock_init(&sbi->error_lock);