2012-03-08 118 views
0

我下面的的open()系統調用來找出當file_operations結構結構文件一個創建文件的過程中獲得連接。在文件創建期間,struct file_operations和struct文件何時連接?

主要路徑如下:

sys_open -> do_sys_open -> do_filp_open -> nameidata_to_filp -> __dentry_open 

在__dentry_open

static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt, 
            int flags, struct file *f, 
            int (*open)(struct inode *, struct file *), 
            const struct cred *cred) 
{ 
    struct inode *inode; 
    int error; 

    f->f_flags = flags; 
    f->f_mode = ((flags+1) & O_ACCMODE) | FMODE_LSEEK | 
          FMODE_PREAD | FMODE_PWRITE; 
    inode = dentry->d_inode; 
    if (f->f_mode & FMODE_WRITE) { 
      error = __get_file_write_access(inode, mnt); 
      if (error) 
        goto cleanup_file; 
      if (!special_file(inode->i_mode)) 
        file_take_write(f); 
    } 

    f->f_mapping = inode->i_mapping; 
    f->f_path.dentry = dentry; 
    f->f_path.mnt = mnt; 
    f->f_pos = 0; 
    f->f_op = fops_get(inode->i_fop);//I think it is here that they get connected 
    file_move(f, &inode->i_sb->s_files); 

    error = security_dentry_open(f); 

    ... 

但當並在其中發揮作用,在inode中的i_fop被初始化?

回答

1

你見過thisthis

開放(2)系統調用在FS實現/ open.c:SYS_OPEN功能 和真正的工作是由FS做/ open.c:filp_open ()函數,這是 分爲兩部分:

open_namei():填充名稱數據結構包含dentry 和vfsmount結構。 dentry_open():給定一個dentry和vfsmount, 這個函數分配一個新的結構文件並將它們連接在一起;當在open_namei()中讀取inode時(它通過dentry-> d_inode提供了 inode),它還調用inode-> i_fop中設置爲 的文件系統特定的f_op-> open()方法。

它實際上是設置爲path_walk功能(如果文件存在):

path_walk(const char *name, struct nameidata *nd) { 
/* ... */ 
       /* if . or .. then special, otherwise: */ 
       dentry = cached_lookup(nd->dentry, &this); 
/* ... */ 
       if (!dentry) 
       dentry = real_lookup(nd->dentry, &this); 

目錄項包含在其d_inode成員的inode信息。因此,初始化inode位於dentry_open之前的open_namei函數(或某處)。只需跟蹤dentry結構。

+0

inode與創建文件一起創建。它不是在那裏誕生的。所以inode i_fop應該在某個地方初始化。但是哪裏? – sliter 2012-03-08 21:59:39

0

當爲現有文件創建一個dentry對象時,會分配文件操作。這是在文件系統特定的查找功能中完成的。以下是該電話的流程。

SYS_OPEN - > do_sys_open - > do_filp_open - > path_openat - > do_last - > walk_component - > do_lookup - > d_alloc_and_lookup - >的文件系統特定查找功能()

文件系統特定查找ext2文件系統的函數是ext2_lookup(),ext3函數是ext3_lookup(),ext4函數是ext4_lookup()。在查找函數內部會有一個函數調用,如ext2_iget()或ext3_iget()或ext4_iget()。此函數填充inode對象的i_fop字段。

這是在linux-3.0上。