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> --- Change log from v1: - Rename enum SB_ADDR members and define SB_MASK(i). 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,15 @@ enum { EUNKNOWN_ARG, }; +enum SB_ADDR { + 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)) + /* 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 addr, ret; + u_int8_t *buf; + + buf = calloc(BLOCK_SZ, 1); + ASSERT(buf); + + memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb)); + for (addr = SB0_ADDR; addr < SB_MAX_ADDR; addr++) { + if (SB_MASK(addr) & sb_mask) { + ret = dev_write_block(buf, addr); + 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, 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, 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_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_MASK_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, SB0_ADDR); if (ret) { - ret = validate_super_block(sbi, 1); + ret = validate_super_block(sbi, SB1_ADDR); 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_MASK_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_MASK_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