我正在关注 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被初始化的时间和函数是什么时候?
答案 0 :(得分:1)
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上。