Implementation of Linux Kernel 5.4.X simple block device.
- regular:
$ make
- with requests debug info:
uncomment
CFLAGS_sbdd.o := -DDEBUG
inKbuild
$ make clean
Строение модуля было изучено вместе с соответствующей литературой. Модуль был собран и запущен в среде VirtualBox на Oracle Linux 8.5
В ходе выполнения задания 0 было выяснено, что модуль обрабатывает запросы ввода-вывода в функции sbdd_xfer_bio(). Для добавления функционала перенаправления запросов на дургое блочное устройство в системе, этот метод был разделён на sbdd_xfer_bio_ram() и sbdd_xfer_bio_blkdev(), вызываемый в зависимости от конфигурации модуля. Также к модулю были добавлены опции device_mode и block_device.
Новые опции были добавлены для задания параметров работы модуля. Их изменение, а также некоторые внутренние операции модуля были вынесены в отдельные методы с целью возможности динамического изменения режима работы модуля, но эта возможность не была реализована.
Для перенаправления запросов в другое блочное устройство, запросы к этому модулю клонируются при помощи bio_clone_fast, затем у них изменяется целевое блочное устройство, добавляется метод завершения, а затем новый bio отправляется в систему на обработку системным слоем блочных устройств.
Функционал динамического изменения поведения модуля не был реализован из-за того, что нужно множество кода для контроля за тем, завершены ли все BIO на устройстве прежде чем менять его поведение.
Данный функционал не был реализован из-за нехватки времени. Для его реализации необходимо изменить процедуры перенаправления запросов блочным устройствам. Для реализации записи на диски достаточно bio_clone_fast() на два устройства и перепроверок успешности выполнения обоих копий запроса. Для реализации операций чтения необходимо создание 2 новых bio, которые бы копировали данные изначального запроса, но у одного из них были заного аллоцированные страницы буффера. После выполнения обоих запросов необходимо сверить с них данные (в случае различия полученных данных пометить исходное BIO как ошибочное и сообщить о неисправности зеркала в лог) и завершить изначальный запрос.
Данный функционал не был реализован из-за нехватки времени. Для его реализации необходимо создавать несколько копий BIO через bio_clone_fast, и при этом модифицировать созданные структуры, изменив начальные сектора и размеры так, чтобы данные страйпами попали на соответствующие диски.