* [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
* [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
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 --
2018-06-14 3:10 [PATCH] f2fs-tools: calculate inode checksum and writeback Liu Xue
2018-06-19 12:59 ` Chao Yu
-- strict thread matches above, loose matches on Subject: below --
2019-05-24 7:28 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.