Tamanho de transferência máximo em SG_IO / SG_ATA_16

1

Eu preciso passar uma solicitação ATA direta e crua para um disco rígido (0x25, READ DMA EXT ), para desobedecer a contagem máxima do setor (longa história) e para ignorar todos os possíveis caches, buffers, reordenamentos do sistema operacional e outros.

HDIO_DRIVE_TASKFILE IOCTL não está mais disponível devido a libata .

Eu atingi a meta com um SG_IO IOCTL com passagem ATA ( SG_ATA_16 ). Funciona perfeitamente, exceto um problema: posso ler no máximo 8192 setores em um comando. Eu preciso de ler um total de 32767 setores.

  • max_hw_sectors_kb é 32767, então a unidade suporta essa grande transferência
  • max_sectors_kb era baixo, mas eu o trouxe para 32767 setores, sem sucesso
  • O agendador está definido como noop , sem alteração.
  • Tentei coletar o buffer ( iovec_count>0 , defina corretamente iovecs para fatias de buffer consecutivas), sem alteração.

Ambiente: Ubuntu 16.04 / 16.10 / 17.04 / 17.10 com kernels padrão, unidade SATA conectada à interface AHCI padrão no chipset Intel.

Não importa o que eu faça, começando com 8193 setores, o IOCTL fica com o erro " Invalid argument " (precisamente, com EINVAL errno). Em outra máquina, ela varia ligeiramente de rodar para rodar (sem reinicialização), geralmente ocupando no máximo 1344 setores.

Onde procurar? O que pode causar um limite de transferência de dados?

    
por Pawel Kraszewski 06.12.2017 / 16:47

0 respostas