3.1vfs_unlink函数
在vfs_unlink()函数中会调用具体文件系统的删掉函数。首先检测要删掉文件所在目录的权限,判定是否有删掉权限,有删掉权限,之后判定具体文件系统是否还有定义自己的unlink函数,没有就退出vfs_unlink函数,否则调用具体文件系统unlink函数(如ext3_unlink()函数)。
3.2ext3_unlink函数
该函数中最主要的操作是ext3_delete_entry函数linux 删除目录 函数,从该文件父目录中删掉文件目录项,之后更改父目录的i_ctime(先前更改文件)和i_mtime(先前写文件)主键。之后将该文件inode的硬链接计数减一后若为0,就将其添加到orphaninode(孤儿数组,上面介绍)数组中,更新该inode的更改时间。
3.3dput函数(releaseadentry)
dput函数的主要功能是释放一个dentry结构体,而且将该结构体的使用计数d_count的值减1操作,将该结构体从队列中删掉linux源代码分析,同时,释放该结构体的资源,无返回值。
函数中出现repeat数组,每次释放一个dentry,都要获取其父目录项,之后又跳转到dput()开头,继续对父目录dentry进行释放操作;是由于:每次创建一个dentry结构,不仅降低自身的使用计数外,都会降低其父目录dentry的使用计数,所以当释放了一个dentry后也须要递减其父目录dentry的使用计数。能够保证父目录为空时才能被释放。
4.iput函数(truncatetheinodehere)
atomic_dec_and_lock宏先对i_count(进程使用计数)加锁后原子的减一,结果为0时,返回truelinux移植,再进行调用iput_final函数进行删掉操作,否则不进行任何操作。
4.1iput_final函数
该函数主要是调用generic_drop_inode()函数,其会判定inode->i_nlink的值,若为0,则该inode可以被删掉,调用generic_delete_inode()实现。
在generic_delete_inode()函数中会判定是否定义具体文件系统的超级块操作函数delete_inode,若定义的就调用具体的inode删掉函数(如ext3_delete_inode),否则调用truncate_inode_pages和clear_inode函数(在具体文件系统的delete_inode函数中也必须调用这两个函数)。
4.2ext3_delete_inode函数
该函数会删掉指定的inodelinux 删除目录 函数,其中主要会调用如下函数: