On 2018/9/8 6:23, Jaegeuk Kim wrote: > On 08/30, Junling Zheng wrote: >> Introduce __write_superblock() to support updating specified one >> superblock or both, thus we can wrapper it in update_superblock() and >> f2fs_write_super_block to unify all places where sb needs to be updated. >> >> Signed-off-by: Junling Zheng <zhengjunl...@huawei.com> >> --- >> v2 -> v3: >> - fix wrong condition of ASSERT in update_superblock. >> v1 -> v2: >> - if dev_write_block failed, add some notes and free buf to avoid memory >> leak. >> fsck/fsck.h | 2 +- >> fsck/mount.c | 74 +++++++++++----------------------------------- >> fsck/resize.c | 20 ++----------- >> include/f2fs_fs.h | 35 ++++++++++++++++++++++ >> mkfs/f2fs_format.c | 19 +----------- >> 5 files changed, 56 insertions(+), 94 deletions(-) >> >> diff --git a/fsck/fsck.h b/fsck/fsck.h >> index 6042e68..e3490e6 100644 >> --- a/fsck/fsck.h >> +++ b/fsck/fsck.h >> @@ -178,7 +178,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..2bc44ce 100644 >> --- a/fsck/mount.c >> +++ b/fsck/mount.c >> @@ -476,7 +476,7 @@ void print_sb_state(struct f2fs_super_block *sb) >> } >> >> 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 +542,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); >> + MSG(0, "Info: Fix alignment: start(%u) end(%u) block(%u)\n", >> main_blkaddr, >> segment0_blkaddr + >> (segment_count << log_blocks_per_seg), >> @@ -558,7 +555,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 +597,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 +633,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); >> >> c.auto_fix = 0; >> c.fix_on = 1; >> @@ -659,7 +646,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,21 +2282,10 @@ void write_checkpoint(struct f2fs_sb_info *sbi) >> ASSERT(ret >= 0); >> } >> >> -void write_superblock(struct f2fs_super_block *new_sb) >> +void update_superblock(struct f2fs_super_block *new_sb, int sb_mask) >> { >> - 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"); >> + ASSERT(!__write_superblock(new_sb, sb_mask)); >> + DBG(0, "Info: Done to update superblock\n"); >> } >> >> void build_nat_area_bitmap(struct f2fs_sb_info *sbi) >> @@ -2450,9 +2426,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 +2435,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); >> return 0; >> } >> >> @@ -2499,7 +2459,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 +2469,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); >> 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); >> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h >> index 38a0da4..df46950 100644 >> --- a/include/f2fs_fs.h >> +++ b/include/f2fs_fs.h >> @@ -1411,4 +1411,39 @@ static inline int parse_root_owner(char *ids, >> return 0; >> } >> >> +enum SB_ADDR { >> + SB_ADDR_0, >> + SB_ADDR_1, >> + SB_ADDR_MAX, >> +}; >> + >> +#define SB_FIRST (1 << SB_ADDR_0) >> +#define SB_SECOND (1 << SB_ADDR_1) >> +#define SB_ALL (SB_FIRST | SB_SECOND) >> + >> +static inline int __write_superblock(struct f2fs_super_block *sb, int >> sb_mask) >> +{ >> + int index, ret; >> + u_int8_t *buf; >> + >> + buf = calloc(F2FS_BLKSIZE, 1); >> + ASSERT(buf); >> + >> + memcpy(buf + F2FS_SUPER_OFFSET, sb, sizeof(*sb)); >> + for (index = 0; index < SB_ADDR_MAX; index++) { >> + if ((1 << index) & sb_mask) { >> + ret = dev_write_block(buf, index); > > This doesn't look like a proper inline function. >
Ok, I'll remove the "inline" flag :) Any other flaws? Thanks >> + if (ret) { >> + MSG(0, "\tError: While writing superblock %d " >> + "to disk!!!\n", index); >> + free(buf); >> + return ret; >> + } >> + } >> + } >> + >> + free(buf); >> + return 0; >> +} >> + >> #endif /*__F2FS_FS_H */ >> diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c >> index 621126c..7e3846e 100644 >> --- a/mkfs/f2fs_format.c >> +++ b/mkfs/f2fs_format.c >> @@ -979,24 +979,7 @@ free_cp: >> >> static int f2fs_write_super_block(void) >> { >> - int index; >> - u_int8_t *zero_buff; >> - >> - zero_buff = calloc(F2FS_BLKSIZE, 1); >> - >> - 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_block(zero_buff, index)) { >> - MSG(1, "\tError: While while writing supe_blk " >> - "on disk!!! index : %d\n", index); >> - free(zero_buff); >> - return -1; >> - } >> - } >> - >> - free(zero_buff); >> - return 0; >> + return __write_superblock(sb, SB_ALL); >> } >> >> #ifndef WITH_ANDROID >> -- >> 2.18.0 > > . > _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel