LINUX.ORG.RU

[kernel] generic_make_request - не срабатывает callback

 


1

1

Привет всем, если следующий код драйвера

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.

Код проверяющий ошибки не стал приводить что бы сократить объем.



Последнее исправление: megabug (всего исправлений: 1)

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.