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

• int sync_fs(struct super_block *sb, int wait) — эта функция синхронизирует метаданные файловой системы с данными на диске. Параметр wait указывает, должна ли операция быть синхронной или асинхронной.

• void write_super_lockfs(struct super_block *sb) — эта функция предотвращает изменения файловой системы и затем обновляет данные суперблока на диске данными из указанного суперблока. Сейчас она используется диспетчером логических томов (LVM, Logical Volume Manager).

• void unlockfs(struct super_block *sb) — эта функция разблокирует файловую систему после выполнения функции write_super_lockfs().

• int statfs(struct super_block *sb, struct statfs *statfs) — эта функция вызывается подсистемой VFS для получения статистики файловой системы, Статистика указанной файловой системы записывается в структуру statfs.

• int remount_fs(struct super_block *sb, int *flags, char *data) — эта функция вызывается подсистемой VFS, когда файловая система монтируется с другими параметрами монтирования.

• void clear_inode(struct inode*) — эта функция вызывается подсистемой VFS для освобождения индекса и очистки всех страниц памяти, связанных с индексом.

• void umount_begin(struct super_block *sb) — эта функция вызывается подсистемой VFS для прерывания операции монтирования. Она используется сетевыми файловыми системами, такими как NFS.

Все рассмотренные функции вызываются подсистемой VFS в контексте процесса. Все они при необходимости могут блокироваться.

Некоторые из этих функций являются необязательными. Файловая система может установить их значения в структуре операций суперблока равными NULL. Если соответствующий указатель равен NULL, то подсистема VFS или вызывает общий вариант функции, или не происходит ничего, в зависимости от операции.

Объект inode

Объект inode содержит всю информацию, которая необходима ядру для манипуляций с файлами и каталогами. В файловых системах в стиле Unix вся информация просто считывается из дисковых индексов и помещается в объект inode подсистемы VFS. Если файловые системы не имеют индексов, то эту информацию необходимо получить из других дисковых структур[70].

Объект индекса файла представляется с помощью структуры struct inode, которая определена в файле <linux/fs.h>. Эта структура с комментариями, описывающими назначение каждого поля, имеет следующий вид.

struct inode {

 struct hlist_node       i_hash;         /* хешированный список */

 struct list_head        i_list;         /* связанный список индексов */

 struct list_head        i_dentry; /* связанный список объектов dentry */

 unsigned long           i_ino;          /* номер индекса */

 atomic_t                i_count;        /* счетчик ссылок */

 umode_t                 i_mode;         /* права доступа */

 unsigned int            i_nlink;        /* количество жестких ссылок */

 uid_t                   i_uid; /* идентификатор пользователя-владельца */

 gid_t                   i_gid; /* идентификатор группы-владельца */

 kdev_t                  i_rdev;         /* связанное устройство */

 loff_t                  i_size;         /* размер файла в байтах */

 struct timespec         i_atime; /* время последнего доступа к файлу */

 struct timespec         i_mtime; /* время последнего изменения файла */

 struct timespec         i_ctime;        /* время изменения индекса */

 unsigned int            i_blkbits;      /* размер блока в битах */

 unsigned long           i_blksize;      /* размер блока в байтах */

 unsigned long           i_version;      /* номер версии */

 unsigned long           i_blocks;       /* размер файла в блоках */

 unsigned short          i_bytes; /* количество использованных байтов */

 spinlock_t              i_lock;         /* блокировка для защиты полей */

 struct rw_semaphore     i_alloc_sem     /* вложенные блокировки при

                                            захваченной i_sem */

 struct semaphore        i_sem;          /* семафор индекса */

 struct inode_operations *i_op;          /* таблица операций с индексом */

 struct file_operations  *i_fop;         /* файловые операции */

 struct super_block      *i_sb;          /* связанный суперблок */

 struct file_lock        *i_flock;       /* список блокировок файлов */

 struct address_space    *i_mapping;     /* соответствующее адресное

                                            пространство */

 struct address_space    i_data; /* адресное пространство устройства */

 struct dquot            *i_dquot[MAXQUOTAS]; /* дисковые квоты

                                                 для индекса */

 struct list_head        i_devices;      /* список блочных устройств */

 struct pipe_inode_info  *i_pipe;        /* информация конвейера */

 struct block_device     *i_bdev;        /* драйвер блочного устройства */

 unsigned long           i_dnotify_mask; /* события каталога */

 struct dnotify_struct   *i_dnotify; /* информация о событиях каталога */

 unsigned long           i_state;        /* флаги состояния */

 unsigned long           dirtied_when    /* время первого изменения */

 unsigned int            i_flags;        /* флаги файловой системы */

 unsigned char           i_sock;         /* сокет или нет? */

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

                                            для записи */

 void                    *i_security;    /* модуль безопасности */

 __u32                   i_generation;   /* номер версии индекса */

 union {

  void *generic_ip; /* специфическая информация

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

 } u;

};

Для каждого файла в системе существует представляющий его индекс (хотя объект файлового индекса создается в памяти только тогда, когда к файлу осуществляется доступ). Это справедливо и для специальных файлов, таких как файлы устройств или конвейеры. Следовательно, некоторые из полей структуры struct inode относятся к этим специальным файлам. Например, поле i_pipe указывает на структуру данных именованного конвейера. Если индекс не относится к именованному конвейеру, то это поле просто содержит значение NULL Другие поля, связанные со специальными файлами, — это i_devices, i_bdev, i_cdev.

Может оказаться, что та или иная файловая система не поддерживает тех свойств, которые присутствуют в объекте inode. Например, некоторые файловые системы не поддерживают такого атрибута, как время создания файла. В этом случае файловая система может реализовать это свойство как угодно. Например, поле i_ctime можно сделать нулевым или равным значению поля i_mtime.

вернуться

70

Файловые системы, которые не имеют индексов, обычно хранят необходимую информацию как часть файла. Некоторые современные файловые системы также применяют базы данных для хранения метаданных файла. В любом случае объект индекса создается тем способом, который подходит для файловой системы.