5.Linux中的VFS
类别 |
函数名 |
功能 |
函数形成 |
参数 |
描述 |
目录 项缓存 |
d_invalidate |
使一个目录项无效 |
int d_invalidate (struct dentry * dentry) |
dentry为要无效的目录项 |
如果通过这个目录项能够到达其他的目录项,就不能删除这个目录项,并返回-EBUSY。如果该函数操作成功,则返回0。 |
d_find_alias |
找到索引节点一个散列的别名 |
struct dentry * d_find_alias (struct inode * |
inode为要讨论的索引节点 |
如果 inode 有一个散列的别名,就获取对这个别名,并返回它,否则返回空。注意,如果inode 是一个目录,就只能有一个别名,如果它没有子目录,就不能进行散列。 |
|
prune_dcache |
裁减目录项缓存 |
void prune_dcache (int count) |
count为要释放的目录项的一个域 |
缩小目录项缓存。当需要更多的内存,或者仅仅需要卸载某个安装点(在这个安装点上所有的目录项都不使用),则调用该函数。 如果所有的目录项都在使用,则该函数可能失败。 |
|
shrink_dcache_sb |
为一个超级块而缩小目录项缓存 |
void shrink_dcache_sb (struct super_block * sb) |
sb为超级块 |
为一个指定的超级块缩小目录缓存。在卸载一个文件系统是调用该函数释放目录缓存。 |
|
have_submounts |
检查父目录或子目录是否包含安装点 |
int have_submounts (struct dentry * parent) |
parent为要检查的目录项 |
如果parent或它的子目录包含一个安装点,则该函数返回真。 |
|
shrink_dcache_parent |
裁减目录项缓存 |
void shrink_dcache_parent (struct dentry * parent) |
parent为要裁减目录项的父目录项 |
裁减目录项缓存以删除父目录项不用的子目录项。 |
|
d_alloc |
分配一个目录项 |
struct dentry * d_alloc (struct dentry * parent, const struct qstr * name) |
parent为要分配目录项的父目录项,name为指向qstr结构的指针。 |
分配一个目录项。如果没有足够可用的内存,则返回NULL。成功则返回目录项。 |
|
d_instantiate |
为一个目录项填充索引节点信息 |
void d_instantiate (struct dentry * entry, struct inode * inode) |
entry为要完成的目录项,inode为这个目录项的inode。 |
在目录项中填充索引节点的信息。注意,这假定 inode的 count域已由调用者增加,以表示inode正在由该目录项缓存使用。 |
|
d_alloc_root |
分配根目录项 |
struct dentry * d_alloc_root (struct inode * root_inode) |
root_inode为要给根分配的inode。 |
为给定的inode分配一个根("/") 目录项,该in ode被实例化并返回。如果没有足够的内存或传递的inode参数为空,则返回空。 |
|
d_lookup |
查找一个目录项 |
struct dentry * d_lookup (struct dentry * parent, struct qstr * name) |
parent为父目录项,name为要查找的目录项名字的qstr结构。 |
为name搜索父目录项的子目录项。如果该目录项找到,则它的引用计数加1,并返回所找到的目录项。调用者在完成了对该目录项的使用后,必须调用d_put释放它。 |
|
d_validate |
验证由不安全源所提供的目录项 |
int d_validate (struct dentry * dentry, struct dentry * dparent) |
dentry是dparent有效的子目录项,dparent是父目录项(已知有效) |
一个非安全源向我们发送了一个dentry,在这里,我们要验证它并调用dget。该函数由ncpfs用在readdir的实现。如果dentry无效,则返回0。 |
|
d_delete |
删除一个目录项 |
void d_delete (struct dentry * dentry) |
dentry为要删除的目录项 |
如果可能,把该目录项转换为一个负的目录项,否则从哈希队列中移走它以便以后的删除。 |
|
d_rehash |
给哈希表增加一个目录项 |
void d_rehash (struct dentry * entry) |
dentry为要增加的目录项 |
根据目录项的名字向哈希表增加一个目录项 |
|
d_move |
移动一个目录项 |
void d_move (struct dentry * dentry, struct dentry * target) |
dentry为要移动的目录项,target为新目录项 |
更新目录项缓存以反映一个文件名的移动。目录项缓存中负的目录项不应当以这种方式移动。 |
|
__d_path |
返回一个目录项的路径 |
char * __d_path (struct dentry * dentry, struct vfsmount * vfsmnt, struct dentry * root, struct vfsmount * rootmnt, char * buffer, int buflen) |
dentry为要处理的目录项,vfsmnt为目录项所属的安装点,root为根目录项,rootmnt为根目录项所属的安装点,buffer为返回值所在处,buflen为buffer的长度。 |
把一个目录项转化为一个字符串路径名。如果一个目录项已被删除,串“(deleted)”被追加到路径名,注意这有点含糊不清。返回值放在buffer中。 "buflen"应该为页大小的整数倍。调用者应该保持dcache_lock锁。 |
|
is_subdir |
新目录项是否是父目录项的子目录 |
int is_subdir (struct dentry * new_dentry, struct dentry * old_dentry) |
new_dentry为新目录项, old_dentry为旧目录项。
|
如果新目录项是父目录的子目录项(任何路径上),就返回1,否则返回0。 |
|
find_inode_number |
检查给定名字的目录项是否存在 |
ino_t find_inode_number (struct dentry * dir, struct qstr * name) |
dir为要检查的目录,name 为要查找的名字。 |
对于给定的名字,检查这个目录项是否存在,如果该目录项有一个inode,则返回其索引节点号,否则返回0。 |
|
d_drop |
删除一个目录项 |
void d_drop (struct dentry * dentry) |
dentry为要删除的目录项 |
d_drop从父目录项哈希表中解除目录项的哈希连接,以便通过VFS的查找再也找不到它。注意这个函数与d_delete的区别,d_delete尽可能地把目录项表记为负的,查找时会得到一个负的目录项,而d_drop会使查找失败。 |
|
d_add |
向哈希队列增加目录项 |
void d_add (struct dentry * entry, struct inode * inode) |
dentry为要增加的目录项,inode为与目录项对应的索引节点。 |
该函数将把目录项加到哈希队列,并初始化inode。这个目录项实际上已在d_alloc()函中得到填充。 |
|
dget |
获得目录项的一个引用 |
struct dentry * dget (struct dentry * dentry) |
dentry为要获得引用的目录项 |
给定一个目录项或空指针,如果合适就增加引用count的值。当一个目录项有引用时(count不为0),就不能删除这个目录项。引用计数为0的目录项永远也不会调用dget。 |
|
d_unhashed |
检查目录项是否被散列 |
int d_unhashed (struct dentry * dentry) |
dentry为要检查的目录项 |
如果通过参数传递过来的目录项没有用哈希函数散列过,则返回真。 |
|
索引节点处理 |
__mark_inode_dirty |
使索引节点“脏” |
void __mark_inode_dirty (struct inode * inode, int flags) |
inode为要标记的索引节点,flags为标志,应当为I_DIRTY_SYNC |
这是一个内部函数,调用者应当调用mark_inode_dirty 或mark_inode_dirty_sync。 |
write_inode_now |
向磁盘写一个索引节点 |
void write_inode_now (struct inode * inode, int sync) |
inode为要写到磁盘的索引节点,sync表示是否需要同步。 |
如果索引节点为脏,该函数立即把它写到给磁盘。主要由knfsd来使用。 |
|
clear_inode |
清除一个索引节点 |
void clear_inode (struct inode * inode) |
inode为要写清除的索引节点 |
由文件系统来调用该函数,告诉我们该索引节点不再有用。 |
|
invalidate_inodes |
丢弃一个设备上的索引节点 |
int invalidate_inodes (struct super_block * sb); |
sb为超级块 |
对于给定的超级块,丢弃所有的索引节点。如果丢弃失败,说明还有索引节点处于忙状态,则返回一个非0值。如果丢弃成功,则超级块中所有的节点都被丢弃。 |
|
get_empty_inode |
获得一个索引节点 |
struct inode * get_empty_inode ( void) |
无 |
这个函数的调用发生在诸如网络层想获得一个无索引节点号的索引节点,或者文件系统分配一个新的、无填充信息的索引节点。 成功则返回一个指向inode的指针,失败则返回一个NULL指针。返回的索引节点不在任何超级块链表中。 |
|
iunique |
获得一个唯一的索引节点号 |
ino_t iunique (struct super_block * sb, ino_t max_reserved) |
sb为超级块,max_reserved为最大保留索引节点号 |
对于给定的超级块,获得该系统上一个唯一的索引节点号。这一般用在索引节点编号不固定的文件系统中。返回的节点号大于保留的界限但是唯一。 注意,如果一个文件系统有大量的索引节点,则这个函数会很慢。 |
|
insert_inode_hash |
把索引节点插入到哈希表 |
void insert_inode_hash (struct inode * inode) |
inode为要插入的索引节点 |
把一个索引节点插入到索引节点的哈希表中,如果该节点没有超级块,则把它加到一个单独匿名的链中。 |
|
remove_inode_hash |
从哈希表中删除一个索引节点 |
void remove_inode_hash (struct inode * inode) |
inode为要删除的索引节点 |
从超级块或匿名哈希表中删除一个索引节点 |
|
iput |
释放一个索引节点 |
void iput (struct inode * inode) |
inode为要释放的索引节点 |
如果索引节点的引用计数变为0,则释放该索引节点,并且可以撤销它。 |
|
bmap |
在一个文件中找到一个块号 |
int bmap (struct inode * inode, int block) |
inode为文件的索引节点,block为要找的块。 |
返回设备上的块号,例如,寻找索引节点1的块4,则该函数将返回相对于磁盘起始位置的盘块号。 |
|
update_atime |
更新访问时间 |
void update_atime (struct inode * inode) |
inode为要访问的索引节点 |
更新索引节点的访问时间,并把该节点标记为写回。这个函数自动处理只读文件系统、介质、“noatime”标志以及具有“noatime”标记者的索引节点。 |
|
make_bad_inode |
由于I/O错误把一个索引节点标记为坏 |
void make_bad_inode (struct inode * inode) |
inode为要标记为坏的索引节点 |
由于介质或远程网络失败而造成不能读一个索引节点时,该函数把该节点标记为“坏”,并引起从这点开始的I/O操作失败。 |
|
is_bad_inode |
是否是一个错误的inode |
int is_bad_inode (struct inode * inode) |
inode为要测试的索引节点 |
如果要测试的节点已标记为坏,则返回真。 |
|
注册以及超级块 |
register_filesystem |
注册一个新的文件系统 |
int register_filesystem (struct file_system_type * fs) |
fs为指向文件系统结构的指针 |
把参数传递过来的文件系统加到文件系统的链表中。成功则返回0,失败则返回一个负的错误码。 |
unregister_filesystem |
注销一个文件系统 |
int unregister_filesystem (struct file_system_type * fs) |
fs为指向文件系统结构的指针 |
把曾经注册到内核中的文件系统删除。如果没有找到个文件系统,则返回一个错误码,成功则返回0。 这个函数所返回的file_system_type结构被释放或重用。 |
|
get_super |
获得一个设备的超级块 |
struct super_block * get_super (kdev_t dev) |
dev为要获得超级块的设备 |
扫描超级块链表,查找在给定设备上安装的文件系统的超级块。如果没有找到,则返回空。 |