5Linux中的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)

dentrydparent有效的子目录项,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为返回值所在处,buflenbuffer的长度。

把一个目录项转化为一个字符串路径名。如果一个目录项已被删除,串“(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为要获得超级块的设备

扫描超级块链表,查找在给定设备上安装的文件系统的超级块。如果没有找到,则返回空。