How about the following patch, which I think would be a little better :) diff --git a/fsck/resize.c b/fsck/resize.c index 46aa30e..c295a06 100644 --- a/fsck/resize.c +++ b/fsck/resize.c @@ -207,30 +207,33 @@ static void migrate_ssa(struct f2fs_sb_info *sbi, block_t old_sum_blkaddr = get_sb(ssa_blkaddr); block_t new_sum_blkaddr = get_newsb(ssa_blkaddr); block_t end_sum_blkaddr = get_newsb(main_blkaddr); + block_t expand_sum_blkaddr = new_sum_blkaddr + + TOTAL_SEGS(sbi) - offset; block_t blkaddr; + int ret; void *zero_block = calloc(BLOCK_SZ, 1); - ASSERT(zero_block);
if (offset && new_sum_blkaddr < old_sum_blkaddr + offset) { blkaddr = new_sum_blkaddr; while (blkaddr < end_sum_blkaddr) { - if (blkaddr - new_sum_blkaddr < TOTAL_SEGS(sbi)) - move_ssa(sbi, offset, blkaddr); - else - dev_write_block(zero_block, blkaddr); - offset++; - blkaddr++; + if (blkaddr < expand_sum_blkaddr) + move_ssa(sbi, offset++, blkaddr++); + else { + dev_write_block(zero_block, blkaddr++); + ASSERT(ret >=0); + } } } else { blkaddr = end_sum_blkaddr - 1; offset = TOTAL_SEGS(sbi) - 1; while (blkaddr >= new_sum_blkaddr) { - if (blkaddr >= TOTAL_SEGS(sbi) + new_sum_blkaddr) - dev_write_block(zero_block, blkaddr); + if (blkaddr >= expand_sum_blkaddr) { + dev_write_block(zero_block, blkaddr--); + ASSERT(ret >=0); + } else - move_ssa(sbi, offset--, blkaddr); - blkaddr--; + move_ssa(sbi, offset--, blkaddr--); } } On 2016/11/24 15:33, Yunlei He wrote: > This patch fix an error in migrate_ssa when resize with condition > that offset is not zero && new_sum_blkaddr > old_sum_blkaddr + offset > > Signed-off-by: Yunlei He <heyun...@huawei.com> > --- > fsck/resize.c | 37 +++++++++++++++++++++++++++---------- > 1 file changed, 27 insertions(+), 10 deletions(-) > > diff --git a/fsck/resize.c b/fsck/resize.c > index 46aa30e..70dbef5 100644 > --- a/fsck/resize.c > +++ b/fsck/resize.c > @@ -208,28 +208,45 @@ static void migrate_ssa(struct f2fs_sb_info *sbi, > block_t new_sum_blkaddr = get_newsb(ssa_blkaddr); > block_t end_sum_blkaddr = get_newsb(main_blkaddr); > block_t blkaddr; > + unsigned int offset1 = offset; > + int ret = 1; > void *zero_block = calloc(BLOCK_SZ, 1); > > ASSERT(zero_block); > > - if (offset && new_sum_blkaddr < old_sum_blkaddr + offset) { > - blkaddr = new_sum_blkaddr; > - while (blkaddr < end_sum_blkaddr) { > - if (blkaddr - new_sum_blkaddr < TOTAL_SEGS(sbi)) > - move_ssa(sbi, offset, blkaddr); > - else > - dev_write_block(zero_block, blkaddr); > - offset++; > - blkaddr++; > + if (offset) { > + if (new_sum_blkaddr < old_sum_blkaddr + offset) { > + blkaddr = new_sum_blkaddr; > + while (blkaddr < end_sum_blkaddr) { > + if (blkaddr - new_sum_blkaddr < TOTAL_SEGS(sbi) > - offset1) > + move_ssa(sbi, offset, blkaddr); > + else > + ret = dev_write_block(zero_block, > blkaddr); > + ASSERT(ret >= 0); > + offset++; > + blkaddr++; > + } > + } else { > + blkaddr = end_sum_blkaddr - 1; > + offset = TOTAL_SEGS(sbi)-1; > + while (blkaddr >= new_sum_blkaddr) { > + if (blkaddr >= TOTAL_SEGS(sbi) - offset1 + > new_sum_blkaddr) > + ret = dev_write_block(zero_block, > blkaddr); > + else > + move_ssa(sbi, offset--, blkaddr); > + ASSERT(ret >= 0); > + blkaddr--; > + } > } > } else { > blkaddr = end_sum_blkaddr - 1; > offset = TOTAL_SEGS(sbi) - 1; > while (blkaddr >= new_sum_blkaddr) { > if (blkaddr >= TOTAL_SEGS(sbi) + new_sum_blkaddr) > - dev_write_block(zero_block, blkaddr); > + ret = dev_write_block(zero_block, blkaddr); > else > move_ssa(sbi, offset--, blkaddr); > + ASSERT(ret >= 0); > blkaddr--; > } > } > ------------------------------------------------------------------------------ _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel