open系统调用流程--从vfs到底层文件系统

sys_open (filename,flag,mode)

  do_sys_open (dfd=-100, filename=null,flags=35137, mode=438)
  get_unused_fd_flags(flags),获得一个文件句柄fd
 
 do_filp_open (dfd,pathname,open_flag,mode),获得一个文件对象
    path_lookup_create(LOOKUP_PARENT,&nd),获得父目录的nameidata信息,这个函数会生成file对象,引用计数器默认值为1
    
 dentry=lookup_hash (&nd),获得要查找文件的dentry信息
inode_permission,检验一下父目录的inode
__lookup_hash(name,base,nd)
    d_hash(base,name),调用具体文件系统的d_hash操作, Cappella没有实现
    cached_lookup(base,name,nd),在缓存中查找,看是否有dentry
  new=d_alloc(base,name),在内存中没有,就生成一个新的dentry对象,包括空间的申请,一些数值的初始化
        atomic_set(&dentry->d_count, 1);引用计数器置为1
        dentry->d_flags = DCACHE_UNHASHED;置为unhashed
 capfs_lookup(inode,new,nd),其中,inode为父目录的inode, 这里是具体文件系统的lookup操作
    capfs_wrap_lookupdata (dir,dentry,nd),向mds发送命令,查找对应的文件是否存在
     如果查找成功调用 capfs_fhget ,这个文件对应的具体文件系统inode结构
ifind(),查找是否inode已经存在, 这里是内核部分
get_new_inode,生成新的inode
  alloc_inode,申请一个新的inode(capfs_i_info)
    alloc_inode( 调用具体文件系统的alloc_inode方法 )
   atomic_set(&inode->i_count, 1);计数器置为1
      查找不成功,status置为-ENOENT,inode=NULL
     d_splice_alias(dentry,inode),dentry为上层传递下来的,inode为刚刚创建的。
            
  d_add(dentry,inode)
                  
d_instantiate(dentry,inode),把dentry加入到刚刚创建的inode对应的dentry链中,同时dentry指向inode
                
 d_rehash(dentry),把dentry插入到其父目录dentry所有用的哈希链表中,方便下一次查找


你可能感兴趣的:(linux,文件系统)