Linux VFS (6)

v2.6.22中,其定义如下

struct dentry_operations { int (*d_revalidate)(struct dentry *, unsigned int); int (*d_weak_revalidate)(struct dentry *, unsigned int); int (*d_hash)(const struct dentry *, struct qstr *); int (*d_compare)(const struct dentry *, unsigned int, const char *, const struct qstr *); int (*d_delete)(const struct dentry *); int (*d_init)(struct dentry *); void (*d_release)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); char *(*d_dname)(struct dentry *, char *, int); struct vfsmount *(*d_automount)(struct path *); int (*d_manage)(const struct path *, bool); struct dentry *(*d_real)(struct dentry *, const struct inode *); };

d_revalidate:当在cache中找到dentry时,判断dentry是否有效,返回正数代表还有效,返回0或负数代表无效。大多数本地文件系统将其设为NULL,因为它们的dentry总是有效的。网络文件系统则不同,因为服务端的变更,客户端可能感知不到。

d_weak_revalidate

d_hash:计算hash值,根据hash值加入父dentry的hash表中

d_compare:比较dentry的名字,必须是常熟且幂等

d_delete:判断是否删除dentry。返回1表示立即删除,返回0代表缓存。d_delete必须是常熟且幂等

d_init:当分配dentry后调用,初始化dentry

d_release:释放dentry

d_iput:归还inode引用(在d_release前调用)。如果是NULL,VFS会调用iput(),否则需要自行调用iput()。

d_dname:当需要生成dentry的路径名时调用。对于伪文件系统(sockfs,pipefs)延迟生成路径名来说很有用。因为没有加锁,所以d_dname不能修改dentry本身

Directory Entry Cache API

以下是操作dentry的函数

dget():获取一个已存在的dentry的引用

dput():归还一个dentry的引用。如果引用计数为0,且该dentry还在其父dentry的hash表中,则调用d_delete()检查该dentry是否还应该缓存。如果需要缓存,则放入LRU链表中。

d_drop():从父dentry的hash表中删除dentry

d_delete():删除一个dentry,如果没有其他引用,则该dentry变为一个无效的dentry(即指向NULL inode),d_iput()就会被调用。如果还有引用,则调用d_drop()

d_add():将dentry加入到其父dentry的hash表中,然后调用d_instantiate()

d_instantiate():将dentry加入到inode的dentry链表中,并更新dentry指向的inode(即struct dentry::d_inode)。inode的引用计数也会增加。

d_lookup():查找dentry,如果找到了则增加引用计数后返回。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzddjg.html