From: Xue Liu <[email protected]> Calculate inode checksum and writeback when processing sload or resize.
Signed-off-by: Xue Liu <[email protected]> [Chao Yu: change commit message and code] Signed-off-by: Chao Yu <[email protected]> --- v2: - move write_inode() to libf2fs.c for more callers. - cover missing case in f2fs_add_link. - clean up update_data_blkaddr() with write_inode(). - don't assert in write_inode(). fsck/dir.c | 2 +- fsck/mount.c | 10 +++++----- fsck/segment.c | 14 +++----------- fsck/xattr.c | 3 +-- include/f2fs_fs.h | 1 + lib/libf2fs.c | 8 ++++++++ mkfs/f2fs_format.c | 18 +++--------------- 7 files changed, 22 insertions(+), 34 deletions(-) diff --git a/fsck/dir.c b/fsck/dir.c index 592d9db..1e21294 100644 --- a/fsck/dir.c +++ b/fsck/dir.c @@ -319,7 +319,7 @@ add_dentry: if (dn.idirty) { ASSERT(parent == dn.inode_blk); - ret = dev_write_block(dn.inode_blk, p_blkaddr); + ret = write_inode(dn.inode_blk, p_blkaddr); ASSERT(ret >= 0); } diff --git a/fsck/mount.c b/fsck/mount.c index aecd0cd..1c5cd93 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -1812,14 +1812,15 @@ void update_data_blkaddr(struct f2fs_sb_info *sbi, nid_t nid, oldaddr = le32_to_cpu(node_blk->i.i_addr[ofs + ofs_in_node]); node_blk->i.i_addr[ofs + ofs_in_node] = cpu_to_le32(newaddr); + ret = write_inode(node_blk, ni.blk_addr); + ASSERT(ret >= 0); } else { oldaddr = le32_to_cpu(node_blk->dn.addr[ofs_in_node]); node_blk->dn.addr[ofs_in_node] = cpu_to_le32(newaddr); + ret = dev_write_block(node_blk, ni.blk_addr); + ASSERT(ret >= 0); } - ret = dev_write_block(node_blk, ni.blk_addr); - ASSERT(ret >= 0); - /* check extent cache entry */ if (node_blk->footer.nid != node_blk->footer.ino) { get_node_info(sbi, le32_to_cpu(node_blk->footer.ino), &ni); @@ -1835,8 +1836,7 @@ void update_data_blkaddr(struct f2fs_sb_info *sbi, nid_t nid, node_blk->i.i_ext.len = 0; /* update inode block */ - ret = dev_write_block(node_blk, ni.blk_addr); - ASSERT(ret >= 0); + ASSERT(write_inode(node_blk, ni.blk_addr) >= 0); } free(node_blk); } diff --git a/fsck/segment.c b/fsck/segment.c index f26e623..1b58b70 100644 --- a/fsck/segment.c +++ b/fsck/segment.c @@ -16,14 +16,6 @@ #include "fsck.h" #include "node.h" -static void write_inode(u64 blkaddr, struct f2fs_node *inode) -{ - if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CHKSUM)) - inode->i.i_inode_checksum = - cpu_to_le32(f2fs_inode_chksum(inode)); - ASSERT(dev_write_block(inode, blkaddr) >= 0); -} - int reserve_new_block(struct f2fs_sb_info *sbi, block_t *to, struct f2fs_summary *sum, int type) { @@ -278,7 +270,7 @@ u64 f2fs_write(struct f2fs_sb_info *sbi, nid_t ino, u8 *buffer, } if (idirty) { ASSERT(inode == dn.inode_blk); - write_inode(ni.blk_addr, inode); + ASSERT(write_inode(inode, ni.blk_addr) >= 0); } if (index_node) free(index_node); @@ -303,7 +295,7 @@ void f2fs_filesize_update(struct f2fs_sb_info *sbi, nid_t ino, u64 filesize) inode->i.i_size = cpu_to_le64(filesize); - write_inode(ni.blk_addr, inode); + ASSERT(write_inode(inode, ni.blk_addr) >= 0); free(inode); } @@ -348,7 +340,7 @@ int f2fs_build_file(struct f2fs_sb_info *sbi, struct dentry *de) ASSERT((unsigned long)n == de->size); memcpy(inline_data_addr(node_blk), buffer, de->size); node_blk->i.i_size = cpu_to_le64(de->size); - write_inode(ni.blk_addr, node_blk); + ASSERT(write_inode(node_blk, ni.blk_addr) >= 0); free(node_blk); } else { while ((n = read(fd, buffer, BLOCK_SZ)) > 0) { diff --git a/fsck/xattr.c b/fsck/xattr.c index b13e5ee..98cbb0c 100644 --- a/fsck/xattr.c +++ b/fsck/xattr.c @@ -223,8 +223,7 @@ int f2fs_setxattr(struct f2fs_sb_info *sbi, nid_t ino, int index, const char *na write_all_xattrs(sbi, inode, new_hsize, base_addr); /* inode need update */ - ret = dev_write_block(inode, ni.blk_addr); - ASSERT(ret >= 0); + ASSERT(write_inode(inode, ni.blk_addr) >= 0); exit: free(inode); free(base_addr); diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h index 1890975..120f861 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -1145,6 +1145,7 @@ extern int log_base_2(u_int32_t); extern unsigned int addrs_per_inode(struct f2fs_inode *); extern __u32 f2fs_inode_chksum(struct f2fs_node *); extern __u32 f2fs_checkpoint_chksum(struct f2fs_checkpoint *); +extern int write_inode(struct f2fs_node *, u64); extern int get_bits_in_byte(unsigned char n); extern int test_and_set_bit_le(u32, u8 *); diff --git a/lib/libf2fs.c b/lib/libf2fs.c index 986bf29..88ab70f 100644 --- a/lib/libf2fs.c +++ b/lib/libf2fs.c @@ -546,6 +546,14 @@ __u32 f2fs_checkpoint_chksum(struct f2fs_checkpoint *cp) return chksum; } +int write_inode(struct f2fs_node *inode, u64 blkaddr) +{ + if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CHKSUM)) + inode->i.i_inode_checksum = + cpu_to_le32(f2fs_inode_chksum(inode)); + return dev_write_block(inode, blkaddr); +} + /* * try to identify the root device */ diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c index f2265bb..8f41052 100644 --- a/mkfs/f2fs_format.c +++ b/mkfs/f2fs_format.c @@ -1149,10 +1149,6 @@ static int f2fs_write_root_inode(void) raw_node->i.i_ext.blk_addr = 0; raw_node->i.i_ext.len = 0; - if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CHKSUM)) - raw_node->i.i_inode_checksum = - cpu_to_le32(f2fs_inode_chksum(raw_node)); - main_area_node_seg_blk_offset = get_sb(main_blkaddr); main_area_node_seg_blk_offset += c.cur_seg[CURSEG_HOT_NODE] * c.blks_per_seg; @@ -1161,7 +1157,7 @@ static int f2fs_write_root_inode(void) get_sb(main_blkaddr), c.cur_seg[CURSEG_HOT_NODE], c.blks_per_seg, main_area_node_seg_blk_offset); - if (dev_write_block(raw_node, main_area_node_seg_blk_offset)) { + if (write_inode(raw_node, main_area_node_seg_blk_offset) < 0) { MSG(1, "\tError: While writing the raw_node to disk!!!\n"); free(raw_node); return -1; @@ -1320,10 +1316,6 @@ static int f2fs_write_qf_inode(int qtype) raw_node->i.i_ext.blk_addr = 0; raw_node->i.i_ext.len = 0; - if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CHKSUM)) - raw_node->i.i_inode_checksum = - cpu_to_le32(f2fs_inode_chksum(raw_node)); - main_area_node_seg_blk_offset = get_sb(main_blkaddr); main_area_node_seg_blk_offset += c.cur_seg[CURSEG_HOT_NODE] * c.blks_per_seg + qtype + 1; @@ -1332,7 +1324,7 @@ static int f2fs_write_qf_inode(int qtype) get_sb(main_blkaddr), c.cur_seg[CURSEG_HOT_NODE], c.blks_per_seg, main_area_node_seg_blk_offset); - if (dev_write_block(raw_node, main_area_node_seg_blk_offset)) { + if (write_inode(raw_node, main_area_node_seg_blk_offset) < 0) { MSG(1, "\tError: While writing the raw_node to disk!!!\n"); free(raw_node); return -1; @@ -1507,10 +1499,6 @@ static int f2fs_write_lpf_inode(void) } raw_node->i.i_addr[get_extra_isize(raw_node)] = cpu_to_le32(data_blk_nor); - if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CHKSUM)) - raw_node->i.i_inode_checksum = - cpu_to_le32(f2fs_inode_chksum(raw_node)); - main_area_node_seg_blk_offset = get_sb(main_blkaddr); main_area_node_seg_blk_offset += c.cur_seg[CURSEG_HOT_NODE] * c.blks_per_seg + c.quota_inum + 1; @@ -1519,7 +1507,7 @@ static int f2fs_write_lpf_inode(void) get_sb(main_blkaddr), c.cur_seg[CURSEG_HOT_NODE], c.blks_per_seg, main_area_node_seg_blk_offset); - if (dev_write_block(raw_node, main_area_node_seg_blk_offset)) { + if (write_inode(raw_node, main_area_node_seg_blk_offset) < 0) { MSG(1, "\tError: While writing the raw_node to disk!!!\n"); err = -1; goto exit; -- 2.18.0.rc1 _______________________________________________ Linux-f2fs-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
