f2fs-tools: correct endianness
authorSheng Yong <shengyong1@huawei.com>
Thu, 19 Jan 2017 03:03:40 +0000 (11:03 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 19 Jan 2017 07:29:08 +0000 (15:29 +0800)
It is reported that fsck.f2fs behaves abnormally when running on MIPS32
rel 2 big endian cpu, since incorrect endianness. So let's correct all
endianess issues of f2fs-tools.

Reported-by: <k@vodka.home.kg>
Signed-off-by: Sheng Yong <shengyong1@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fsck/dir.c
fsck/dump.c
fsck/f2fs.h
fsck/mount.c
fsck/node.c
fsck/segment.c
include/f2fs_fs.h

index 2009855..d817d27 100644 (file)
@@ -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;
index 5d0d3d9..8cbeda1 100644 (file)
@@ -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);
        }
index 1a0723c..5c8eea5 100644 (file)
@@ -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 (addr >= le64_to_cpu(F2FS_RAW_SUPER(sbi)->block_count) ||
                                addr < SM_I(sbi)->main_blkaddr) {
                DBG(1, "block addr [0x%x]\n", addr);
                return 0;
index 79fb9af..761baa0 100644 (file)
@@ -1407,12 +1407,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++;
index c2f83b8..fe923e5 100644 (file)
@@ -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;
index 9ce8bf5..6b2f6c1 100644 (file)
@@ -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);
index bcb68b8..97ee297 100644 (file)
@@ -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)                                          \