Привет всем, если следующий код драйвера
void my_end_request(struct bio* child, int error)
{
my_private_t* private = child->bi_private;
complete((struct completion*)private->completion);
}
int my_submit_request
(
my_handle_t* handle,
int rw,
int mode,
struct bio* bio,
void* user_private_data,
bio_end_io_t* user_callback
)
{
struct bio* child = NULL;
my_private_t* private = NULL;
my_registry_t* registry = NULL;
int direction = -1;
DECLARE_COMPLETION_ONSTACK(completion);
registry = handle->registry;
direction = bio_data_dir(bio);
child = bio_clone(bio, GFP_NOIO);
private = my_private_get(registry->my_cache_private); // тут получаем структуру, в которой хранятся некоторые наши данные
child->bi_end_io = (bio_end_io_t*)my_end_request; // устанавливаем callback
child->bi_bdev = handle->bdev; // с этого устройства будем производить чтение
private->completion = &completion;
private->parent = bio;
private->user_private_data = user_private_data;
private->user_callback = user_callback;
private->mode = mode;
private->handle = handle;
child->bi_private = private;
generic_make_request(child);
wait_for_completion(&completion); // Ждем конца чтения
// еще какой то код
}
Пытаюсь перенаправлять запросы (пока только на чтение) со своего устройства на другое, в функции my_submit_request клонирую bio, вызываю сначала generic_make_request затем wait_for_completion(&completion) для того, что бы дождать окончания чтения, в коллбэке my_submit_request должна сработать функция complete. Проблема в том, никакого вызова коллбэка не происходит и мы вечно висим в wait_for_completion.
Код проверяющий ошибки не стал приводить что бы сократить объем.