All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] f2fs-tools: calculate inode checksum and writeback
@ 2019-05-24  7:28 Chao Yu
  0 siblings, 0 replies; 3+ messages in thread
From: Chao Yu @ 2019-05-24  7:28 UTC (permalink / raw)
  To: linux-f2fs-devel; +Cc: jaegeuk

From: Xue Liu <liuxueliu.liu@huawei.com>

Calculate inode checksum and writeback when processing
sload or resize.

Signed-off-by: Xue Liu <liuxueliu.liu@huawei.com>
[Chao Yu: change commit message and code]
Signed-off-by: Chao Yu <yuchao0@huawei.com>
---
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

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] f2fs-tools: calculate inode checksum and writeback
  2018-06-14  3:10 Liu Xue
@ 2018-06-19 12:59 ` Chao Yu
  0 siblings, 0 replies; 3+ messages in thread
From: Chao Yu @ 2018-06-19 12:59 UTC (permalink / raw)
  To: Liu Xue, jaegeuk; +Cc: linux-f2fs-devel

On 2018/6/14 11:10, Liu Xue wrote:
> Calculate inode checksum and writeback when processing
> sload or resize.
> 
> Signed-off-by: Xue Liu <liuxueliu.liu@huawei.com>

Thanks for the fix.

I just look around dev_write_block caller, it looks there are more similar
issues should be fixed.

Could you double check that?

Thanks,


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH] f2fs-tools: calculate inode checksum and writeback
@ 2018-06-14  3:10 Liu Xue
  2018-06-19 12:59 ` Chao Yu
  0 siblings, 1 reply; 3+ messages in thread
From: Liu Xue @ 2018-06-14  3:10 UTC (permalink / raw)
  To: jaegeuk; +Cc: Liu Xue, linux-f2fs-devel

Calculate inode checksum and writeback when processing
sload or resize.

Signed-off-by: Xue Liu <liuxueliu.liu@huawei.com>
---
 fsck/fsck.h    | 1 +
 fsck/mount.c   | 6 ++++--
 fsck/segment.c | 2 +-
 fsck/xattr.c   | 3 +--
 4 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/fsck/fsck.h b/fsck/fsck.h
index cbe7fc4..f90bcf9 100644
--- a/fsck/fsck.h
+++ b/fsck/fsck.h
@@ -221,6 +221,7 @@ int f2fs_resize(struct f2fs_sb_info *);
 int f2fs_sload(struct f2fs_sb_info *);
 
 /* segment.c */
+void write_inode(u64, struct f2fs_node *);
 void reserve_new_block(struct f2fs_sb_info *, block_t *,
 					struct f2fs_summary *, int);
 void new_data_block(struct f2fs_sb_info *, void *,
diff --git a/fsck/mount.c b/fsck/mount.c
index 0a30adb..87b6295 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -1551,6 +1551,9 @@ 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);
+		if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CHKSUM))
+			node_blk->i.i_inode_checksum =
+				cpu_to_le32(f2fs_inode_chksum(node_blk));
 	} else {
 		oldaddr = le32_to_cpu(node_blk->dn.addr[ofs_in_node]);
 		node_blk->dn.addr[ofs_in_node] = cpu_to_le32(newaddr);
@@ -1574,8 +1577,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);
+		write_inode(ni.blk_addr, node_blk);
 	}
 	free(node_blk);
 }
diff --git a/fsck/segment.c b/fsck/segment.c
index 4f8bdb4..50f0d73 100644
--- a/fsck/segment.c
+++ b/fsck/segment.c
@@ -16,7 +16,7 @@
 #include "fsck.h"
 #include "node.h"
 
-static void write_inode(u64 blkaddr, struct f2fs_node *inode)
+void write_inode(u64 blkaddr, struct f2fs_node *inode)
 {
 	if (c.feature & cpu_to_le32(F2FS_FEATURE_INODE_CHKSUM))
 		inode->i.i_inode_checksum =
diff --git a/fsck/xattr.c b/fsck/xattr.c
index 1d15d1b..7144a83 100644
--- a/fsck/xattr.c
+++ b/fsck/xattr.c
@@ -220,8 +220,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);
+	write_inode(ni.blk_addr, inode);
 exit:
 	free(base_addr);
 	return error;
-- 
1.8.5.2


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-05-24  7:28 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-24  7:28 [PATCH] f2fs-tools: calculate inode checksum and writeback Chao Yu
  -- strict thread matches above, loose matches on Subject: below --
2018-06-14  3:10 Liu Xue
2018-06-19 12:59 ` Chao Yu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.