Hi Chao,

using the same steps, 
make the userdata partition dirty and fastboot-flash userdata.img to see the 
mount is successful or not

to test the patch, confirm that issue is fixed by this patch.
Hope to see it accepted.

Best Wishes,
Zac (zhaowu...@wingtech.com)

> 
> This patch fixes to initialize NAT/SIT/CP.payload region in sparse file mode 
> for
> sload.
> 
> Signed-off-by: Chao Yu <yuch...@huawei.com>
> ---
> - move initialize_meta() before do_umount().
>  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 dd831de..4db14af 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 afdfec9..d844820 100644
> --- a/fsck/main.c
> +++ b/fsck/main.c
> @@ -813,6 +813,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 843742e..230f330 100644
> --- a/fsck/mount.c
> +++ b/fsck/mount.c
> @@ -2721,3 +2721,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.18.0.rc1



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to