Выбрать главу

 struct vfsmount   *mnt_parent;     /* родительская файловая система */

 struct dentry     *mnt_mountpoint; /* объект элемента каталога

                                       точки монтирования */

 struct dentry     *mnt_root;       /* объект элемента каталога корня

                                        данной файловой системы */

 struct super_block *mnt_sb; /* суперблок данной файловой системы */

 struct list_head   mnt_mounts;     /* список файловых систем,

                                       смонтированных к данной */

 struct list_head   mnt_child;      /* потомки, связанные с родителем */

 atomic_t           mnt_count;      /* счетчик использования */

 int                mnt_flags;      /* флаги монтирования */

 char               *mnt_devname;   /* имя смонтированного устройства */

 struct list_head   mnt_list;       /* список дескрипторов */

 struct list_head   mnt_fslinkk;    /* истекший список, специфичный

                                       для файловой системы */

 struct namespace   *mnt_namespace; /* связанное пространство имен */

};

Самая сложная задача — это поддержание списка всех точек монтирования и взаимоотношений между данной файловой системой и другими точками монтирования. Эта информация хранится в различных связанных списках структуры vfsmount.

Структура vfsmount также содержит поле mnt_flags. В табл. 12.1 приведен список стандартных флагов монтирования.

Таблица 12.1. Список стандартных флагов монтирования

Флаг Описание
MNT_NOSUID Запрещает использование флагов setuid и setgid для бинарных файлов на файловой системе
MNT_NODEV Запрещает доступ к файлам устройств на файловой системе
MNT_NOEXEC Запрещает выполнение программ на файловой системе

Эти флаги полезны, в основном, для сменных носителей, которым администратор не доверяет.

Структуры данных, связанные с процессом

Каждый процесс в системе имеет свои открытые файлы, корневую файловую систем); текущий рабочий каталог, точки монтирования и т.д. Следующие три структуры данных связывают вместе подсистему VFS и процессы, которые выполняются в системе. Это структуры files_struct, fs_struct и namespace.

Структура files_struct определена в файле <linux/file.h>. Адрес этой структуры хранится в поле files дескриптора процесса. В данной структуре хранится вся информация процесса об открытых файлах и файловых дескрипторах. Эта структура, с комментариями, имеет следующий вид.

struct files_struct {

 atomic_t    count;              /* счетчик ссылок на данную структуру */

 spinlock_t  file_lock; /* блокировка для защиты данной структуры */

 int         max_fds; /* максимальное количество файловых объектов */

 int         max_fdset;          /* максимальное количество

                                    файловых дескрипторов */

 int         next_fd; /* номер следующего файлового дескриптора */

 struct file **fd;               /* массив всех файловых объектов */

 fd_set      *close on exec;     /* файловые дескрипторы, которые должны

                                    закрываться при вызове exec() */

 fd_set      *open_fds; /* указатель на дескрипторы открытых файлов */

 fd_set      close_on_exec init; /* первоначальные файлы для закрытия

                                    при вызове exec() */

 fd_set       open_fds_init;     /* первоначальный набор

                                    файловых дескрипторов */

 struct file *fd_array[NR_OPEN_DEFAULT]; /* массив файловых объектов */

};

Массив fd указывает на список открытых файловых объектов. По умолчанию это массив fd_array. Так как по умолчанию значение константы NR_OPEN_DEFAULT равно 32, то это соответствует 32 файловым объектам. Если процесс открывает больше 32 файловых объектов, то ядро выделяет новый массив и присваивает полю fd указатель на него. При таком подходе доступ к небольшому количеству файловых объектов осуществляется быстро, потому что они хранятся в статическом массиве. В случае, когда процесс открывает аномально большое количество файлов, ядро может создать новый массив. Если большинство процессов в системе открывает больше 32 файлов, то для получения оптимальной производительности администратор может увеличить значение константы NR_OPEN_DEFAULT с помощью директивы препроцессора. Следующая структура данных, связанная с процессом, — это структура fs_struct, которая содержит информацию, связанную с процессом, и на которую указывает поле fs дескриптора процесса. Эта структура определена в файле <linux/fs_struct.h> и имеет следующий вид с поясняющими комментариями.

struct fs_struct {

 atomic_t       count;        /* счетчик ссылок на структуру */

 rwlock_t       lock;         /* блокировка для защиты структуры */

 int             umask;       /* права доступа к файлу, используемые

                                 по умолчанию */

 struct dentry   *root;       /* объект dentry корневого каталога */

 struct dentry   *pwd;        /* объект dentry

                                 текущего рабочего каталога */

 struct dentry   *allroot;    /* объект dentry альтернативного корня */

 struct vfsmount *rootmnt;    /* объект монтирования корневого каталога */

 struct vfsmount *pwdmnt;     /* объект монтирования

                                 текущего рабочего каталога */

 struct vfsmount *altrootmnt; /* объект монтирования

                                 альтернативного корня */

};

Эта структура содержит текущий рабочий каталог и корневой каталог данного процесса.

Третья, и последняя, структура — это структура namespace, которая определена в файле <linux/namespace.h> и на экземпляр которой указывает поле namespace дескриптора процесса. Пространства имен, индивидуальные для каждого процесса, были введены в ядрах Linux серии 2.4. Это позволило создать для каждого процесса уникальное представление о смонтированных файловых системах. Иными словами, процесс может иметь не только уникальный корневой каталог, но и полностью уникальную иерархию смонтированных файловых систем, если это необходимо. Как обычно, ниже приведена соответствующая структура данных с комментариями.

struct namespace {

 atomic_t            count; /* счетчик ссылок на структуру */