Estou procurando uma maneira de monitorar o acesso a blocos de disco e monitorar o acesso como um bitmap de blocos.
Eu também preciso da capacidade de congelar (e enfileirar) o acesso ao bloco do dispositivo (e também descongelar e gravar os blocos pendentes). Parece que esses recursos devem ser suportados no modo kernel (não pode ser feito provavelmente como um aplicativo de usuário). No kernel há blk-core.c que provavelmente é o portão antes de chamar o dispositivo de bloco real. Eu pensei que eu poderia usar isso para esse propósito.
Parece que já é usado algum mecanismo de fila, e que eu precisaria de alguma maneira de entender quando a gravação real no dispositivo é feita.
void blk_start_queue(struct request_queue *q)
{
WARN_ON(!irqs_disabled());
queue_flag_clear(QUEUE_FLAG_STOPPED, q);
__blk_run_queue(q);
}
EXPORT_SYMBOL(blk_start_queue);
Eu também vejo que ele usa setores, não blocos (que é o que preciso rastrear).
É que a solicitação de gravação do sistema de arquivos do kernel está em setores, enquanto o driver de dispositivo abaixo do disco funciona em blocos? Se sim, então o monitoramento de bloco deve estar no driver de disco.
Eu também não tenho certeza sobre o bloco de dispositivo em si (por exemplo, hd.c) A estrutura da solicitação contém o local exato onde a transferência deve ser feita:
struct request
{
....
sector // the position in the device at which the transfer should be made
....
}
fornece informações sobre o setor exato para leitura / gravação, mas como a camada acima da qual envia a solicitação pode decidir sobre ela? Não é a decisão do driver de bloco (hd.c neste caso) tomar?
Eu provavelmente sinto falta de algo no meu entender.
Obrigado por qualquer sugestão sobre o assunto.