Simple Block Device Driver

Implementation of Linux Kernel 5.4.X simple block device.

Build

  • regular: $ make
  • with requests debug info: uncomment CFLAGS_sbdd.o := -DDEBUG in Kbuild

Clean

$ make clean

References

Tasks

Task 0

Строение модуля было изучено вместе с соответствующей литературой. Модуль был собран и запущен в среде VirtualBox на Oracle Linux 8.5

Task 1

В ходе выполнения задания 0 было выяснено, что модуль обрабатывает запросы ввода-вывода в функции sbdd_xfer_bio(). Для добавления функционала перенаправления запросов на дургое блочное устройство в системе, этот метод был разделён на sbdd_xfer_bio_ram() и sbdd_xfer_bio_blkdev(), вызываемый в зависимости от конфигурации модуля. Также к модулю были добавлены опции device_mode и block_device.

Новые опции были добавлены для задания параметров работы модуля. Их изменение, а также некоторые внутренние операции модуля были вынесены в отдельные методы с целью возможности динамического изменения режима работы модуля, но эта возможность не была реализована.

Для перенаправления запросов в другое блочное устройство, запросы к этому модулю клонируются при помощи bio_clone_fast, затем у них изменяется целевое блочное устройство, добавляется метод завершения, а затем новый bio отправляется в систему на обработку системным слоем блочных устройств.

Функционал динамического изменения поведения модуля не был реализован из-за того, что нужно множество кода для контроля за тем, завершены ли все BIO на устройстве прежде чем менять его поведение.

Task 2

Данный функционал не был реализован из-за нехватки времени. Для его реализации необходимо изменить процедуры перенаправления запросов блочным устройствам. Для реализации записи на диски достаточно bio_clone_fast() на два устройства и перепроверок успешности выполнения обоих копий запроса. Для реализации операций чтения необходимо создание 2 новых bio, которые бы копировали данные изначального запроса, но у одного из них были заного аллоцированные страницы буффера. После выполнения обоих запросов необходимо сверить с них данные (в случае различия полученных данных пометить исходное BIO как ошибочное и сообщить о неисправности зеркала в лог) и завершить изначальный запрос.

Task 3

Данный функционал не был реализован из-за нехватки времени. Для его реализации необходимо создавать несколько копий BIO через bio_clone_fast, и при этом модифицировать созданные структуры, изменив начальные сектора и размеры так, чтобы данные страйпами попали на соответствующие диски.