Когда при создании файла подключаются struct file_operations и struct file? - PullRequest
0 голосов
/ 09 марта 2012

Я выполняю системный вызов 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);

    ...

Но когда и в какой функции инициализируется i_fop в inode?

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Вы видели это и это :

Системный вызов open (2) реализован в функциях fs / open.c: sys_open инастоящая работа выполняется функцией fs / open.c: filp_open (), которая разделена на две части:

open_namei (): заполняет структуру nameidata, содержащую структуры dentry и 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 члене.Таким образом, индекс инициализации находится в функции open_namei (или где-то там) до dentry_open.Просто отследите структуру зубов.

0 голосов
/ 12 марта 2012

Файловые операции назначаются при создании объекта 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 ().Эта функция заполняет поле i_fop объекта inode.

Это на linux-3.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...