在文件创建期间,struct file_operations和struct file何时连接?

时间:2012-03-08 21:40:48

标签: c linux linux-kernel

我正在关注 open()系统调用,以了解在创建文件期间 struct file_operations struct file 何时连接

主要途径如下:

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被初始化的时间和函数是什么时候?

2 个答案:

答案 0 :(得分:1)

您是否见过thisthis

  

open(2)系统调用在fs / open.c:sys_open函数中实现   真正的工作是由fs / open.c:filp_open()函数完成的,即   分为两部分:

     

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

实际设置为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);

dentry包含其d_inode成员中的inode信息。因此,初始化inode位于dentry_open之前的open_namei函数(或其中某处)。只需跟踪dentry结构。

答案 1 :(得分:0)

在为现有文件创建dentry对象时,将分配文件操作。这是在特定于文件系统的查找功能中完成的。以下是该呼叫流程。

sys_open - &gt; do_sys_open - &gt; do_filp_open - &gt; path_openat - &gt; do_last - &gt; walk_component - &gt; do_lookup - &gt; d_alloc_and_lookup - &gt; filesystem specific lookup function()< / p>

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

这是在linux-3.0上。