Skip to content

Commit f2c49b3

Browse files
zangyangyang666Jaegeuk Kim
authored andcommitted
resize.f2fs: fix to avoid zeroing main area blocks in migrate_ssa()
The `new_seg_total` may be greater than the total number of blocks in the SSA, which can cause main area blocks to be zeroed out during SSA migration. This can corrupt the root inode, leading to filesystem corruption. Fixes: ad1357c ("f2fs-tools: revert summary entry count from 2048 to 512 in 16kb block support") Signed-off-by: Yangyang Zang <zangyangyang1@xiaomi.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
1 parent ce24fde commit f2c49b3

1 file changed

Lines changed: 19 additions & 19 deletions

File tree

fsck/resize.c

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -257,48 +257,48 @@ static void migrate_ssa(struct f2fs_sb_info *sbi,
257257
struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi);
258258
block_t old_sum_blkaddr = get_sb(ssa_blkaddr);
259259
block_t new_sum_blkaddr = get_newsb(ssa_blkaddr);
260-
unsigned int expand_segno = MAIN_SEGS(sbi) - offset;
261-
unsigned int new_seg_total = get_newsb(segment_count);
262-
int new_segno;
260+
unsigned int expand_sum_blocks = MAIN_SEGS(sbi) - offset;
261+
unsigned int new_sum_blocks = get_newsb(main_blkaddr) - new_sum_blkaddr;
262+
int new_sum_blkoff;
263263
int ret = 0;
264264
void *zero_block = calloc(F2FS_SUM_BLKSIZE, 1);
265265
ASSERT(zero_block);
266266

267267
if (offset && new_sum_blkaddr <= (old_sum_blkaddr +
268268
offset / SUMS_PER_BLOCK)) {
269-
new_segno = 0;
270-
while (new_segno < new_seg_total) {
271-
if (new_segno < expand_segno)
272-
move_ssa(sbi, new_sb, offset++, new_segno);
269+
new_sum_blkoff = 0;
270+
while (new_sum_blkoff < new_sum_blocks) {
271+
if (new_sum_blkoff < expand_sum_blocks)
272+
move_ssa(sbi, new_sb, offset++, new_sum_blkoff);
273273
else if (c.feature & F2FS_FEATURE_PACKED_SSA)
274274
ret = dev_write_4k_block(zero_block,
275-
GET_SUM_NEW_BLKADDR(new_sb, new_segno),
276-
GET_SUM_NEW_BLKOFF(new_sb, new_segno),
275+
GET_SUM_NEW_BLKADDR(new_sb, new_sum_blkoff),
276+
GET_SUM_NEW_BLKOFF(new_sb, new_sum_blkoff),
277277
WRITE_LIFE_NONE);
278278
else
279279
ret = dev_write_block(zero_block,
280-
GET_SUM_NEW_BLKADDR(new_sb, new_segno),
280+
GET_SUM_NEW_BLKADDR(new_sb, new_sum_blkoff),
281281
WRITE_LIFE_NONE);
282282
ASSERT(ret >= 0);
283-
new_segno++;
283+
new_sum_blkoff++;
284284
}
285285
} else {
286-
new_segno = new_seg_total - 1;
286+
new_sum_blkoff = new_sum_blocks - 1;
287287
offset = MAIN_SEGS(sbi) - 1;
288-
while (new_segno >= 0) {
289-
if (new_segno < expand_segno)
290-
move_ssa(sbi, new_sb, offset--, new_segno);
288+
while (new_sum_blkoff >= 0) {
289+
if (new_sum_blkoff < expand_sum_blocks)
290+
move_ssa(sbi, new_sb, offset--, new_sum_blkoff);
291291
else if (c.feature & F2FS_FEATURE_PACKED_SSA)
292292
ret = dev_write_4k_block(zero_block,
293-
GET_SUM_NEW_BLKADDR(new_sb, new_segno),
294-
GET_SUM_NEW_BLKOFF(new_sb, new_segno),
293+
GET_SUM_NEW_BLKADDR(new_sb, new_sum_blkoff),
294+
GET_SUM_NEW_BLKOFF(new_sb, new_sum_blkoff),
295295
WRITE_LIFE_NONE);
296296
else
297297
ret = dev_write_block(zero_block,
298-
GET_SUM_NEW_BLKADDR(new_sb, new_segno),
298+
GET_SUM_NEW_BLKADDR(new_sb, new_sum_blkoff),
299299
WRITE_LIFE_NONE);
300300
ASSERT(ret >= 0);
301-
new_segno--;
301+
new_sum_blkoff--;
302302
}
303303
}
304304

0 commit comments

Comments
 (0)