Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

f2fs: flush inode metadata when checkpoint is doing

This patch registers all the inodes which have dirty metadata to sync when
checkpoint is doing.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>

+107 -7
+36
fs/f2fs/checkpoint.c
··· 859 859 goto retry; 860 860 } 861 861 862 + int f2fs_sync_inode_meta(struct f2fs_sb_info *sbi) 863 + { 864 + struct list_head *head = &sbi->inode_list[DIRTY_META]; 865 + struct inode *inode; 866 + struct f2fs_inode_info *fi; 867 + s64 total = get_pages(sbi, F2FS_DIRTY_IMETA); 868 + 869 + while (total--) { 870 + if (unlikely(f2fs_cp_error(sbi))) 871 + return -EIO; 872 + 873 + spin_lock(&sbi->inode_lock[DIRTY_META]); 874 + if (list_empty(head)) { 875 + spin_unlock(&sbi->inode_lock[DIRTY_META]); 876 + return 0; 877 + } 878 + fi = list_entry(head->next, struct f2fs_inode_info, 879 + gdirty_list); 880 + inode = igrab(&fi->vfs_inode); 881 + spin_unlock(&sbi->inode_lock[DIRTY_META]); 882 + if (inode) { 883 + update_inode_page(inode); 884 + iput(inode); 885 + } 886 + }; 887 + return 0; 888 + } 889 + 862 890 /* 863 891 * Freeze all the FS-operations for checkpoint. 864 892 */ ··· 908 880 if (get_pages(sbi, F2FS_DIRTY_DENTS)) { 909 881 f2fs_unlock_all(sbi); 910 882 err = sync_dirty_inodes(sbi, DIR_INODE); 883 + if (err) 884 + goto out; 885 + goto retry_flush_dents; 886 + } 887 + 888 + if (get_pages(sbi, F2FS_DIRTY_IMETA)) { 889 + f2fs_unlock_all(sbi); 890 + err = f2fs_sync_inode_meta(sbi); 911 891 if (err) 912 892 goto out; 913 893 goto retry_flush_dents;
+3 -2
fs/f2fs/debug.c
··· 47 47 si->ndirty_data = get_pages(sbi, F2FS_DIRTY_DATA); 48 48 si->ndirty_dirs = sbi->ndirty_inode[DIR_INODE]; 49 49 si->ndirty_files = sbi->ndirty_inode[FILE_INODE]; 50 + si->ndirty_all = sbi->ndirty_inode[DIRTY_META]; 50 51 si->inmem_pages = get_pages(sbi, F2FS_INMEM_PAGES); 51 52 si->wb_bios = atomic_read(&sbi->nr_wb_bios); 52 53 si->total_count = (int)sbi->user_block_count / sbi->blocks_per_seg; ··· 305 304 si->inmem_pages, si->wb_bios); 306 305 seq_printf(s, " - nodes: %4lld in %4d\n", 307 306 si->ndirty_node, si->node_pages); 308 - seq_printf(s, " - dents: %4lld in dirs:%4d\n", 309 - si->ndirty_dent, si->ndirty_dirs); 307 + seq_printf(s, " - dents: %4lld in dirs:%4d (%4d)\n", 308 + si->ndirty_dent, si->ndirty_dirs, si->ndirty_all); 310 309 seq_printf(s, " - datas: %4lld in files:%4d\n", 311 310 si->ndirty_data, si->ndirty_files); 312 311 seq_printf(s, " - meta: %4lld in %4d\n",
+7 -2
fs/f2fs/f2fs.h
··· 442 442 nid_t i_xattr_nid; /* node id that contains xattrs */ 443 443 unsigned long long xattr_ver; /* cp version of xattr modification */ 444 444 445 - struct list_head dirty_list; /* linked in global dirty list */ 445 + struct list_head dirty_list; /* dirty list for dirs and files */ 446 + struct list_head gdirty_list; /* linked in global dirty list */ 446 447 struct list_head inmem_pages; /* inmemory pages managed by f2fs */ 447 448 struct mutex inmem_lock; /* lock for inmemory pages */ 448 449 struct extent_tree *extent_tree; /* cached extent_tree entry */ ··· 658 657 F2FS_DIRTY_NODES, 659 658 F2FS_DIRTY_META, 660 659 F2FS_INMEM_PAGES, 660 + F2FS_DIRTY_IMETA, 661 661 NR_COUNT_TYPE, 662 662 }; 663 663 ··· 709 707 enum inode_type { 710 708 DIR_INODE, /* for dirty dir inode */ 711 709 FILE_INODE, /* for dirty regular/symlink inode */ 710 + DIRTY_META, /* for all dirtied inode metadata */ 712 711 NR_INODE_TYPE, 713 712 }; 714 713 ··· 1902 1899 /* 1903 1900 * super.c 1904 1901 */ 1902 + void f2fs_inode_synced(struct inode *); 1905 1903 int f2fs_commit_super(struct f2fs_sb_info *, bool); 1906 1904 int f2fs_sync_fs(struct super_block *, int); 1907 1905 extern __printf(3, 4) ··· 2014 2010 void remove_ino_entry(struct f2fs_sb_info *, nid_t, int type); 2015 2011 void release_ino_entry(struct f2fs_sb_info *, bool); 2016 2012 bool exist_written_data(struct f2fs_sb_info *, nid_t, int); 2013 + int f2fs_sync_inode_meta(struct f2fs_sb_info *); 2017 2014 int acquire_orphan_inode(struct f2fs_sb_info *); 2018 2015 void release_orphan_inode(struct f2fs_sb_info *); 2019 2016 void add_orphan_inode(struct f2fs_sb_info *, nid_t); ··· 2083 2078 unsigned long long hit_total, total_ext; 2084 2079 int ext_tree, zombie_tree, ext_node; 2085 2080 s64 ndirty_node, ndirty_dent, ndirty_meta, ndirty_data, inmem_pages; 2086 - unsigned int ndirty_dirs, ndirty_files; 2081 + unsigned int ndirty_dirs, ndirty_files, ndirty_all; 2087 2082 int nats, dirty_nats, sits, dirty_sits, fnids; 2088 2083 int total_count, utilization; 2089 2084 int bg_gc, wb_bios;
+6 -1
fs/f2fs/inode.c
··· 262 262 263 263 __set_inode_rdev(inode, ri); 264 264 set_cold_node(inode, node_page); 265 - clear_inode_flag(inode, FI_DIRTY_INODE); 265 + f2fs_inode_synced(inode); 266 266 267 267 /* deleted inode */ 268 268 if (inode->i_nlink == 0) ··· 286 286 } else if (err != -ENOENT) { 287 287 f2fs_stop_checkpoint(sbi, false); 288 288 } 289 + f2fs_inode_synced(inode); 289 290 return 0; 290 291 } 291 292 ret = update_inode(inode, node_page); ··· 361 360 goto retry; 362 361 } 363 362 363 + if (err) 364 + update_inode_page(inode); 364 365 sb_end_intwrite(inode->i_sb); 365 366 no_delete: 366 367 stat_dec_inline_xattr(inode); ··· 384 381 !exist_written_data(sbi, inode->i_ino, ORPHAN_INO)); 385 382 out_clear: 386 383 fscrypt_put_encryption_info(inode, NULL); 384 + 385 + f2fs_bug_on(sbi, is_inode_flag_set(inode, FI_DIRTY_INODE)); 387 386 clear_inode(inode); 388 387 } 389 388
+1
fs/f2fs/node.c
··· 670 670 if (dn->nid == dn->inode->i_ino) { 671 671 remove_orphan_inode(sbi, dn->nid); 672 672 dec_valid_inode_count(sbi); 673 + f2fs_inode_synced(dn->inode); 673 674 } else { 674 675 sync_inode_page(dn); 675 676 }
+2
fs/f2fs/segment.h
··· 479 479 int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES); 480 480 int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS); 481 481 482 + node_secs += get_blocktype_secs(sbi, F2FS_DIRTY_IMETA); 483 + 482 484 if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) 483 485 return false; 484 486
+52 -2
fs/f2fs/super.c
··· 537 537 fi->i_advise = 0; 538 538 init_rwsem(&fi->i_sem); 539 539 INIT_LIST_HEAD(&fi->dirty_list); 540 + INIT_LIST_HEAD(&fi->gdirty_list); 540 541 INIT_LIST_HEAD(&fi->inmem_pages); 541 542 mutex_init(&fi->inmem_lock); 542 543 ··· 548 547 549 548 static int f2fs_drop_inode(struct inode *inode) 550 549 { 550 + int ret; 551 + 551 552 /* 552 553 * This is to avoid a deadlock condition like below. 553 554 * writeback_single_inode(inode) ··· 557 554 * - f2fs_gc -> iput -> evict 558 555 * - inode_wait_for_writeback(inode) 559 556 */ 560 - if (!inode_unhashed(inode) && inode->i_state & I_SYNC) { 557 + if ((!inode_unhashed(inode) && inode->i_state & I_SYNC)) { 561 558 if (!inode->i_nlink && !is_bad_inode(inode)) { 562 559 /* to avoid evict_inode call simultaneously */ 563 560 atomic_inc(&inode->i_count); ··· 584 581 } 585 582 return 0; 586 583 } 587 - return generic_drop_inode(inode); 584 + 585 + ret = generic_drop_inode(inode); 586 + if (is_inode_flag_set(inode, FI_DIRTY_INODE)) { 587 + if (ret) 588 + inode->i_state |= I_WILL_FREE; 589 + spin_unlock(&inode->i_lock); 590 + 591 + update_inode_page(inode); 592 + 593 + spin_lock(&inode->i_lock); 594 + if (ret) 595 + inode->i_state &= ~I_WILL_FREE; 596 + } 597 + return ret; 588 598 } 589 599 590 600 /* ··· 607 591 */ 608 592 static void f2fs_dirty_inode(struct inode *inode, int flags) 609 593 { 594 + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 595 + 596 + if (inode->i_ino == F2FS_NODE_INO(sbi) || 597 + inode->i_ino == F2FS_META_INO(sbi)) 598 + return; 599 + 600 + spin_lock(&sbi->inode_lock[DIRTY_META]); 601 + if (is_inode_flag_set(inode, FI_DIRTY_INODE)) { 602 + spin_unlock(&sbi->inode_lock[DIRTY_META]); 603 + return; 604 + } 605 + 610 606 set_inode_flag(inode, FI_DIRTY_INODE); 607 + list_add_tail(&F2FS_I(inode)->gdirty_list, 608 + &sbi->inode_list[DIRTY_META]); 609 + inc_page_count(sbi, F2FS_DIRTY_IMETA); 610 + spin_unlock(&sbi->inode_lock[DIRTY_META]); 611 + stat_inc_dirty_inode(sbi, DIRTY_META); 612 + } 613 + 614 + void f2fs_inode_synced(struct inode *inode) 615 + { 616 + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 617 + 618 + spin_lock(&sbi->inode_lock[DIRTY_META]); 619 + if (!is_inode_flag_set(inode, FI_DIRTY_INODE)) { 620 + spin_unlock(&sbi->inode_lock[DIRTY_META]); 621 + return; 622 + } 623 + list_del_init(&F2FS_I(inode)->gdirty_list); 624 + clear_inode_flag(inode, FI_DIRTY_INODE); 625 + dec_page_count(sbi, F2FS_DIRTY_IMETA); 626 + spin_unlock(&sbi->inode_lock[DIRTY_META]); 627 + stat_dec_dirty_inode(F2FS_I_SB(inode), DIRTY_META); 611 628 } 612 629 613 630 static void f2fs_i_callback(struct rcu_head *head) ··· 1806 1757 return 0; 1807 1758 1808 1759 free_kobj: 1760 + f2fs_sync_inode_meta(sbi); 1809 1761 kobject_del(&sbi->s_kobj); 1810 1762 kobject_put(&sbi->s_kobj); 1811 1763 wait_for_completion(&sbi->s_kobj_unregister);