* [PATCH v2] fsck.f2fs: read ahead xattr & direct node blocks
@ 2018-01-29 3:16 Yunlei He
2018-01-29 7:44 ` Chao Yu
0 siblings, 1 reply; 2+ messages in thread
From: Yunlei He @ 2018-01-29 3:16 UTC (permalink / raw)
To: jaegeuk, yuchao0, linux-f2fs-devel; +Cc: ning.jia, heyunlei
This patch read ahead xattr & direct node blocks, and
keep the order:
1. check data blocks
2. readahead xattr block
3. fsck xattr block
4. readahead {d,id,did}node block
5. fsck {d,id,did}node block
With above order, we can avoid unneeded readahead before
sub-directory iterated traversing or encountering error.
Signed-off-by: Yunlei He <heyunlei@huawei.com>
---
fsck/fsck.c | 66 ++++++++++++++++++++++++++++++++++++++++---------------------
1 file changed, 44 insertions(+), 22 deletions(-)
diff --git a/fsck/fsck.c b/fsck/fsck.c
index 6c1b9a7..5c33892 100644
--- a/fsck/fsck.c
+++ b/fsck/fsck.c
@@ -621,6 +621,29 @@ unmatched:
child->state |= FSCK_UNMATCHED_EXTENT;
}
+void fsck_reada_node_block(struct f2fs_sb_info *sbi, u32 nid)
+{
+ struct node_info ni;
+
+ if (nid != 0 && IS_VALID_NID(sbi, nid)) {
+ get_node_info(sbi, nid, &ni);
+ if (IS_VALID_BLK_ADDR(sbi, ni.blk_addr))
+ dev_reada_block(ni.blk_addr);
+ }
+}
+
+void fsck_reada_all_direct_node_blocks(struct f2fs_sb_info *sbi,
+ struct f2fs_node *node_blk)
+{
+ int i;
+
+ for (i = 0; i < NIDS_PER_BLOCK; i++) {
+ u32 nid = le32_to_cpu(node_blk->in.nid[i]);
+
+ fsck_reada_node_block(sbi, nid);
+ }
+}
+
/* start with valid nid and blkaddr */
void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
enum FILE_TYPE ftype, struct f2fs_node *node_blk,
@@ -680,15 +703,6 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
}
}
- if (fsck_chk_xattr_blk(sbi, nid,
- le32_to_cpu(node_blk->i.i_xattr_nid), blk_cnt) &&
- c.fix_on) {
- node_blk->i.i_xattr_nid = 0;
- need_fix = 1;
- FIX_MSG("Remove xattr block: 0x%x, x_nid = 0x%x",
- nid, le32_to_cpu(node_blk->i.i_xattr_nid));
- }
-
if (ftype == F2FS_FT_CHRDEV || ftype == F2FS_FT_BLKDEV ||
ftype == F2FS_FT_FIFO || ftype == F2FS_FT_SOCK)
goto check;
@@ -736,19 +750,6 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
goto check;
}
- /* readahead node blocks */
- for (idx = 0; idx < 5; idx++) {
- u32 nid = le32_to_cpu(node_blk->i.i_nid[idx]);
-
- if (nid != 0 && IS_VALID_NID(sbi, nid)) {
- struct node_info ni;
-
- get_node_info(sbi, nid, &ni);
- if (IS_VALID_BLK_ADDR(sbi, ni.blk_addr))
- dev_reada_block(ni.blk_addr);
- }
- }
-
/* init extent info */
get_extent_info(&child.ei, &node_blk->i.i_ext);
child.last_blk = 0;
@@ -778,6 +779,23 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
}
}
+ /* readahead node blocks */
+ fsck_reada_node_block(sbi, le32_to_cpu(node_blk->i.i_xattr_nid));
+ for (idx = 0; idx < 5; idx++) {
+ u32 nid = le32_to_cpu(node_blk->i.i_nid[idx]);
+ fsck_reada_node_block(sbi, nid);
+ }
+
+
+ if (fsck_chk_xattr_blk(sbi, nid,
+ le32_to_cpu(node_blk->i.i_xattr_nid), blk_cnt) &&
+ c.fix_on) {
+ node_blk->i.i_xattr_nid = 0;
+ need_fix = 1;
+ FIX_MSG("Remove xattr block: 0x%x, x_nid = 0x%x",
+ nid, le32_to_cpu(node_blk->i.i_xattr_nid));
+ }
+
/* check node blocks in inode */
for (idx = 0; idx < 5; idx++) {
nid_t i_nid = le32_to_cpu(node_blk->i.i_nid[idx]);
@@ -997,6 +1015,8 @@ int fsck_chk_idnode_blk(struct f2fs_sb_info *sbi, struct f2fs_inode *inode,
int need_fix = 0, ret;
int i = 0;
+ fsck_reada_all_direct_node_blocks(sbi, node_blk);
+
for (i = 0; i < NIDS_PER_BLOCK; i++) {
if (le32_to_cpu(node_blk->in.nid[i]) == 0x0)
goto skip;
@@ -1037,6 +1057,8 @@ int fsck_chk_didnode_blk(struct f2fs_sb_info *sbi, struct f2fs_inode *inode,
int i = 0;
int need_fix = 0, ret = 0;
+ fsck_reada_all_direct_node_blocks(sbi, node_blk);
+
for (i = 0; i < NIDS_PER_BLOCK; i++) {
if (le32_to_cpu(node_blk->in.nid[i]) == 0x0)
goto skip;
--
1.9.1
------------------------------------------------------------------------------
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] 2+ messages in thread
* Re: [PATCH v2] fsck.f2fs: read ahead xattr & direct node blocks
2018-01-29 3:16 [PATCH v2] fsck.f2fs: read ahead xattr & direct node blocks Yunlei He
@ 2018-01-29 7:44 ` Chao Yu
0 siblings, 0 replies; 2+ messages in thread
From: Chao Yu @ 2018-01-29 7:44 UTC (permalink / raw)
To: Yunlei He, jaegeuk, linux-f2fs-devel; +Cc: ning.jia
On 2018/1/29 11:16, Yunlei He wrote:
> This patch read ahead xattr & direct node blocks, and
> keep the order:
>
> 1. check data blocks
> 2. readahead xattr block
> 3. fsck xattr block
> 4. readahead {d,id,did}node block
> 5. fsck {d,id,did}node block
>
> With above order, we can avoid unneeded readahead before
> sub-directory iterated traversing or encountering error.
>
> Signed-off-by: Yunlei He <heyunlei@huawei.com>
> ---
> fsck/fsck.c | 66 ++++++++++++++++++++++++++++++++++++++++---------------------
> 1 file changed, 44 insertions(+), 22 deletions(-)
>
> diff --git a/fsck/fsck.c b/fsck/fsck.c
> index 6c1b9a7..5c33892 100644
> --- a/fsck/fsck.c
> +++ b/fsck/fsck.c
> @@ -621,6 +621,29 @@ unmatched:
> child->state |= FSCK_UNMATCHED_EXTENT;
> }
>
> +void fsck_reada_node_block(struct f2fs_sb_info *sbi, u32 nid)
> +{
> + struct node_info ni;
> +
> + if (nid != 0 && IS_VALID_NID(sbi, nid)) {
> + get_node_info(sbi, nid, &ni);
> + if (IS_VALID_BLK_ADDR(sbi, ni.blk_addr))
> + dev_reada_block(ni.blk_addr);
> + }
> +}
> +
> +void fsck_reada_all_direct_node_blocks(struct f2fs_sb_info *sbi,
> + struct f2fs_node *node_blk)
> +{
> + int i;
> +
> + for (i = 0; i < NIDS_PER_BLOCK; i++) {
> + u32 nid = le32_to_cpu(node_blk->in.nid[i]);
> +
> + fsck_reada_node_block(sbi, nid);
> + }
> +}
> +
> /* start with valid nid and blkaddr */
> void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
> enum FILE_TYPE ftype, struct f2fs_node *node_blk,
> @@ -680,15 +703,6 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
> }
> }
>
> - if (fsck_chk_xattr_blk(sbi, nid,
> - le32_to_cpu(node_blk->i.i_xattr_nid), blk_cnt) &&
> - c.fix_on) {
> - node_blk->i.i_xattr_nid = 0;
> - need_fix = 1;
> - FIX_MSG("Remove xattr block: 0x%x, x_nid = 0x%x",
> - nid, le32_to_cpu(node_blk->i.i_xattr_nid));
> - }
> -
> if (ftype == F2FS_FT_CHRDEV || ftype == F2FS_FT_BLKDEV ||
> ftype == F2FS_FT_FIFO || ftype == F2FS_FT_SOCK)
> goto check;
> @@ -736,19 +750,6 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
> goto check;
> }
>
> - /* readahead node blocks */
> - for (idx = 0; idx < 5; idx++) {
> - u32 nid = le32_to_cpu(node_blk->i.i_nid[idx]);
> -
> - if (nid != 0 && IS_VALID_NID(sbi, nid)) {
> - struct node_info ni;
> -
> - get_node_info(sbi, nid, &ni);
> - if (IS_VALID_BLK_ADDR(sbi, ni.blk_addr))
> - dev_reada_block(ni.blk_addr);
> - }
> - }
> -
> /* init extent info */
> get_extent_info(&child.ei, &node_blk->i.i_ext);
> child.last_blk = 0;
> @@ -778,6 +779,23 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid,
> }
> }
>
> + /* readahead node blocks */
> + fsck_reada_node_block(sbi, le32_to_cpu(node_blk->i.i_xattr_nid));
> 2. readahead xattr block
> 3. fsck xattr block
if (fsck_chk_xattr_blk()) {
...
}
Expect that, it looks good to me.
Thanks,
> + for (idx = 0; idx < 5; idx++) {
> + u32 nid = le32_to_cpu(node_blk->i.i_nid[idx]);
> + fsck_reada_node_block(sbi, nid);
> + }
> +
> +
> + if (fsck_chk_xattr_blk(sbi, nid,
> + le32_to_cpu(node_blk->i.i_xattr_nid), blk_cnt) &&
> + c.fix_on) {
> + node_blk->i.i_xattr_nid = 0;
> + need_fix = 1;
> + FIX_MSG("Remove xattr block: 0x%x, x_nid = 0x%x",
> + nid, le32_to_cpu(node_blk->i.i_xattr_nid));
> + }
> +
> /* check node blocks in inode */
> for (idx = 0; idx < 5; idx++) {
> nid_t i_nid = le32_to_cpu(node_blk->i.i_nid[idx]);
> @@ -997,6 +1015,8 @@ int fsck_chk_idnode_blk(struct f2fs_sb_info *sbi, struct f2fs_inode *inode,
> int need_fix = 0, ret;
> int i = 0;
>
> + fsck_reada_all_direct_node_blocks(sbi, node_blk);
> +
> for (i = 0; i < NIDS_PER_BLOCK; i++) {
> if (le32_to_cpu(node_blk->in.nid[i]) == 0x0)
> goto skip;
> @@ -1037,6 +1057,8 @@ int fsck_chk_didnode_blk(struct f2fs_sb_info *sbi, struct f2fs_inode *inode,
> int i = 0;
> int need_fix = 0, ret = 0;
>
> + fsck_reada_all_direct_node_blocks(sbi, node_blk);
> +
> for (i = 0; i < NIDS_PER_BLOCK; i++) {
> if (le32_to_cpu(node_blk->in.nid[i]) == 0x0)
> goto skip;
>
------------------------------------------------------------------------------
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] 2+ messages in thread
end of thread, other threads:[~2018-01-29 7:47 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-29 3:16 [PATCH v2] fsck.f2fs: read ahead xattr & direct node blocks Yunlei He
2018-01-29 7:44 ` 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.