diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 70cdf7b81e806727bdb3021ba1e51fabb4733c67..1a0716c369407a1ee47fb4e756f55a45524329be 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1695,8 +1695,8 @@ void write_meta_page(struct f2fs_sb_info *, struct page *); void write_node_page(unsigned int, struct f2fs_io_info *); void write_data_page(struct dnode_of_data *, struct f2fs_io_info *); void rewrite_data_page(struct f2fs_io_info *); -void f2fs_replace_block(struct f2fs_sb_info *, struct f2fs_summary *, - block_t, block_t, bool); +void f2fs_replace_block(struct f2fs_sb_info *, struct dnode_of_data *, + block_t, block_t, unsigned char, 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); diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 6b4ba7429dbaf206b3fda44c86dc520e927a1f0b..aec96d3f8222c3b27ffc4698166aea5800b43a1f 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -854,18 +854,10 @@ static int f2fs_do_collapse(struct inode *inode, pgoff_t start, pgoff_t end) set_data_blkaddr(&dn); } else if (new_addr != NEW_ADDR) { struct node_info ni; - struct f2fs_summary sum; get_node_info(sbi, dn.nid, &ni); - set_summary(&sum, dn.nid, dn.ofs_in_node, - ni.version); - - f2fs_replace_block(sbi, &sum, old_addr, - new_addr, true); - - dn.data_blkaddr = new_addr; - set_data_blkaddr(&dn); - f2fs_update_extent_cache(&dn); + f2fs_replace_block(sbi, &dn, old_addr, new_addr, + ni.version, true); } f2fs_put_dnode(&dn); diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c index 9de25878db2ba080d5cd0135d4af10beef650a01..24a8c1d4f45f288914b61f60c1ea0a6d583b6175 100644 --- a/fs/f2fs/recovery.c +++ b/fs/f2fs/recovery.c @@ -360,7 +360,6 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode, struct f2fs_inode_info *fi = F2FS_I(inode); unsigned int start, end; struct dnode_of_data dn; - struct f2fs_summary sum; struct node_info ni; int err = 0, recovered = 0; @@ -420,13 +419,9 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode, if (err) goto err; - set_summary(&sum, dn.nid, dn.ofs_in_node, ni.version); - /* write dummy data page */ - f2fs_replace_block(sbi, &sum, src, dest, false); - dn.data_blkaddr = dest; - set_data_blkaddr(&dn); - f2fs_update_extent_cache(&dn); + f2fs_replace_block(sbi, &dn, src, dest, + ni.version, false); recovered++; } dn.ofs_in_node++; diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 59566ae3f96407b085298ff224f82ec951afff14..46283a153acfcd9c21a9b0877992345417cc3ff0 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -1302,7 +1302,8 @@ void rewrite_data_page(struct f2fs_io_info *fio) f2fs_submit_page_mbio(fio); } -void f2fs_replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum, +static void __f2fs_replace_block(struct f2fs_sb_info *sbi, + struct f2fs_summary *sum, block_t old_blkaddr, block_t new_blkaddr, bool recover_curseg) { @@ -1362,6 +1363,21 @@ void f2fs_replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum, mutex_unlock(&curseg->curseg_mutex); } +void f2fs_replace_block(struct f2fs_sb_info *sbi, struct dnode_of_data *dn, + block_t old_addr, block_t new_addr, + unsigned char version, bool recover_curseg) +{ + struct f2fs_summary sum; + + set_summary(&sum, dn->nid, dn->ofs_in_node, version); + + __f2fs_replace_block(sbi, &sum, old_addr, new_addr, recover_curseg); + + dn->data_blkaddr = new_addr; + set_data_blkaddr(dn); + f2fs_update_extent_cache(dn); +} + static inline bool is_merged_page(struct f2fs_sb_info *sbi, struct page *page, enum page_type type) {