Revert "f2fs: handle dirty segments inside refresh_sit_entry"
Subsystems (2)
Chao Yu
maintainerPATCH 1/1 Revert "f2fs: handle dirty segments inside refresh_sit_entry"
From: Yunlong Song <[email protected]>
This reverts commit 5e443818fa0b2a2845561ee25bec181424fb2889
The commit should be reverted because call sequence of below two parts of code must be kept:
a. update sit information, it needs to be updated before segment allocation since latter allocation may trigger SSR, and SSR allocation needs latest valid block information of all segments.
b. update segment status, it needs to be updated after segment allocation since we can skip updating current opened segment status.
--- fs/f2fs/segment.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
fs/f2fs/segment.c +12 -6
@@ -1899,9 +1899,6 @@ void refresh_sit_entry(struct f2fs_sb_info *sbi, block_t old, block_t new)update_sit_entry (sbi, new,1 );if (GET_SEGNO (sbi, old) !=NULL_SEGNO )update_sit_entry (sbi, old,-1 ); - -locate_dirty_segment (sbi,GET_SEGNO (sbi, old)); -locate_dirty_segment (sbi,GET_SEGNO (sbi, new)); }void invalidate_blocks (struct f2fs_sb_info *sbi,block_t addr)
@@ -2540,13 +2537,22 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,stat_inc_block_count (sbi, curseg); +/* +* SIT information should be updated before segment allocation, +* since SSR needs latest valid block information. +*/ +refresh_sit_entry (sbi, old_blkaddr, *new_blkaddr); +if (!__has_curseg_space (sbi, type)) sit_i->s_ops->allocate_segment (sbi, type, false); +/* -* SIT information should be updated after segment allocation, -* since we need to keep dirty segments precisely under SSR. +* segment dirty status should be updated after segment allocation, +* so we just need to update status only one time after previous +* segment being closed. */ -refresh_sit_entry (sbi, old_blkaddr, *new_blkaddr); +locate_dirty_segment (sbi,GET_SEGNO (sbi, old_blkaddr)); +locate_dirty_segment (sbi,GET_SEGNO (sbi, *new_blkaddr));mutex_unlock (&sit_i->sentry_lock);
Signature · 1 line
2.14.1.145.gb3622a4ee
PATCH v2 1/1 This reverts commit 5e443818fa0b2a2845561ee25bec181424fb2889
The commit should be reverted because call sequence of below two parts of code must be kept:
a. update sit information, it needs to be updated before segment allocation since latter allocation may trigger SSR, and SSR allocation needs latest valid block information of all segments.
b. update segment status, it needs to be updated after segment allocation since we can skip updating current opened segment status.
--- fs/f2fs/f2fs.h | 1 - fs/f2fs/segment.c | 20 +++++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-)
fs/f2fs/f2fs.h +0 -1
@@ -2567,7 +2567,6 @@ int restore_node_summary(struct f2fs_sb_info *sbi,bool is_checkpointed_data (struct f2fs_sb_info *sbi,block_t blkaddr);void init_discard_policy (struct discard_policy *dpolicy,int discard_type,unsigned int granularity); -void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new);void stop_discard_thread (struct f2fs_sb_info *sbi);bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi);void clear_prefree_segments (struct f2fs_sb_info *sbi,struct cp_control *cpc);
fs/f2fs/segment.c +13 -7
@@ -1884,14 +1884,11 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)get_sec_entry (sbi, segno)->valid_blocks += del; } -void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new) +static void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new) {update_sit_entry (sbi, new,1 );if (GET_SEGNO (sbi, old) !=NULL_SEGNO )update_sit_entry (sbi, old,-1 ); - -locate_dirty_segment (sbi,GET_SEGNO (sbi, old)); -locate_dirty_segment (sbi,GET_SEGNO (sbi, new)); }void invalidate_blocks (struct f2fs_sb_info *sbi,block_t addr)
@@ -2529,13 +2526,22 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,stat_inc_block_count (sbi, curseg); +/* +* SIT information should be updated before segment allocation, +* since SSR needs latest valid block information. +*/ +refresh_sit_entry (sbi, old_blkaddr, *new_blkaddr); +if (!__has_curseg_space (sbi, type)) sit_i->s_ops->allocate_segment (sbi, type, false); +/* -* SIT information should be updated after segment allocation, -* since we need to keep dirty segments precisely under SSR. +* segment dirty status should be updated after segment allocation, +* so we just need to update status only one time after previous +* segment being closed. */ -refresh_sit_entry (sbi, old_blkaddr, *new_blkaddr); +locate_dirty_segment (sbi,GET_SEGNO (sbi, old_blkaddr)); +locate_dirty_segment (sbi,GET_SEGNO (sbi, *new_blkaddr));mutex_unlock (&sit_i->sentry_lock);
Signature · 1 line
1.8.5.2
PATCH RESEND v2 1/1 Revert "f2fs: handle dirty segments inside refresh_sit_entry"
In reply to Chao YuThis reverts commit 5e443818fa0b2a2845561ee25bec181424fb2889
The commit should be reverted because call sequence of below two parts of code must be kept:
a. update sit information, it needs to be updated before segment allocation since latter allocation may trigger SSR, and SSR allocation needs latest valid block information of all segments.
b. update segment status, it needs to be updated after segment allocation since we can skip updating current opened segment status.
--- fs/f2fs/f2fs.h | 1 - fs/f2fs/segment.c | 20 +++++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-)
fs/f2fs/f2fs.h +0 -1
@@ -2567,7 +2567,6 @@ int restore_node_summary(struct f2fs_sb_info *sbi,bool is_checkpointed_data (struct f2fs_sb_info *sbi,block_t blkaddr);void init_discard_policy (struct discard_policy *dpolicy,int discard_type,unsigned int granularity); -void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new);void stop_discard_thread (struct f2fs_sb_info *sbi);bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi);void clear_prefree_segments (struct f2fs_sb_info *sbi,struct cp_control *cpc);
fs/f2fs/segment.c +13 -7
@@ -1884,14 +1884,11 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)get_sec_entry (sbi, segno)->valid_blocks += del; } -void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new) +static void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new) {update_sit_entry (sbi, new,1 );if (GET_SEGNO (sbi, old) !=NULL_SEGNO )update_sit_entry (sbi, old,-1 ); - -locate_dirty_segment (sbi,GET_SEGNO (sbi, old)); -locate_dirty_segment (sbi,GET_SEGNO (sbi, new)); }void invalidate_blocks (struct f2fs_sb_info *sbi,block_t addr)
@@ -2529,13 +2526,22 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,stat_inc_block_count (sbi, curseg); +/* +* SIT information should be updated before segment allocation, +* since SSR needs latest valid block information. +*/ +refresh_sit_entry (sbi, old_blkaddr, *new_blkaddr); +if (!__has_curseg_space (sbi, type)) sit_i->s_ops->allocate_segment (sbi, type, false); +/* -* SIT information should be updated after segment allocation, -* since we need to keep dirty segments precisely under SSR. +* segment dirty status should be updated after segment allocation, +* so we just need to update status only one time after previous +* segment being closed. */ -refresh_sit_entry (sbi, old_blkaddr, *new_blkaddr); +locate_dirty_segment (sbi,GET_SEGNO (sbi, old_blkaddr)); +locate_dirty_segment (sbi,GET_SEGNO (sbi, *new_blkaddr));mutex_unlock (&sit_i->sentry_lock);
Signature · 1 line
1.8.5.2
Quoted 10 lines · Yunlong Song
This reverts commit
5e443818fa0b2a2845561ee25bec181424fb2889The commit should be reverted because call sequence of below two parts of code must be kept:
a. update sit information, it needs to be updated before segment allocation since latter allocation may trigger SSR, and SSR allocation needs latest valid block information of all segments.
b. update segment status, it needs to be updated after segment allocation since we can skip updating current opened segment status.
Quoted 3 lines
Fixes 5e443818fa0b ("f2fs: handle dirty segments inside refresh_sit_entry")Suggested-by Chao Yu <[email protected]>Signed-off-by Yunlong Song <[email protected]>
Thanks,
Quoted 64 lines
--- fs/f2fs/f2fs.h | 1 - fs/f2fs/segment.c | 20 +++++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-)fs/f2fs/f2fs.h +0
-1@@ -2567,7 +2567,6 @@ int restore_node_summary(struct f2fs_sb_info *sbi,bool is_checkpointed_data (struct f2fs_sb_info *sbi,block_t blkaddr);void init_discard_policy (struct discard_policy *dpolicy,int discard_type,unsigned int granularity); -void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new);void stop_discard_thread (struct f2fs_sb_info *sbi);bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi);void clear_prefree_segments (struct f2fs_sb_info *sbi,struct cp_control *cpc);fs/f2fs/segment.c +13
-7@@ -1884,14 +1884,11 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)get_sec_entry (sbi, segno)->valid_blocks += del; } -void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new) +static void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new) {update_sit_entry (sbi, new,1 );if (GET_SEGNO (sbi, old) !=NULL_SEGNO )update_sit_entry (sbi, old,-1 ); - -locate_dirty_segment (sbi,GET_SEGNO (sbi, old)); -locate_dirty_segment (sbi,GET_SEGNO (sbi, new)); }void invalidate_blocks (struct f2fs_sb_info *sbi,block_t addr)@@ -2529,13 +2526,22 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,stat_inc_block_count (sbi, curseg); +/* +* SIT information should be updated before segment allocation, +* since SSR needs latest valid block information. +*/ +refresh_sit_entry (sbi, old_blkaddr, *new_blkaddr); +if (!__has_curseg_space (sbi, type)) sit_i->s_ops->allocate_segment (sbi, type, false); +/* -* SIT information should be updated after segment allocation, -* since we need to keep dirty segments precisely under SSR. +* segment dirty status should be updated after segment allocation, +* so we just need to update status only one time after previous +* segment being closed. */ -refresh_sit_entry (sbi, old_blkaddr, *new_blkaddr); +locate_dirty_segment (sbi,GET_SEGNO (sbi, old_blkaddr)); +locate_dirty_segment (sbi,GET_SEGNO (sbi, *new_blkaddr));mutex_unlock (&sit_i->sentry_lock);
Jaegeuk Kim
maintainerQuoted 44 lines · Chao Yu
Quoted 10 lines · Yunlong Song
This reverts commit
5e443818fa0b2a2845561ee25bec181424fb2889The commit should be reverted because call sequence of below two parts of code must be kept:
a. update sit information, it needs to be updated before segment allocation since latter allocation may trigger SSR, and SSR allocation needs latest valid block information of all segments.
b. update segment status, it needs to be updated after segment allocation since we can skip updating current opened segment status.Quoted 3 lines
Fixes 5e443818fa0b ("f2fs: handle dirty segments inside refresh_sit_entry")Suggested-by Chao Yu <[email protected]>Signed-off-by Yunlong Song <[email protected]>Reviewed-by Chao Yu <[email protected]>Thanks,
Quoted 25 lines
--- fs/f2fs/f2fs.h | 1 - fs/f2fs/segment.c | 20 +++++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-)fs/f2fs/f2fs.h +0
-1@@ -2567,7 +2567,6 @@ int restore_node_summary(struct f2fs_sb_info *sbi,bool is_checkpointed_data (struct f2fs_sb_info *sbi,block_t blkaddr);void init_discard_policy (struct discard_policy *dpolicy,int discard_type,unsigned int granularity); -void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new);void stop_discard_thread (struct f2fs_sb_info *sbi);bool f2fs_wait_discard_bios (struct f2fs_sb_info *sbi);void clear_prefree_segments (struct f2fs_sb_info *sbi,struct cp_control *cpc);fs/f2fs/segment.c +0
-0@@ -1884,14 +1884,11 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)get_sec_entry (sbi, segno)->valid_blocks += del; }
Quoted 2 lines
fs/f2fs/segment.c static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del) · line 1887
Quoted 2 lines
fs/f2fs/segment.c +1
-1-void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new) +static void refresh_sit_entry (struct f2fs_sb_info *sbi,block_t old,block_t new)
IMO, we don't even need this function, and insteda, do update_sit_entry work directly below. Merged with it, so let me know, if you have any concern.
Thanks,
Quoted 37 lines
Quoted 37 lines
fs/f2fs/segment.c +12
-6{update_sit_entry (sbi, new,1 );if (GET_SEGNO (sbi, old) !=NULL_SEGNO )update_sit_entry (sbi, old,-1 ); - -locate_dirty_segment (sbi,GET_SEGNO (sbi, old)); -locate_dirty_segment (sbi,GET_SEGNO (sbi, new)); }void invalidate_blocks (struct f2fs_sb_info *sbi,block_t addr)@@ -2529,13 +2526,22 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page,stat_inc_block_count (sbi, curseg); +/* +* SIT information should be updated before segment allocation, +* since SSR needs latest valid block information. +*/ +refresh_sit_entry (sbi, old_blkaddr, *new_blkaddr); +if (!__has_curseg_space (sbi, type)) sit_i->s_ops->allocate_segment (sbi, type, false); +/* -* SIT information should be updated after segment allocation, -* since we need to keep dirty segments precisely under SSR. +* segment dirty status should be updated after segment allocation, +* so we just need to update status only one time after previous +* segment being closed. */ -refresh_sit_entry (sbi, old_blkaddr, *new_blkaddr); +locate_dirty_segment (sbi,GET_SEGNO (sbi, old_blkaddr)); +locate_dirty_segment (sbi,GET_SEGNO (sbi, *new_blkaddr));mutex_unlock (&sit_i->sentry_lock);