On 09/19, Junling Zheng wrote:
> Rename write_superblock() to update_superblock() and make it support updating
> specified one superblock or both two superblocks, then unify all places where
> sb needs to be updated.
> 
> Signed-off-by: Junling Zheng <zhengjunl...@huawei.com>
> ---
>  fsck/fsck.h   | 12 ++++++-
>  fsck/mount.c  | 94 +++++++++++++++++++--------------------------------
>  fsck/resize.c | 20 ++---------
>  3 files changed, 47 insertions(+), 79 deletions(-)
> 
> diff --git a/fsck/fsck.h b/fsck/fsck.h
> index 6042e68..bdd7f8d 100644
> --- a/fsck/fsck.h
> +++ b/fsck/fsck.h
> @@ -32,6 +32,16 @@ enum {
>       EUNKNOWN_ARG,
>  };
>  
> +enum SB_ADDR {
> +     SB_ADDR_0,
> +     SB_ADDR_1,
> +     SB_ADDR_MAX,

SB0_ADDR = 0,
SB1_ADDR,
SB_MAX_ADDR,

> +};
> +

#define SB_MASK(i)      (1 << i)
#define SB_MASK_ALL     (SB_MASK(SB0_ADDR) | SB_MASK(SB1_ADDR))

> +#define SB_FIRST     (1 << SB_ADDR_0)
> +#define SB_SECOND    (1 << SB_ADDR_1)
> +#define SB_ALL               (SB_FIRST | SB_SECOND)
> +
>  /* fsck.c */
>  struct orphan_info {
>       u32 nr_inodes;
> @@ -178,7 +188,7 @@ extern void move_curseg_info(struct f2fs_sb_info *, u64, 
> int);
>  extern void write_curseg_info(struct f2fs_sb_info *);
>  extern int find_next_free_block(struct f2fs_sb_info *, u64 *, int, int);
>  extern void write_checkpoint(struct f2fs_sb_info *);
> -extern void write_superblock(struct f2fs_super_block *);
> +extern void update_superblock(struct f2fs_super_block *, int);
>  extern void update_data_blkaddr(struct f2fs_sb_info *, nid_t, u16, block_t);
>  extern void update_nat_blkaddr(struct f2fs_sb_info *, nid_t, nid_t, block_t);
>  
> diff --git a/fsck/mount.c b/fsck/mount.c
> index 1daef75..74ff7c6 100644
> --- a/fsck/mount.c
> +++ b/fsck/mount.c
> @@ -475,8 +475,28 @@ void print_sb_state(struct f2fs_super_block *sb)
>       MSG(0, "\n");
>  }
>  
> +void update_superblock(struct f2fs_super_block *sb, int sb_mask)
> +{
> +     int index, ret;
> +     u_int8_t *buf;
> +
> +     buf = calloc(BLOCK_SZ, 1);
> +     ASSERT(buf);
> +
> +     memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
> +     for (index = 0; index < SB_ADDR_MAX; index++) {

        for (addr = SB0_ADDR; addr < SB_MAX_ADDR; addr++)

> +             if ((1 << index) & sb_mask) {

                if (SB_MASK(addr) & sb_mask) {

> +                     ret = dev_write_block(buf, index);
> +                     ASSERT(ret >= 0);
> +             }
> +     }
> +
> +     free(buf);
> +     DBG(0, "Info: Done to update superblock\n");
> +}
> +
>  static inline int sanity_check_area_boundary(struct f2fs_super_block *sb,
> -                                                     u64 offset)
> +                                                     enum SB_ADDR sb_addr)
>  {
>       u32 segment0_blkaddr = get_sb(segment0_blkaddr);
>       u32 cp_blkaddr = get_sb(cp_blkaddr);
> @@ -542,14 +562,11 @@ static inline int sanity_check_area_boundary(struct 
> f2fs_super_block *sb,
>                       segment_count_main << log_blocks_per_seg);
>               return -1;
>       } else if (main_end_blkaddr < seg_end_blkaddr) {
> -             int err;
> -
>               set_sb(segment_count, (main_end_blkaddr -
>                               segment0_blkaddr) >> log_blocks_per_seg);
>  
> -             err = dev_write(sb, offset, sizeof(struct f2fs_super_block));
> -             MSG(0, "Info: Fix alignment: %s, start(%u) end(%u) block(%u)\n",
> -                     err ? "failed": "done",
> +             update_superblock(sb, 1 << sb_addr);

                update_superblock(sb, SB_MASK(sb_addr));

> +             MSG(0, "Info: Fix alignment: start(%u) end(%u) block(%u)\n",
>                       main_blkaddr,
>                       segment0_blkaddr +
>                               (segment_count << log_blocks_per_seg),
> @@ -558,7 +575,7 @@ static inline int sanity_check_area_boundary(struct 
> f2fs_super_block *sb,
>       return 0;
>  }
>  
> -int sanity_check_raw_super(struct f2fs_super_block *sb, u64 offset)
> +int sanity_check_raw_super(struct f2fs_super_block *sb, enum SB_ADDR sb_addr)
>  {
>       unsigned int blocksize;
>  
> @@ -600,30 +617,24 @@ int sanity_check_raw_super(struct f2fs_super_block *sb, 
> u64 offset)
>       if (get_sb(segment_count) > F2FS_MAX_SEGMENT)
>               return -1;
>  
> -     if (sanity_check_area_boundary(sb, offset))
> +     if (sanity_check_area_boundary(sb, sb_addr))
>               return -1;
>       return 0;
>  }
>  
> -int validate_super_block(struct f2fs_sb_info *sbi, int block)
> +int validate_super_block(struct f2fs_sb_info *sbi, enum SB_ADDR sb_addr)
>  {
> -     u64 offset;
>       char buf[F2FS_BLKSIZE];
>  
>       sbi->raw_super = malloc(sizeof(struct f2fs_super_block));
>  
> -     if (block == 0)
> -             offset = F2FS_SUPER_OFFSET;
> -     else
> -             offset = F2FS_BLKSIZE + F2FS_SUPER_OFFSET;
> -
> -     if (dev_read_block(buf, block))
> +     if (dev_read_block(buf, sb_addr))
>               return -1;
>  
>       memcpy(sbi->raw_super, buf + F2FS_SUPER_OFFSET,
>                                       sizeof(struct f2fs_super_block));
>  
> -     if (!sanity_check_raw_super(sbi->raw_super, offset)) {
> +     if (!sanity_check_raw_super(sbi->raw_super, sb_addr)) {
>               /* get kernel version */
>               if (c.kd >= 0) {
>                       dev_read_version(c.version, 0, VERSION_LEN);
> @@ -642,13 +653,9 @@ int validate_super_block(struct f2fs_sb_info *sbi, int 
> block)
>               MSG(0, "Info: FSCK version\n  from \"%s\"\n    to \"%s\"\n",
>                                       c.sb_version, c.version);
>               if (memcmp(c.sb_version, c.version, VERSION_LEN)) {
> -                     int ret;
> -
>                       memcpy(sbi->raw_super->version,
>                                               c.version, VERSION_LEN);
> -                     ret = dev_write(sbi->raw_super, offset,
> -                                     sizeof(struct f2fs_super_block));
> -                     ASSERT(ret >= 0);
> +                     update_superblock(sbi->raw_super, 1 << sb_addr);

                                                        SB_MASK(sb_addr)

>  
>                       c.auto_fix = 0;
>                       c.fix_on = 1;
> @@ -659,7 +666,7 @@ int validate_super_block(struct f2fs_sb_info *sbi, int 
> block)
>  
>       free(sbi->raw_super);
>       sbi->raw_super = NULL;
> -     MSG(0, "\tCan't find a valid F2FS superblock at 0x%x\n", block);
> +     MSG(0, "\tCan't find a valid F2FS superblock at 0x%x\n", sb_addr);
>  
>       return -EINVAL;
>  }
> @@ -2295,23 +2302,6 @@ void write_checkpoint(struct f2fs_sb_info *sbi)
>       ASSERT(ret >= 0);
>  }
>  
> -void write_superblock(struct f2fs_super_block *new_sb)
> -{
> -     int index, ret;
> -     u_int8_t *buf;
> -
> -     buf = calloc(BLOCK_SZ, 1);
> -     ASSERT(buf);
> -
> -     memcpy(buf + F2FS_SUPER_OFFSET, new_sb, sizeof(*new_sb));
> -     for (index = 0; index < 2; index++) {
> -             ret = dev_write_block(buf, index);
> -             ASSERT(ret >= 0);
> -     }
> -     free(buf);
> -     DBG(0, "Info: Done to rebuild superblock\n");
> -}
> -
>  void build_nat_area_bitmap(struct f2fs_sb_info *sbi)
>  {
>       struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
> @@ -2450,9 +2440,7 @@ void build_nat_area_bitmap(struct f2fs_sb_info *sbi)
>  
>  static int check_sector_size(struct f2fs_super_block *sb)
>  {
> -     int index;
>       u_int32_t log_sectorsize, log_sectors_per_block;
> -     u_int8_t *zero_buff;
>  
>       log_sectorsize = log_base_2(c.sector_size);
>       log_sectors_per_block = log_base_2(c.sectors_per_blk);
> @@ -2461,24 +2449,10 @@ static int check_sector_size(struct f2fs_super_block 
> *sb)
>                       log_sectors_per_block == get_sb(log_sectors_per_block))
>               return 0;
>  
> -     zero_buff = calloc(F2FS_BLKSIZE, 1);
> -     ASSERT(zero_buff);
> -
>       set_sb(log_sectorsize, log_sectorsize);
>       set_sb(log_sectors_per_block, log_sectors_per_block);
>  
> -     memcpy(zero_buff + F2FS_SUPER_OFFSET, sb, sizeof(*sb));
> -     DBG(1, "\tWriting super block, at offset 0x%08x\n", 0);
> -     for (index = 0; index < 2; index++) {
> -             if (dev_write(zero_buff, index * F2FS_BLKSIZE, F2FS_BLKSIZE)) {
> -                     MSG(1, "\tError: Failed while writing supe_blk "
> -                             "on disk!!! index : %d\n", index);
> -                     free(zero_buff);
> -                     return -1;
> -             }
> -     }
> -
> -     free(zero_buff);
> +     update_superblock(sb, SB_ALL);

                                SB_MASK_ALL

>       return 0;
>  }
>  
> @@ -2499,7 +2473,7 @@ static void tune_sb_features(struct f2fs_sb_info *sbi)
>       if (!sb_changed)
>               return;
>  
> -     write_superblock(sb);
> +     update_superblock(sb, SB_ALL);
>  }
>  
>  int f2fs_do_mount(struct f2fs_sb_info *sbi)
> @@ -2509,9 +2483,9 @@ int f2fs_do_mount(struct f2fs_sb_info *sbi)
>       int ret;
>  
>       sbi->active_logs = NR_CURSEG_TYPE;
> -     ret = validate_super_block(sbi, 0);
> +     ret = validate_super_block(sbi, SB_ADDR_0);

                                        SB0_ADDR

and so on...

>       if (ret) {
> -             ret = validate_super_block(sbi, 1);
> +             ret = validate_super_block(sbi, SB_ADDR_1);
>               if (ret)
>                       return -1;
>       }
> diff --git a/fsck/resize.c b/fsck/resize.c
> index e9612b3..5161a1f 100644
> --- a/fsck/resize.c
> +++ b/fsck/resize.c
> @@ -577,22 +577,6 @@ static void rebuild_checkpoint(struct f2fs_sb_info *sbi,
>       DBG(0, "Info: Done to rebuild checkpoint blocks\n");
>  }
>  
> -static void rebuild_superblock(struct f2fs_super_block *new_sb)
> -{
> -     int index, ret;
> -     u_int8_t *buf;
> -
> -     buf = calloc(BLOCK_SZ, 1);
> -
> -     memcpy(buf + F2FS_SUPER_OFFSET, new_sb, sizeof(*new_sb));
> -     for (index = 0; index < 2; index++) {
> -             ret = dev_write_block(buf, index);
> -             ASSERT(ret >= 0);
> -     }
> -     free(buf);
> -     DBG(0, "Info: Done to rebuild superblock\n");
> -}
> -
>  static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
>  {
>       struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi);
> @@ -644,7 +628,7 @@ static int f2fs_resize_grow(struct f2fs_sb_info *sbi)
>       migrate_nat(sbi, new_sb);
>       migrate_sit(sbi, new_sb, offset_seg);
>       rebuild_checkpoint(sbi, new_sb, offset_seg);
> -     write_superblock(new_sb);
> +     update_superblock(new_sb, SB_ALL);
>       return 0;
>  }
>  
> @@ -695,7 +679,7 @@ static int f2fs_resize_shrink(struct f2fs_sb_info *sbi)
>               return -ENOSPC;
>       }
>  
> -     rebuild_superblock(new_sb);
> +     update_superblock(new_sb, SB_ALL);
>       rebuild_checkpoint(sbi, new_sb, 0);
>       /*if (!c.safe_resize) {
>               migrate_sit(sbi, new_sb, offset_seg);
> -- 
> 2.19.0


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

Reply via email to