Мне нужно создать драйвер блочного устройства Disk On Ram.
Насколько я понимаю, каждый раз, когда ядро решает выполнить блочный ввод-вывод на нашем устройстве, вызывается функция запроса. Имеет прототип
static void my_request(struct request_queue *q)
Мы сообщаем ядру, что это функция запроса, используя функцию blk_init_queue
.
Теперь из примеров, которые я прочитал, my_request
должен выполнять итерацию очереди запросов с помощью blk_fetch_request
, он должен отбрасывать запросы не-fs и выполнять фактические переводы для других видов запросов.
Мой вопрос заключается в том, как водитель узнает, является ли запрос не-fs-запросом.
Вот что я знаю:
Раньше была функция (или макрос?) С именем blk_fs_request
примерно так:
if (! blk_fs_request(req)) {
end_request(req, 0);
continue;
}
Ненулевое возвращаемое значение из макроса blk_fs_request () говорит: «это
нормальный запрос файловой системы. "Другие типы запросов (т.е. пакетный режим
или специфические для устройства диагностические операции) не то, что sbd
поддерживает, поэтому он просто не отвечает на любые такие запросы. (с lwn.net здесь )
(sbd означает простое блочное устройство. Автор пытается объяснить новый интерфейс на примере).
В используемой мной версии ядра (вывод uname -r: 4.15.0-46-generic
) нет такой функции, как blk_fs_request
. Я прочитал вокруг и обнаружил, что функция была удалена.
Был обходной путь, при котором драйверы просто читали бы req->cmd_type
для той же функциональности, но этот элемент также был удален из struct request
.
Итак, мой вопрос: без blk_fs_request
и req->cmd_type
есть ли способ, с помощью которого я могу обнаруживать запросы, не относящиеся к файловой системе, или я должен просто принять все запросы как запросы файловой системы и обработать их.