Loading fs/f2fs/f2fs.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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 *); Loading fs/f2fs/node.c +17 −18 Original line number Original line 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); 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) Loading Loading @@ -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); Loading Loading
fs/f2fs/f2fs.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -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 *); Loading
fs/f2fs/node.c +17 −18 Original line number Original line 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); 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) Loading Loading @@ -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); Loading