f2fs: introduce replace_block() for reuse
PATCH v2 1/3 f2fs: introduce replace_block() for reuse
Introduce a generic function replace_block base on recover_data_page, and export it. So wit it we can operate file's meta data which is in CP/SSA area when we invoke fallocate with FALLOC_FL_COLLAPSE_RANGE flag.
--- fs/f2fs/f2fs.h | 4 ++-- fs/f2fs/recovery.c | 2 +- fs/f2fs/segment.c | 33 ++++++++++++++++++++++++++------- 3 files changed, 29 insertions(+), 10 deletions(-)
fs/f2fs/f2fs.h +2 -2
@@ -1560,8 +1560,8 @@ void write_node_page(struct f2fs_sb_info *, struct page *,void write_data_page (struct page *,struct dnode_of_data *,struct f2fs_io_info *);void rewrite_data_page (struct page *,struct f2fs_io_info *); -void recover_data_page (struct f2fs_sb_info *,struct page *, -struct f2fs_summary *,block_t ,block_t ); +void replace_block (struct f2fs_sb_info *,struct f2fs_summary *, +block_t ,block_t ,bool );void allocate_data_block (struct f2fs_sb_info *,struct page *,block_t ,block_t *,struct f2fs_summary *,int );void f2fs_wait_on_page_writeback (struct page *,enum page_type );
fs/f2fs/recovery.c +1 -1
@@ -412,7 +412,7 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,set_summary (&sum, dn.nid, dn.ofs_in_node, ni.version);/* write dummy data page */ -recover_data_page (sbi,NULL , &sum, src, dest); +replace_block (sbi, &sum, src, dest, true); dn.data_blkaddr = dest;set_data_blkaddr (&dn);f2fs_update_extent_cache (&dn);
fs/f2fs/segment.c +26 -7
@@ -1258,26 +1258,34 @@ void rewrite_data_page(struct page *page, struct f2fs_io_info *fio)f2fs_submit_page_mbio (F2FS_P_SB (page), page, fio); } -void recover_data_page (struct f2fs_sb_info *sbi, -struct page *page,struct f2fs_summary *sum, -block_t old_blkaddr,block_t new_blkaddr) +void replace_block (struct f2fs_sb_info *sbi,struct f2fs_summary *sum, +block_t old_blkaddr,block_t new_blkaddr, +bool recover_curseg) {struct sit_info *sit_i =SIT_I (sbi);struct curseg_info *curseg;unsigned int segno, old_cursegno;struct seg_entry *se;int type; +unsigned short old_blkoff; segno =GET_SEGNO (sbi, new_blkaddr); se =get_seg_entry (sbi, segno); type = se->type; -if (se->valid_blocks ==0 && !IS_CURSEG (sbi, segno)) { -if (old_blkaddr ==NULL_ADDR ) - type =CURSEG_COLD_DATA ; -else +if (recover_curseg) { +/* for recovery flow */ +if (se->valid_blocks ==0 && !IS_CURSEG (sbi, segno)) { +if (old_blkaddr ==NULL_ADDR ) + type =CURSEG_COLD_DATA ; +else + type =CURSEG_WARM_DATA ; + } + }else { +if (!IS_CURSEG (sbi, segno)) type =CURSEG_WARM_DATA ; } + curseg =CURSEG_I (sbi, type);mutex_lock (&curseg->curseg_mutex);
@@ -1289,6 +1297,10 @@ void recover_data_page(struct f2fs_sb_info *sbi,if (segno != curseg->segno) { curseg->next_segno = segno;change_curseg (sbi, type, true); + recover_curseg = true; + }else { + old_blkoff = curseg->next_blkoff; + recover_curseg = false; } curseg->next_blkoff =GET_BLKOFF_FROM_SEG0 (sbi, new_blkaddr);
@@ -1297,6 +1309,13 @@ void recover_data_page(struct f2fs_sb_info *sbi,refresh_sit_entry (sbi, old_blkaddr, new_blkaddr);locate_dirty_segment (sbi, old_cursegno); +if (recover_curseg) { + curseg->next_segno = old_cursegno; +change_curseg (sbi, type, true); + }else { + curseg->next_blkoff = old_blkoff; + } +mutex_unlock (&sit_i->sentry_lock);mutex_unlock (&curseg->curseg_mutex); }
Signature · 1 line
2.3.3
Jaegeuk Kim
maintainerHi Chao,
Quoted 31 lines · Chao Yu
Introduce a generic function
replace_blockbase onrecover_data_page, and export it. So wit it we can operate file's meta data which is in CP/SSA area when we invoke fallocate withFALLOC_FL_COLLAPSE_RANGEflag.Signed-off-by Chao Yu <[email protected]>--- fs/f2fs/f2fs.h | 4 ++-- fs/f2fs/recovery.c | 2 +- fs/f2fs/segment.c | 33 ++++++++++++++++++++++++++------- 3 files changed, 29 insertions(+), 10 deletions(-)fs/f2fs/f2fs.h +2
-2@@ -1560,8 +1560,8 @@ void write_node_page(struct f2fs_sb_info *, struct page *,void write_data_page (struct page *,struct dnode_of_data *,struct f2fs_io_info *);void rewrite_data_page (struct page *,struct f2fs_io_info *); -void recover_data_page (struct f2fs_sb_info *,struct page *, -struct f2fs_summary *,block_t ,block_t ); +void replace_block (struct f2fs_sb_info *,struct f2fs_summary *, +block_t ,block_t ,bool );void allocate_data_block (struct f2fs_sb_info *,struct page *,block_t ,block_t *,struct f2fs_summary *,int );void f2fs_wait_on_page_writeback (struct page *,enum page_type );fs/f2fs/recovery.c +0
-0
fs/f2fs/recovery.c static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode, · line 415
Quoted 5 lines
fs/f2fs/recovery.c +1
-1@@ -412,7 +412,7 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,set_summary (&sum, dn.nid, dn.ofs_in_node, ni.version);/* write dummy data page */ -recover_data_page (sbi,NULL , &sum, src, dest); +replace_block (sbi, &sum, src, dest, true);
It's a little bit confusing.
The recover_data_page wants not to recover curseg, right?
So, does it need to call replace_block(.., false);
Quoted 8 lines
fs/f2fs/recovery.c +0
-0dn.data_blkaddr = dest;set_data_blkaddr (&dn);f2fs_update_extent_cache (&dn);fs/f2fs/segment.c +0
-0
fs/f2fs/segment.c void rewrite_data_page(struct page *page, struct f2fs_io_info *fio) · line 1261
Quoted 7 lines
fs/f2fs/segment.c +1
-3@@ -1258,26 +1258,34 @@ void rewrite_data_page(struct page *page, struct f2fs_io_info *fio)f2fs_submit_page_mbio (F2FS_P_SB (page), page, fio); } -void recover_data_page (struct f2fs_sb_info *sbi, -struct page *page,struct f2fs_summary *sum, -block_t old_blkaddr,block_t new_blkaddr) +void replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
How about f2fs_replace_block()?
Quoted 9 lines
fs/f2fs/segment.c +3
-0+ block_t old_blkaddr, block_t new_blkaddr, + bool recover_curseg) { struct sit_info *sit_i = SIT_I(sbi);struct curseg_info *curseg;unsigned int segno, old_cursegno;struct seg_entry *se;int type; +unsigned short old_blkoff;
fs/f2fs/segment.c void rewrite_data_page(struct page *page, struct f2fs_io_info *fio) · line 1276
Quoted 10 lines
fs/f2fs/segment.c +1
-4segno =GET_SEGNO (sbi, new_blkaddr); se =get_seg_entry (sbi, segno); type = se->type; -if (se->valid_blocks ==0 && !IS_CURSEG (sbi, segno)) { -if (old_blkaddr ==NULL_ADDR ) - type =CURSEG_COLD_DATA ; -else +if (recover_curseg) {
if (!recover_curseg) { ?
Quoted 16 lines
fs/f2fs/segment.c +10
-0+/* for recovery flow */ +if (se->valid_blocks ==0 && !IS_CURSEG (sbi, segno)) { +if (old_blkaddr ==NULL_ADDR ) + type =CURSEG_COLD_DATA ; +else + type =CURSEG_WARM_DATA ; + } + }else { +if (!IS_CURSEG (sbi, segno)) type =CURSEG_WARM_DATA ; } + curseg =CURSEG_I (sbi, type);mutex_lock (&curseg->curseg_mutex);
fs/f2fs/segment.c void recover_data_page(struct f2fs_sb_info *sbi, · line 1300
Quoted 4 lines
fs/f2fs/segment.c +1
-0@@ -1289,6 +1297,10 @@ void recover_data_page(struct f2fs_sb_info *sbi,if (segno != curseg->segno) { curseg->next_segno = segno;change_curseg (sbi, type, true); + recover_curseg = true;
^---- Why ?
fs/f2fs/segment.c void recover_data_page(struct f2fs_sb_info *sbi, · line 1301
Quoted 1 line
fs/f2fs/segment.c +1
-0+ }else {
} else if {recover_curseg) {fs/f2fs/segment.c void recover_data_page(struct f2fs_sb_info *sbi, · line 1303
Quoted 2 lines
fs/f2fs/segment.c +2
-0+ old_blkoff = curseg->next_blkoff; + recover_curseg = false;
^---- Ditto
fs/f2fs/segment.c void recover_data_page(struct f2fs_sb_info *sbi, · line 1317
Quoted 13 lines
fs/f2fs/segment.c +6
-0} curseg->next_blkoff =GET_BLKOFF_FROM_SEG0 (sbi, new_blkaddr);@@ -1297,6 +1309,13 @@ void recover_data_page(struct f2fs_sb_info *sbi,refresh_sit_entry (sbi, old_blkaddr, new_blkaddr);locate_dirty_segment (sbi, old_cursegno); +if (recover_curseg) { + cureg->next_segno = old_cursegno; +change_curseg (sbi, type, true); + }else { + curseg->next_blkoff = old_blkoff; + }
Do we have to do like this?
if (recover_curseg) {
cureg->next_segno = old_cursegno;
change_curseg(sbi, type, true);
curseg->next_blkoff = old_blkoff;
}
Thanks,Quoted 6 lines
fs/f2fs/segment.c +1
-0+mutex_unlock (&sit_i->sentry_lock);mutex_unlock (&curseg->curseg_mutex); }Signature · 1 line
2.3.3
Hi Jaegeuk,
Sorry for the delay.
Quoted 43 lines
-----Original Message-----
From: Jaegeuk Kim [mailto:[email protected]]
Sent: Friday, May 01, 2015 2:04 AM
To: Chao Yu
Cc: Changman Lee; [email protected]; [email protected]
Subject: Re: [PATCH v2 1/3] f2fs: introducereplace_block()for reuseHi Chao,
Quoted 33 lines · Chao Yu
Introduce a generic function
replace_blockbase onrecover_data_page, and export it. So wit it we can operate file's meta data which is in CP/SSA area when we invoke fallocate withFALLOC_FL_COLLAPSE_RANGEflag.Signed-off-by Chao Yu <[email protected]>--- fs/f2fs/f2fs.h | 4 ++-- fs/f2fs/recovery.c | 2 +- fs/f2fs/segment.c | 33 ++++++++++++++++++++++++++------- 3 files changed, 29 insertions(+), 10 deletions(-)fs/f2fs/f2fs.h +2
-2@@ -1560,8 +1560,8 @@ void write_node_page(struct f2fs_sb_info *, struct page *,void write_data_page (struct page *,struct dnode_of_data *,struct f2fs_io_info *);void rewrite_data_page (struct page *,struct f2fs_io_info *); -void recover_data_page (struct f2fs_sb_info *,struct page *, -struct f2fs_summary *,block_t ,block_t ); +void replace_block (struct f2fs_sb_info *,struct f2fs_summary *, +block_t ,block_t ,bool );void allocate_data_block (struct f2fs_sb_info *,struct page *,block_t ,block_t *,struct f2fs_summary *,int );void f2fs_wait_on_page_writeback (struct page *,enum page_type );fs/f2fs/recovery.c +0
-0@@ -412,7 +412,7 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,set_summary (&sum, dn.nid, dn.ofs_in_node, ni.version);
Quoted 8 lines
fs/f2fs/recovery.c static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode, · line 415
Quoted 3 lines
fs/f2fs/recovery.c +1
-1/* write dummy data page */ -recover_data_page (sbi,NULL , &sum, src, dest); +replace_block (sbi, &sum, src, dest, true);It's a little bit confusing.
Therecover_data_pagewants not to recover curseg, right?So, does it need to call
replace_block(.., false);
You're right, my mistake. The following code in this patch should be wrong, let me fix it as you suggested. Thank you for the review!
Regards,
Quoted 103 lines
Quoted 9 lines
fs/f2fs/recovery.c +0
-0dn.data_blkaddr = dest;set_data_blkaddr (&dn);f2fs_update_extent_cache (&dn);fs/f2fs/segment.c +0
-0fs/f2fs/segment.c void rewrite_data_page(struct page *page, struct f2fs_io_info *fio) · line 1261
Quoted 7 lines
fs/f2fs/segment.c +1
-3@@ -1258,26 +1258,34 @@ void rewrite_data_page(struct page *page, struct f2fs_io_info *fio)f2fs_submit_page_mbio (F2FS_P_SB (page), page, fio); } -void recover_data_page (struct f2fs_sb_info *sbi, -struct page *page,struct f2fs_summary *sum, -block_t old_blkaddr,block_t new_blkaddr) +void replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,How about
f2fs_replace_block()?Quoted 9 lines
fs/f2fs/segment.c +3
-0+ block_t old_blkaddr, block_t new_blkaddr, + bool recover_curseg) { struct sit_info *sit_i = SIT_I(sbi);struct curseg_info *curseg;unsigned int segno, old_cursegno;struct seg_entry *se;int type; +unsigned short old_blkoff;fs/f2fs/segment.c void rewrite_data_page(struct page *page, struct f2fs_io_info *fio) · line 1276
Quoted 10 lines
fs/f2fs/segment.c +1
-4segno =GET_SEGNO (sbi, new_blkaddr); se =get_seg_entry (sbi, segno); type = se->type; -if (se->valid_blocks ==0 && !IS_CURSEG (sbi, segno)) { -if (old_blkaddr ==NULL_ADDR ) - type =CURSEG_COLD_DATA ; -else +if (recover_curseg) {if (!recover_curseg) { ?
Quoted 16 lines
fs/f2fs/segment.c +10
-0+/* for recovery flow */ +if (se->valid_blocks ==0 && !IS_CURSEG (sbi, segno)) { +if (old_blkaddr ==NULL_ADDR ) + type =CURSEG_COLD_DATA ; +else + type =CURSEG_WARM_DATA ; + } + }else { +if (!IS_CURSEG (sbi, segno)) type =CURSEG_WARM_DATA ; } + curseg =CURSEG_I (sbi, type);mutex_lock (&curseg->curseg_mutex);fs/f2fs/segment.c void recover_data_page(struct f2fs_sb_info *sbi, · line 1300
Quoted 4 lines
fs/f2fs/segment.c +1
-0@@ -1289,6 +1297,10 @@ void recover_data_page(struct f2fs_sb_info *sbi,if (segno != curseg->segno) { curseg->next_segno = segno;change_curseg (sbi, type, true); + recover_curseg = true;^---- Why ?fs/f2fs/segment.c void recover_data_page(struct f2fs_sb_info *sbi, · line 1301
Quoted 1 line
fs/f2fs/segment.c +1
-0+ }else {} else if {recover_curseg) {fs/f2fs/segment.c void recover_data_page(struct f2fs_sb_info *sbi, · line 1303
Quoted 2 lines
fs/f2fs/segment.c +2
-0+ old_blkoff = curseg->next_blkoff; + recover_curseg = false;^---- Dittofs/f2fs/segment.c void recover_data_page(struct f2fs_sb_info *sbi, · line 1317
Quoted 13 lines
fs/f2fs/segment.c +6
-0} curseg->next_blkoff =GET_BLKOFF_FROM_SEG0 (sbi, new_blkaddr);@@ -1297,6 +1309,13 @@ void recover_data_page(struct f2fs_sb_info *sbi,refresh_sit_entry (sbi, old_blkaddr, new_blkaddr);locate_dirty_segment (sbi, old_cursegno); +if (recover_curseg) { + cureg->next_segno = old_cursegno; +change_curseg (sbi, type, true); + }else { + curseg->next_blkoff = old_blkoff; + }Do we have to do like this? if (recover_curseg) { cureg->next_segno = old_cursegno; change_curseg(sbi, type, true); curseg->next_blkoff = old_blkoff; } Thanks,Quoted 6 lines
fs/f2fs/segment.c +1
-1+mutex_unlock (&sit_i->sentry_lock);mutex_unlock (&curseg->curseg_mutex); } --2.3.3