Внутреннее устройство ядра Linux 2.4



         

Управление файловой структурой


Структура file объявлена в include/linux/fs.h:

struct fown_struct { int pid; /* pid или -pgrp процесса, которому должен передаваться SIGIO */ uid_t uid, euid; /* uid/euid процесса-владельца */ int signum; /* posix.1b rt signal to be delivered on IO */ };

struct file { struct list_head f_list; struct dentry *f_dentry; struct vfsmount *f_vfsmnt; struct file_operations *f_op; atomic_t f_count; unsigned int f_flags; mode_t f_mode; loff_t f_pos; unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin; struct fown_struct f_owner; unsigned int f_uid, f_gid; int f_error;

unsigned long f_version;

/* требуется для драйвера tty, а возможно и для других */ void *private_data; };

Остановимся подробнее на полях struct file:

  • f_list: поле связи с одним (и только одним) из списков:

    а) sb->s_files - список всех открытых файлов в данной файловой системе, если соответствующий inode не является анонимным, то dentry_open() (вызываемая из filp_open()) вставляет файл в этот список;

    б) fs/file_table.c:free_list - список неиспользуемых структур;

    в) fs/file_table.c:anon_list - в этот список включаются структуры, создаваемые в get_empty_filp().

    Доступ к этим спискам производится под блокировкой files_lock.

  • f_dentry: dentry файла. Создается в процессе поиска nameidata в open_namei() (или точнее в path_walk()), но в действительности поле file->f_dentry заполняется в dentry_open().
  • f_vfsmnt: указатель на структуру vfsmount файловой системы, содержащей файл. Заполняется функцией dentry_open() и является частью nameidata, поиск которой производится в open_namei()

    (или точнее в path_init()).

  • f_op: указатель на список file_operations, который содержит адреса методов для работы с файлом. Копируется из inode->i_fop

    методом s_op->read_inode(), вызываемым в процессе поиска nameidata. Более подробно на списке file_operations мы остановимся ниже в этом разделе.

  • f_count: счетчик ссылок, изменяется в get_file/put_filp/fput.
  • f_flags: флаги O_XXX системного вызова open(2), копируются функцией dentry_open() (с небольшими изменениями в filp_open()), при чем флаги O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC




    Содержание  Назад  Вперед