函数源码

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source File:fs\inode.c Create Date:2022-07-29 10:38:03
首页 Copyright©Brick

613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
/**
 * evict_inodes - evict all evictable inodes for a superblock
 * @sb:     superblock to operate on
 *
 * Make sure that no inodes with zero refcount are retained.  This is
 * called by superblock shutdown after having SB_ACTIVE flag removed,
 * so any inode reaching zero refcount during or after that call will
 * be immediately evicted.
 */
void evict_inodes(struct super_block *sb)
{
    struct inode *inode, *next;
    LIST_HEAD(dispose);
 
again:
    spin_lock(&sb->s_inode_list_lock);
    list_for_each_entry_safe(inode, next, &sb->s_inodes, i_sb_list) {
        if (atomic_read(&inode->i_count))
            continue;
 
        spin_lock(&inode->i_lock);
        if (inode->i_state & (I_NEW | I_FREEING | I_WILL_FREE)) {
            spin_unlock(&inode->i_lock);
            continue;
        }
 
        inode->i_state |= I_FREEING;
        inode_lru_list_del(inode);
        spin_unlock(&inode->i_lock);
        list_add(&inode->i_lru, &dispose);
 
        /*
         * We can have a ton of inodes to evict at unmount time given
         * enough memory, check to see if we need to go to sleep for a
         * bit so we don't livelock.
         */
        if (need_resched()) {
            spin_unlock(&sb->s_inode_list_lock);
            cond_resched();
            dispose_list(&dispose);
            goto again;
        }
    }
    spin_unlock(&sb->s_inode_list_lock);
 
    dispose_list(&dispose);
}