Commit 2dcf51ab authored by Jaegeuk Kim's avatar Jaegeuk Kim

f2fs: add need_dentry_mark

This patch introduces need_dentry_mark() to clean up and avoid redundant
node locks.
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 01f28610
...@@ -1565,6 +1565,7 @@ struct dnode_of_data; ...@@ -1565,6 +1565,7 @@ struct dnode_of_data;
struct node_info; struct node_info;
bool available_free_memory(struct f2fs_sb_info *, int); bool available_free_memory(struct f2fs_sb_info *, int);
int need_dentry_mark(struct f2fs_sb_info *, nid_t);
bool is_checkpointed_node(struct f2fs_sb_info *, nid_t); bool is_checkpointed_node(struct f2fs_sb_info *, nid_t);
bool need_inode_block_update(struct f2fs_sb_info *, nid_t); bool need_inode_block_update(struct f2fs_sb_info *, nid_t);
void get_node_info(struct f2fs_sb_info *, nid_t, struct node_info *); void get_node_info(struct f2fs_sb_info *, nid_t, struct node_info *);
......
...@@ -195,32 +195,35 @@ static unsigned int __gang_lookup_nat_set(struct f2fs_nm_info *nm_i, ...@@ -195,32 +195,35 @@ static unsigned int __gang_lookup_nat_set(struct f2fs_nm_info *nm_i,
start, nr); start, nr);
} }
bool is_checkpointed_node(struct f2fs_sb_info *sbi, nid_t nid) int need_dentry_mark(struct f2fs_sb_info *sbi, nid_t nid)
{ {
struct f2fs_nm_info *nm_i = NM_I(sbi); struct f2fs_nm_info *nm_i = NM_I(sbi);
struct nat_entry *e; struct nat_entry *e;
bool is_cp = true; bool need = false;
down_read(&nm_i->nat_tree_lock); down_read(&nm_i->nat_tree_lock);
e = __lookup_nat_cache(nm_i, nid); e = __lookup_nat_cache(nm_i, nid);
if (e && !get_nat_flag(e, IS_CHECKPOINTED)) if (e) {
is_cp = false; if (!get_nat_flag(e, IS_CHECKPOINTED) &&
!get_nat_flag(e, HAS_FSYNCED_INODE))
need = true;
}
up_read(&nm_i->nat_tree_lock); up_read(&nm_i->nat_tree_lock);
return is_cp; return need;
} }
static bool has_fsynced_inode(struct f2fs_sb_info *sbi, nid_t ino) bool is_checkpointed_node(struct f2fs_sb_info *sbi, nid_t nid)
{ {
struct f2fs_nm_info *nm_i = NM_I(sbi); struct f2fs_nm_info *nm_i = NM_I(sbi);
struct nat_entry *e; struct nat_entry *e;
bool fsynced = false; bool is_cp = true;
down_read(&nm_i->nat_tree_lock); down_read(&nm_i->nat_tree_lock);
e = __lookup_nat_cache(nm_i, ino); e = __lookup_nat_cache(nm_i, nid);
if (e && get_nat_flag(e, HAS_FSYNCED_INODE)) if (e && !get_nat_flag(e, IS_CHECKPOINTED))
fsynced = true; is_cp = false;
up_read(&nm_i->nat_tree_lock); up_read(&nm_i->nat_tree_lock);
return fsynced; return is_cp;
} }
bool need_inode_block_update(struct f2fs_sb_info *sbi, nid_t ino) bool need_inode_block_update(struct f2fs_sb_info *sbi, nid_t ino)
...@@ -1206,13 +1209,9 @@ int sync_node_pages(struct f2fs_sb_info *sbi, nid_t ino, ...@@ -1206,13 +1209,9 @@ int sync_node_pages(struct f2fs_sb_info *sbi, nid_t ino,
/* called by fsync() */ /* called by fsync() */
if (ino && IS_DNODE(page)) { if (ino && IS_DNODE(page)) {
set_fsync_mark(page, 1); set_fsync_mark(page, 1);
if (IS_INODE(page)) { if (IS_INODE(page))
if (!is_checkpointed_node(sbi, ino) && set_dentry_mark(page,
!has_fsynced_inode(sbi, ino)) need_dentry_mark(sbi, ino));
set_dentry_mark(page, 1);
else
set_dentry_mark(page, 0);
}
nwritten++; nwritten++;
} else { } else {
set_fsync_mark(page, 0); set_fsync_mark(page, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment