3.1 vfs_unlink函数
在vfs_unlink()函数中会调用具体文件系统的删除函数。首先检查要删除文件所在目录的权限,判断是否有删除权限,有删除权限,然后判断具体文件系统是否还有定义自己的unlink函数,没有就退出vfs_unlink函数,否则调用具体文件系统unlink函数(如ext3_unlink()函数)。
3.2 ext3_unlink函数
该函数中最主要的操作是ext3_delete_entry函数,从该文件父目录中删除文件目录项,然后修改父目录的i_ctime(上次修改文件)和i_mtime(上次写文件)字段。然后将该文件inode 的硬链接计数减一后若为0,就将其添加到orphan inode(孤儿链表,后边介绍)链表中,更新该inode的修改时间。
3.3 dput函数(release a dentry)
dput函数的主要功能是释放一个dentry结构体,并且将该结构体的使用计数d_count的值减1操作,将该结构体从队列中删除,同时,释放该结构体的资源,无返回值。函数中出现repeat字段,每次释放一个dentry,都要获取其父目录项,然后又跳转到dput()开头,继续对父目录dentry进行释放操作;是因为:每次创建一个dentry结构,除了增加自身的使用计数外,还会增加其父目录dentry的使用计数,所以当释放了一个dentry后也需要递减其父目录dentry的使用计数。才能保证父目录为空时能够被释放。
4.iput函数(truncate the inode here)
atomic_dec_and_lock宏先对i_count(进程使用计数)加锁后原子的减一,结果为0时,返回true,再进行调用iput_final函数进行删除操作,否则不进行任何操作。
4.1 iput_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.2 ext3_delete_inode 函数
该函数会删除指定的inode,其中主要会调用如下函数:
ext3_truncate 截断磁盘上的索引信息
ext3_orphan_del
ext3_free_inode 从内存中和磁盘上分别删除该inode