mirror of
https://gitee.com/openharmony/third_party_f2fs-tools
synced 2024-11-23 10:10:00 +00:00
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:
parent
37e7403810
commit
bdc7da10a9
@ -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 *);
|
||||
|
@ -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 */
|
||||
|
70
fsck/mount.c
70
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
|
||||
|
Loading…
Reference in New Issue
Block a user