Loading fs/f2fs/f2fs.h +1 −0 Original line number Diff line number Diff line Loading @@ -1565,6 +1565,7 @@ struct dnode_of_data; struct node_info; 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 need_inode_block_update(struct f2fs_sb_info *, nid_t); void get_node_info(struct f2fs_sb_info *, nid_t, struct node_info *); Loading fs/f2fs/node.c +17 −18 Original line number Diff line number Diff line Loading @@ -195,32 +195,35 @@ static unsigned int __gang_lookup_nat_set(struct f2fs_nm_info *nm_i, 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 nat_entry *e; bool is_cp = true; bool need = false; down_read(&nm_i->nat_tree_lock); e = __lookup_nat_cache(nm_i, nid); if (e && !get_nat_flag(e, IS_CHECKPOINTED)) is_cp = false; if (e) { if (!get_nat_flag(e, IS_CHECKPOINTED) && !get_nat_flag(e, HAS_FSYNCED_INODE)) need = true; } 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 nat_entry *e; bool fsynced = false; bool is_cp = true; down_read(&nm_i->nat_tree_lock); e = __lookup_nat_cache(nm_i, ino); if (e && get_nat_flag(e, HAS_FSYNCED_INODE)) fsynced = true; e = __lookup_nat_cache(nm_i, nid); if (e && !get_nat_flag(e, IS_CHECKPOINTED)) is_cp = false; 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) Loading Loading @@ -1206,13 +1209,9 @@ int sync_node_pages(struct f2fs_sb_info *sbi, nid_t ino, /* called by fsync() */ if (ino && IS_DNODE(page)) { set_fsync_mark(page, 1); if (IS_INODE(page)) { if (!is_checkpointed_node(sbi, ino) && !has_fsynced_inode(sbi, ino)) set_dentry_mark(page, 1); else set_dentry_mark(page, 0); } if (IS_INODE(page)) set_dentry_mark(page, need_dentry_mark(sbi, ino)); nwritten++; } else { set_fsync_mark(page, 0); Loading Loading
fs/f2fs/f2fs.h +1 −0 Original line number Diff line number Diff line Loading @@ -1565,6 +1565,7 @@ struct dnode_of_data; struct node_info; 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 need_inode_block_update(struct f2fs_sb_info *, nid_t); void get_node_info(struct f2fs_sb_info *, nid_t, struct node_info *); Loading
fs/f2fs/node.c +17 −18 Original line number Diff line number Diff line Loading @@ -195,32 +195,35 @@ static unsigned int __gang_lookup_nat_set(struct f2fs_nm_info *nm_i, 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 nat_entry *e; bool is_cp = true; bool need = false; down_read(&nm_i->nat_tree_lock); e = __lookup_nat_cache(nm_i, nid); if (e && !get_nat_flag(e, IS_CHECKPOINTED)) is_cp = false; if (e) { if (!get_nat_flag(e, IS_CHECKPOINTED) && !get_nat_flag(e, HAS_FSYNCED_INODE)) need = true; } 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 nat_entry *e; bool fsynced = false; bool is_cp = true; down_read(&nm_i->nat_tree_lock); e = __lookup_nat_cache(nm_i, ino); if (e && get_nat_flag(e, HAS_FSYNCED_INODE)) fsynced = true; e = __lookup_nat_cache(nm_i, nid); if (e && !get_nat_flag(e, IS_CHECKPOINTED)) is_cp = false; 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) Loading Loading @@ -1206,13 +1209,9 @@ int sync_node_pages(struct f2fs_sb_info *sbi, nid_t ino, /* called by fsync() */ if (ino && IS_DNODE(page)) { set_fsync_mark(page, 1); if (IS_INODE(page)) { if (!is_checkpointed_node(sbi, ino) && !has_fsynced_inode(sbi, ino)) set_dentry_mark(page, 1); else set_dentry_mark(page, 0); } if (IS_INODE(page)) set_dentry_mark(page, need_dentry_mark(sbi, ino)); nwritten++; } else { set_fsync_mark(page, 0); Loading