@@ -537,6 +537,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)
537537 fi -> i_advise = 0 ;
538538 init_rwsem (& fi -> i_sem );
539539 INIT_LIST_HEAD (& fi -> dirty_list );
540+ INIT_LIST_HEAD (& fi -> gdirty_list );
540541 INIT_LIST_HEAD (& fi -> inmem_pages );
541542 mutex_init (& fi -> inmem_lock );
542543
@@ -547,14 +548,16 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb)
547548
548549static int f2fs_drop_inode (struct inode * inode )
549550{
551+ int ret ;
552+
550553 /*
551554 * This is to avoid a deadlock condition like below.
552555 * writeback_single_inode(inode)
553556 * - f2fs_write_data_page
554557 * - f2fs_gc -> iput -> evict
555558 * - inode_wait_for_writeback(inode)
556559 */
557- if (!inode_unhashed (inode ) && inode -> i_state & I_SYNC ) {
560+ if (( !inode_unhashed (inode ) && inode -> i_state & I_SYNC ) ) {
558561 if (!inode -> i_nlink && !is_bad_inode (inode )) {
559562 /* to avoid evict_inode call simultaneously */
560563 atomic_inc (& inode -> i_count );
@@ -581,7 +584,20 @@ static int f2fs_drop_inode(struct inode *inode)
581584 }
582585 return 0 ;
583586 }
584- return generic_drop_inode (inode );
587+
588+ ret = generic_drop_inode (inode );
589+ if (is_inode_flag_set (inode , FI_DIRTY_INODE )) {
590+ if (ret )
591+ inode -> i_state |= I_WILL_FREE ;
592+ spin_unlock (& inode -> i_lock );
593+
594+ update_inode_page (inode );
595+
596+ spin_lock (& inode -> i_lock );
597+ if (ret )
598+ inode -> i_state &= ~I_WILL_FREE ;
599+ }
600+ return ret ;
585601}
586602
587603/*
@@ -591,7 +607,40 @@ static int f2fs_drop_inode(struct inode *inode)
591607 */
592608static void f2fs_dirty_inode (struct inode * inode , int flags )
593609{
610+ struct f2fs_sb_info * sbi = F2FS_I_SB (inode );
611+
612+ if (inode -> i_ino == F2FS_NODE_INO (sbi ) ||
613+ inode -> i_ino == F2FS_META_INO (sbi ))
614+ return ;
615+
616+ spin_lock (& sbi -> inode_lock [DIRTY_META ]);
617+ if (is_inode_flag_set (inode , FI_DIRTY_INODE )) {
618+ spin_unlock (& sbi -> inode_lock [DIRTY_META ]);
619+ return ;
620+ }
621+
594622 set_inode_flag (inode , FI_DIRTY_INODE );
623+ list_add_tail (& F2FS_I (inode )-> gdirty_list ,
624+ & sbi -> inode_list [DIRTY_META ]);
625+ inc_page_count (sbi , F2FS_DIRTY_IMETA );
626+ spin_unlock (& sbi -> inode_lock [DIRTY_META ]);
627+ stat_inc_dirty_inode (sbi , DIRTY_META );
628+ }
629+
630+ void f2fs_inode_synced (struct inode * inode )
631+ {
632+ struct f2fs_sb_info * sbi = F2FS_I_SB (inode );
633+
634+ spin_lock (& sbi -> inode_lock [DIRTY_META ]);
635+ if (!is_inode_flag_set (inode , FI_DIRTY_INODE )) {
636+ spin_unlock (& sbi -> inode_lock [DIRTY_META ]);
637+ return ;
638+ }
639+ list_del_init (& F2FS_I (inode )-> gdirty_list );
640+ clear_inode_flag (inode , FI_DIRTY_INODE );
641+ dec_page_count (sbi , F2FS_DIRTY_IMETA );
642+ spin_unlock (& sbi -> inode_lock [DIRTY_META ]);
643+ stat_dec_dirty_inode (F2FS_I_SB (inode ), DIRTY_META );
595644}
596645
597646static void f2fs_i_callback (struct rcu_head * head )
@@ -1757,6 +1806,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
17571806 return 0 ;
17581807
17591808free_kobj :
1809+ f2fs_sync_inode_meta (sbi );
17601810 kobject_del (& sbi -> s_kobj );
17611811 kobject_put (& sbi -> s_kobj );
17621812 wait_for_completion (& sbi -> s_kobj_unregister );
0 commit comments