在文件创建过程中,何时连接struct file_操作和struct file?

在文件创建过程中,何时连接struct file_操作和struct file?,c,linux,linux-kernel,C,Linux,Linux Kernel,我正在执行open()系统调用,以了解在创建文件期间struct file_操作和struct file何时连接 主要途径如下: sys_open -> do_sys_open -> do_filp_open -> nameidata_to_filp -> __dentry_open 入户 static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt,

我正在执行open()系统调用,以了解在创建文件期间struct file_操作struct file何时连接

主要途径如下:

sys_open -> do_sys_open -> do_filp_open -> nameidata_to_filp -> __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在什么时候和在哪个函数中初始化?

您是否看到和:

open(2)系统调用在fs/open.c:sys\u open函数中实现 真正的工作是通过fs/open.c:filp_open()函数完成的,它是 分为两部分:

open_namei():填充包含dentry的nameidata结构 和vfsmount结构。dentry_open():给定dentry和vfsmount, 此函数分配一个新的结构文件并将它们链接在一起;信息技术 还调用已设置的文件系统特定的f_op->open()方法 在inode->i_fop中,在open_namei()中读取inode时(提供了 inode通过dentry->d_inode)

它实际上设置在
path\u walk
功能(如果文件存在):


dentry在其
d_inode
成员中包含inode信息。因此初始化inode在open_namei函数中(或在下面的某个地方),在dentry_open之前。只需跟踪dentry结构。

为现有文件创建dentry对象时,会指定文件操作。这是在特定于文件系统的查找函数中完成的。下面是该方法的调用流程

sys\u open-->do\u sys\u open-->do\u filp\u open-->path\u openat-->do\u last-->walk\u component-->do\u lookup-->d\u alloc\u and\u lookup-->文件系统特定的查找函数()

ext2文件系统的文件系统特定查找函数为ext2_lookup(),ext3为ext3_lookup(),ext4为ext4_lookup()。在lookup函数内部将有一个函数调用,如ext2_iget()或ext3_iget()或ext4_iget()。此函数用于填充inode对象的i_fop字段


这在linux-3.0上。

inode是与文件的创建一起创建的。它不是在那里出生的。所以inode i_fop应该在某个地方初始化。但是在哪里呢?
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);