【问题标题】:During a file creation, when does struct file_operations and struct file get connected?在文件创建期间,struct file_operations 和 struct file 何时连接?
【发布时间】:2012-03-12 17:49:24
【问题描述】:

我正在关注 open() 系统调用,以了解在创建文件期间 struct file_operationsstruct 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 何时以及在哪个函数中被初始化?

【问题讨论】:

    标签: c linux linux-kernel


    【解决方案1】:

    你见过thisthis吗:

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

    open_namei():填写包含dentry的nameidata结构 和 vfsmount 结构。 dentry_open():给定一个 dentry 和 vfsmount, 该函数分配一个新的结构文件并将它们链接在一起;它 还调用已设置的文件系统特定 f_op->open() 方法 在 inode->i_fop 中读取 inode 时在 open_namei() (提供 inode 通过 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 在 open_namei 函数中(或在下面的某个地方),在 dentry_open 之前。只需跟踪 dentry 结构即可。

    【讨论】:

    • inode 是与文件的创建一起创建的。它不是在那里出生的。所以 inode i_fop 应该在某个地方初始化。但是在哪里?
    【解决方案2】:

    在为现有文件创建 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 上的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      相关资源
      最近更新 更多