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; /* счетчик ссылок на структуру */