From bdc7da10a91d81ebc39f2bf464b67c2c669fbf0a Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Mon, 6 May 2019 16:58:06 +0800 Subject: [PATCH] sload.f2fs: introduce f2fs_sparse_initialize_meta() This patch fixes to initialize NAT/SIT/CP.payload region in sparse file mode for sload. Reported-and-tested-by: zhaowuyun Signed-off-by: Chao Yu Signed-off-by: Jaegeuk Kim --- fsck/fsck.h | 1 + fsck/main.c | 4 ++++ fsck/mount.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) diff --git a/fsck/fsck.h b/fsck/fsck.h index d09c0d8..5895eec 100644 --- a/fsck/fsck.h +++ b/fsck/fsck.h @@ -181,6 +181,7 @@ extern int fsck_verify(struct f2fs_sb_info *); extern void fsck_free(struct f2fs_sb_info *); extern int f2fs_do_mount(struct f2fs_sb_info *); extern void f2fs_do_umount(struct f2fs_sb_info *); +extern int f2fs_sparse_initialize_meta(struct f2fs_sb_info *); extern void flush_journal_entries(struct f2fs_sb_info *); extern void zero_journal_entries(struct f2fs_sb_info *); diff --git a/fsck/main.c b/fsck/main.c index 03076d9..30fdbf2 100644 --- a/fsck/main.c +++ b/fsck/main.c @@ -811,6 +811,10 @@ fsck_again: if (do_sload(sbi)) goto out_err; + ret = f2fs_sparse_initialize_meta(sbi); + if (ret < 0) + goto out_err; + f2fs_do_umount(sbi); /* fsck to fix missing quota */ diff --git a/fsck/mount.c b/fsck/mount.c index 2cb3260..49438cf 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -2698,3 +2698,73 @@ void f2fs_do_umount(struct f2fs_sb_info *sbi) free(sbi->ckpt); free(sbi->raw_super); } + +#ifdef WITH_ANDROID +int f2fs_sparse_initialize_meta(struct f2fs_sb_info *sbi) +{ + struct f2fs_super_block *sb = sbi->raw_super; + u_int32_t sit_seg_count, sit_size; + u_int32_t nat_seg_count, nat_size; + u_int64_t sit_seg_addr, nat_seg_addr, payload_addr; + u_int32_t seg_size = 1 << get_sb(log_blocks_per_seg); + int ret; + + if (!c.sparse_mode) + return 0; + + sit_seg_addr = get_sb(sit_blkaddr); + sit_seg_count = get_sb(segment_count_sit); + sit_size = sit_seg_count * seg_size; + + DBG(1, "\tSparse: filling sit area at block offset: 0x%08"PRIx64" len: %u\n", + sit_seg_addr, sit_size); + ret = dev_fill(NULL, sit_seg_addr * F2FS_BLKSIZE, + sit_size * F2FS_BLKSIZE); + if (ret) { + MSG(1, "\tError: While zeroing out the sit area " + "on disk!!!\n"); + return -1; + } + + nat_seg_addr = get_sb(nat_blkaddr); + nat_seg_count = get_sb(segment_count_nat); + nat_size = nat_seg_count * seg_size; + + DBG(1, "\tSparse: filling nat area at block offset 0x%08"PRIx64" len: %u\n", + nat_seg_addr, nat_size); + ret = dev_fill(NULL, nat_seg_addr * F2FS_BLKSIZE, + nat_size * F2FS_BLKSIZE); + if (ret) { + MSG(1, "\tError: While zeroing out the nat area " + "on disk!!!\n"); + return -1; + } + + payload_addr = get_sb(segment0_blkaddr) + 1; + + DBG(1, "\tSparse: filling bitmap area at block offset 0x%08"PRIx64" len: %u\n", + payload_addr, get_sb(cp_payload)); + ret = dev_fill(NULL, payload_addr * F2FS_BLKSIZE, + get_sb(cp_payload) * F2FS_BLKSIZE); + if (ret) { + MSG(1, "\tError: While zeroing out the nat/sit bitmap area " + "on disk!!!\n"); + return -1; + } + + payload_addr += seg_size; + + DBG(1, "\tSparse: filling bitmap area at block offset 0x%08"PRIx64" len: %u\n", + payload_addr, get_sb(cp_payload)); + ret = dev_fill(NULL, payload_addr * F2FS_BLKSIZE, + get_sb(cp_payload) * F2FS_BLKSIZE); + if (ret) { + MSG(1, "\tError: While zeroing out the nat/sit bitmap area " + "on disk!!!\n"); + return -1; + } + return 0; +} +#else +int f2fs_sparse_initialize_meta(struct f2fs_sb_info *sbi) { return 0; } +#endif -- 2.7.4