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
определена в файле
. Адрес этой структуры хранится в поле 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]; /* массив файловых объектов */
};