我对dentry的一些理解
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论