我对dentry的一些理解

发布于 2022-07-21 21:50:29 字数 2134 浏览 9 评论 0

1。通常情况下,只有没有被引用的dentry才会被放入dentry_unused,例如未使用的子dentry,而父dentry则由于被子dentry引用,所以d_count不会为0,不可能进入此队列,这样就会出现这样的情况,父dentry不在dentry_unused中,而子dentry可能在dentry_unused

2。子dentry(不管在不在dentry_unused中)仍然保持着对父dentry的引用,父dentry和子dentry都在dentry_hashtable中

3。root dentry不在dentry_hashtable中,也不会进入dentry_unused,
因为一开始它的d_count就被置为1,并且从不dput,只有unmount该文件系统的时候才会dput,进而d_free

4。子dentry未被任何人使用时,dput到dentry_unused中,进行缓冲和老化,在系统内存紧缺的时候,调用shrink_dcache_memory搜索dentry_unused释放未使用的dentry,在卸载文件系统的时候,调用shrink_dcache_sb搜索dentry_unused释放未使用的属于该文件系统的dentry

5。释放的时候子dentry对父dentry的引用减一,从而可能导致父dentry也可能被放入dentry_unused,如此循环往复,直至再也找不到可以释放的dentry或已经满足要求,如果某个文件系统未被使用,那么可以一直释放掉除根dentry外的所有该文件系统的dentry(包括inode)

6。在安装文件系统的时候,根是由read_super创建的,该文件系统下的其它dentry是由path_walk创建的
path_walk->real_lookup->d_alloc,lookup(ext2_lookup)->ext2_find_entry,iget

7。目标dentry被使用完dput后,进入dentry_unused中,next指向最新的dentry,prev指向最老的dentry(lru)

8。如果该dentry要再次被使用,d_lookup会在dentry_hashtable中找到它,并和dentry_unused脱链,置最近被引用标志

9。linux内核倾向于尽量保持未被使用的dentry,而不热衷于释放它们,这会减少磁盘读写次数,有助于提高系统性能

10。当物理内存短缺的时候,调用shrink_dcache_memory
shrink_dcache_memory->prune_dcache->prune_one_dentry
当卸载文件系统的时候,调用shrink_dcache_db
shrink_dcache_db->prune_one_dentry

//该dentry->d_count==0,已经从dentry_unused脱链
static inline void prune_one_dentry(struct dentry * dentry)
{
        struct dentry * parent;

        list_del_init(&dentry->d_hash);//unhash it
        list_del(&dentry->d_child);//和parent脱钩
        dentry_iput(dentry);//和inode脱钩
        parent = dentry->d_parent;//root entry不hash
        d_free(dentry);//释放该dentry
        if (parent != dentry)
                dput(parent);//减少对父dentry的引用
        spin_lock(&dcache_lock);//ugly
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文