On 11/25/2016 11:55 PM, k...@vodka.home.kg wrote: > > The only thing I changed in your patch is : > > - if (addr >= F2FS_RAW_SUPER(sbi)->block_count || > + if (le64_to_cpu(addr >= F2FS_RAW_SUPER(sbi)->block_count) || > addr < SM_I(sbi)->main_blkaddr) { > > You're passing boolean to le64_to_cpu which is obviously error. > I changed that to : > > if (addr >= le64_to_cpu(F2FS_RAW_SUPER(sbi)->block_count) || Right. My bad. I'll fix this and send a version 2 :)
thanks, Sheng > > And it worked without errors first on empty fs in a file, > second on real sda partition with files. > I havent tested what happens if filesystem is damaged. > > Info: Segments per section = 1 > Info: Sections per zone = 1 > Info: sector size = 512 > Info: total sectors = 204800 (100 MB) > Info: MKFS version > "Linux version 4.4.30 (vasya@nowhere) (gcc version 5.4.0 (LEDE GCC 5.4.0 > r2084) ) #0 PREEMPT Thu Nov 3 07:34:38 2016" > Info: FSCK version > from "Linux version 4.4.30 (vasya@nowhere) (gcc version 5.4.0 (LEDE GCC > 5.4.0 r2084) ) #0 PREEMPT Thu Nov 3 07:34:38 2016" > to "Linux version 4.4.30 (vasya@nowhere) (gcc version 5.4.0 (LEDE GCC > 5.4.0 r2084) ) #0 PREEMPT Thu Nov 3 07:34:38 2016" > Info: superblock features = 0 : > Info: superblock encrypt level = 0, salt = 00000000000000000000000000000000 > Info: total FS sectors = 204800 (100 MB) > Info: CKPT version = 1 > Info: checkpoint state = 5 : compacted_summary unmount > > [FSCK] Unreachable nat entries [Ok..] [0x0] > [FSCK] SIT valid block bitmap checking [Ok..] > [FSCK] Hard link checking for regular file [Ok..] [0x0] > [FSCK] valid_block_count matching with CP [Ok..] [0x2] > [FSCK] valid_node_count matcing with CP (de lookup) [Ok..] [0x1] > [FSCK] valid_node_count matcing with CP (nat lookup) [Ok..] [0x1] > [FSCK] valid_inode_count matched with CP [Ok..] [0x1] > [FSCK] free segment_count matched with CP [Ok..] [0x24] > [FSCK] next block offset is free [Ok..] > [FSCK] fixing SIT types > [FSCK] other corrupted bugs [Ok..] > > Done. > >> Reported-by: <k...@vodka.home.kg> >> Signed-off-by: Sheng Yong <shengyo...@huawei.com> >> --- >> Hi, k > >> Could you please try this? I think I've correct all endianness issue. >> And can I have your reported-by and test-by? > >> thanks, >> Sheng >> --- >> fsck/dir.c | 6 +++--- >> fsck/dump.c | 10 +++++----- >> fsck/f2fs.h | 4 ++-- >> fsck/mount.c | 12 ++++++------ >> fsck/node.c | 2 +- >> fsck/segment.c | 3 ++- >> include/f2fs_fs.h | 8 +++++--- >> 7 files changed, 24 insertions(+), 21 deletions(-) > >> diff --git a/fsck/dir.c b/fsck/dir.c >> index 2009855..d817d27 100644 >> --- a/fsck/dir.c >> +++ b/fsck/dir.c >> @@ -134,7 +134,7 @@ static int find_in_level(struct f2fs_sb_info *sbi,struct >> f2fs_node *dir, >> struct dnode_of_data dn = {0}; >> void *dentry_blk; >> int max_slots = 214; >> - nid_t ino = dir->footer.ino; >> + nid_t ino = le32_to_cpu(dir->footer.ino); >> f2fs_hash_t namehash; >> int ret = 0; > >> @@ -191,7 +191,7 @@ static int f2fs_find_entry(struct f2fs_sb_info *sbi, >> return 0; >> } > >> - max_depth = dir->i.i_current_depth; >> + max_depth = le32_to_cpu(dir->i.i_current_depth); >> for (level = 0; level < max_depth; level ++) { >> if (find_in_level(sbi, dir, level, de)) >> return 1; >> @@ -209,7 +209,7 @@ static void f2fs_update_dentry(nid_t ino, umode_t mode, >> int i; > >> de = &d->dentry[bit_pos]; > - de->>name_len = len; > + de->>name_len = cpu_to_le16(len); >> de->hash_code = name_hash; >> memcpy(d->filename[bit_pos], name, len); >> d->filename[bit_pos][len] = 0; >> diff --git a/fsck/dump.c b/fsck/dump.c >> index 8e7c85c..e9d442f 100644 >> --- a/fsck/dump.c >> +++ b/fsck/dump.c >> @@ -81,7 +81,7 @@ void nat_dump(struct f2fs_sb_info *sbi) >> >> "nid:%5u\tino:%5u\toffset:%5u" >> "\tblkaddr:%10u\tpack:%d\n", >> ni.nid, ni.ino, >> - node_block->footer.flag >> >> + >> le32_to_cpu(node_block->footer.flag) >> >> OFFSET_BIT_SHIFT, >> ni.blk_addr, pack); >> ret = write(fd, buf, strlen(buf)); >> @@ -100,7 +100,7 @@ void nat_dump(struct f2fs_sb_info *sbi) >> "nid:%5u\tino:%5u\toffset:%5u" >> "\tblkaddr:%10u\tpack:%d\n", >> ni.nid, ni.ino, >> - node_block->footer.flag >> >> + >> le32_to_cpu(node_block->footer.flag) >> >> OFFSET_BIT_SHIFT, >> ni.blk_addr, pack); >> ret = write(fd, buf, strlen(buf)); >> @@ -335,13 +335,13 @@ static void dump_inode_blk(struct f2fs_sb_info *sbi, >> u32 nid, >> for (i = 0; i < 5; i++) { >> if (i == 0 || i == 1) >> dump_node_blk(sbi, TYPE_DIRECT_NODE, >> - node_blk->i.i_nid[i], &ofs); >> + >> le32_to_cpu(node_blk->i.i_nid[i]), &ofs); >> else if (i == 2 || i == 3) >> dump_node_blk(sbi, TYPE_INDIRECT_NODE, >> - node_blk->i.i_nid[i], &ofs); >> + >> le32_to_cpu(node_blk->i.i_nid[i]), &ofs); >> else if (i == 4) >> dump_node_blk(sbi, TYPE_DOUBLE_INDIRECT_NODE, >> - node_blk->i.i_nid[i], &ofs); >> + >> le32_to_cpu(node_blk->i.i_nid[i]), &ofs); >> else >> ASSERT(0); >> } >> diff --git a/fsck/f2fs.h b/fsck/f2fs.h >> index 1a0723c..0650d10 100644 >> --- a/fsck/f2fs.h >> +++ b/fsck/f2fs.h >> @@ -359,7 +359,7 @@ static inline block_t sum_blk_addr(struct >> f2fs_sb_info *sbi, int base, int type) >> static inline bool IS_VALID_NID(struct f2fs_sb_info *sbi, u32 nid) >> { >> return (nid <= (NAT_ENTRY_PER_BLOCK * >> - F2FS_RAW_SUPER(sbi)->segment_count_nat >> + >> le32_to_cpu(F2FS_RAW_SUPER(sbi)->segment_count_nat) >> << (sbi->log_blocks_per_seg - 1))); >> } > >> @@ -367,7 +367,7 @@ static inline bool IS_VALID_BLK_ADDR(struct f2fs_sb_info >> *sbi, u32 addr) >> { >> int i; > > - if (addr >>= F2FS_RAW_SUPER(sbi)->block_count || >> + if (le64_to_cpu(addr >= F2FS_RAW_SUPER(sbi)->block_count) || >> addr < SM_I(sbi)->main_blkaddr) { >> DBG(1, "block addr [0x%x]\n", addr); >> return 0; >> diff --git a/fsck/mount.c b/fsck/mount.c >> index 21a96a7..d5a91a5 100644 >> --- a/fsck/mount.c >> +++ b/fsck/mount.c >> @@ -1375,12 +1375,12 @@ void build_sit_area_bitmap(struct f2fs_sb_info *sbi) >> ptr += SIT_VBLOCK_MAP_SIZE; > >> if (se->valid_blocks == 0x0) { >> - if (sbi->ckpt->cur_node_segno[0] == segno || >> - >> sbi->ckpt->cur_data_segno[0] == segno || >> - >> sbi->ckpt->cur_node_segno[1] == segno || >> - >> sbi->ckpt->cur_data_segno[1] == segno || >> - >> sbi->ckpt->cur_node_segno[2] == segno || >> - >> sbi->ckpt->cur_data_segno[2] == segno) { >> + if >> (le32_to_cpu(sbi->ckpt->cur_node_segno[0]) == segno || >> + >> le32_to_cpu(sbi->ckpt->cur_data_segno[0]) == segno || >> + >> le32_to_cpu(sbi->ckpt->cur_node_segno[1]) == segno || >> + >> le32_to_cpu(sbi->ckpt->cur_data_segno[1]) == segno || >> + >> le32_to_cpu(sbi->ckpt->cur_node_segno[2]) == segno || >> + >> le32_to_cpu(sbi->ckpt->cur_data_segno[2]) == segno) { >> continue; >> } else { >> free_segs++; >> diff --git a/fsck/node.c b/fsck/node.c >> index c2f83b8..fe923e5 100644 >> --- a/fsck/node.c >> +++ b/fsck/node.c >> @@ -78,7 +78,7 @@ block_t new_node_block(struct f2fs_sb_info *sbi, > >> type = CURSEG_COLD_NODE; >> if (IS_DNODE(node_blk)) { >> - if (S_ISDIR(f2fs_inode->i.i_mode)) >> + if (S_ISDIR(le16_to_cpu(f2fs_inode->i.i_mode))) >> type = CURSEG_HOT_NODE; >> else >> type = CURSEG_WARM_NODE; >> diff --git a/fsck/segment.c b/fsck/segment.c >> index 9ce8bf5..6b2f6c1 100644 >> --- a/fsck/segment.c >> +++ b/fsck/segment.c >> @@ -80,7 +80,8 @@ static void f2fs_write_block(struct f2fs_sb_info *sbi, >> nid_t ino, void *buffer, >> ret = dev_read_block(inode, ni.blk_addr); >> ASSERT(ret >= 0); > >> - if (S_ISDIR(inode->i.i_mode) || S_ISLNK(inode->i.i_mode)) >> + if (S_ISDIR(le16_to_cpu(inode->i.i_mode)) || >> + S_ISLNK(le16_to_cpu(inode->i.i_mode))) >> ASSERT(0); > >> off_in_block = offset & ((1 << F2FS_BLKSIZE_BITS) - 1); >> diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h >> index 78ea939..ef34ca2 100644 >> --- a/include/f2fs_fs.h >> +++ b/include/f2fs_fs.h >> @@ -170,15 +170,17 @@ static inline uint64_t bswap_64(uint64_t val) >> #define DISP_u32(ptr, member) >> do { >> assert(sizeof((ptr)->member) <= 4); >> - printf("%-30s" "\t\t[0x%8x : %u]\n", \ >> - #member, ((ptr)->member), ((ptr)->member)); >> + printf("%-30s" "\t\t[0x%8x : %u]\n", >> + #member, le32_to_cpu(((ptr)->member)), >> + le32_to_cpu(((ptr)->member))); >> } while (0) > >> #define DISP_u64(ptr, member) >> do { >> assert(sizeof((ptr)->member) == 8); >> printf("%-30s" "\t\t[0x%8llx : %llu]\n", >> - #member, ((ptr)->member), ((ptr)->member)); >> + #member, le64_to_cpu(((ptr)->member)), >> + le64_to_cpu(((ptr)->member))); >> } while (0) > >> #define DISP_utf(ptr, member) > > > ------------------------------------------------------------------------------ _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel