On 2016/11/3 10:06, Yunlei He wrote: > If one block has been to written to a new place, just return > in move data process. This patch check it again with holding > page lock. > > Signed-off-by: Yunlei He <heyun...@huawei.com> > --- > fs/f2fs/gc.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c > index 9c18917..b00bcf9 100644 > --- a/fs/f2fs/gc.c > +++ b/fs/f2fs/gc.c > @@ -544,7 +544,8 @@ static bool is_alive(struct f2fs_sb_info *sbi, struct > f2fs_summary *sum, > return true; > } > > -static void move_encrypted_block(struct inode *inode, block_t bidx) > +static void move_encrypted_block(struct inode *inode, block_t bidx, > + unsigned int segno, int > off) > { > struct f2fs_io_info fio = { > .sbi = F2FS_I_SB(inode), > @@ -579,6 +580,9 @@ static void move_encrypted_block(struct inode *inode, > block_t bidx) > * don't cache encrypted data into meta inode until previous dirty > * data were writebacked to avoid racing between GC and flush. > */ > + if (!check_valid_map(F2FS_I_SB(inode), segno, off)) > + goto put_out;
Please do this check after f2fs_grab_cache_page like we do in move_data_page. Also it will keeps above comments being consistent with below codes. Thanks, > + > f2fs_wait_on_page_writeback(page, DATA, true); > > get_node_info(fio.sbi, dn.nid, &ni); > @@ -645,7 +649,8 @@ static void move_encrypted_block(struct inode *inode, > block_t bidx) > f2fs_put_page(page, 1); > } > > -static void move_data_page(struct inode *inode, block_t bidx, int gc_type) > +static void move_data_page(struct inode *inode, block_t bidx, int gc_type, > + unsigned int segno, int > off) > { > struct page *page; > > @@ -653,6 +658,9 @@ static void move_data_page(struct inode *inode, block_t > bidx, int gc_type) > if (IS_ERR(page)) > return; > > + if (!check_valid_map(F2FS_I_SB(inode), segno, off)) > + goto out; > + > if (gc_type == BG_GC) { > if (PageWriteback(page)) > goto out; > @@ -796,9 +804,9 @@ static void gc_data_segment(struct f2fs_sb_info *sbi, > struct f2fs_summary *sum, > start_bidx = start_bidx_of_node(nofs, inode) > + ofs_in_node; > if (f2fs_encrypted_inode(inode) && > S_ISREG(inode->i_mode)) > - move_encrypted_block(inode, start_bidx); > + move_encrypted_block(inode, start_bidx, segno, > off); > else > - move_data_page(inode, start_bidx, gc_type); > + move_data_page(inode, start_bidx, gc_type, > segno, off); > > if (locked) { > up_write(&fi->dio_rwsem[WRITE]); > ------------------------------------------------------------------------------ Developer Access Program for Intel Xeon Phi Processors Access to Intel Xeon Phi processor-based developer platforms. With one year of Intel Parallel Studio XE. Training and support from Colfax. Order your platform today. http://sdm.link/xeonphi _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel