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 <zhaowuyun@wingtech.com>
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Chao Yu 2019-05-06 16:58:06 +08:00 committed by Jaegeuk Kim
parent 37e7403810
commit bdc7da10a9
3 changed files with 75 additions and 0 deletions

View File

@ -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 *);

View File

@ -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 */

View File

@ -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