Linus Torvalds confirmou a integração de uma atualização crítica para o driver NTFS3 no Kernel Linux 7.0. O código, submetido pelo mantenedor Konstantin Komarov da Paragon Software, representa um marco na maturidade deste driver nativo. A grande novidade é a implementação da alocação tardia (delayed allocation ou delalloc), uma técnica avançada que muda fundamentalmente como o Linux gerencia a escrita de dados em partições do Windows, aproximando seu desempenho de sistemas modernos como Ext4 e XFS.
Além do novo mecanismo de alocação, o driver sofreu uma modernização estrutural profunda, migrando operações para a infraestrutura de iomap e corrigindo falhas graves de lógica que poderiam travar o sistema ao ler discos corrompidos.
O impacto real no uso diário:
- Discos mais organizados: ao copiar grandes volumes de dados para um HD externo NTFS, o sistema agora evita escrever pequenos pedaços de arquivos espalhados pelo disco. A alocação tardia permite que o driver “planeje” a gravação, resultando em arquivos contíguos e muito menos fragmentação a longo prazo.
- Segurança contra corrupção: a atualização blinda o driver contra metadados inconsistentes. Antes, tentar ler um disco NTFS levemente corrompido poderia colocar o kernel em um loop infinito, travando o computador. Agora, o driver detecta essas falhas e aborta a operação com segurança.
Detalhes técnicos da alocação tardia
A implementação do delalloc no NTFS3 introduz uma nova estrutura em memória chamada run_da (delayed allocation runlist). O funcionamento técnico ocorre em três etapas:
- Reserva virtual: quando um programa solicita a gravação de dados, o driver não aloca clusters no disco imediatamente. Em vez disso, ele marca a região na memória com uma flag especial (DELALLOC_LCN), reservando o espaço logicamente.
- Gerenciamento de conflitos: o novo código sabe lidar com situações complexas, como colisões com Direct I/O (gravação direta sem cache) e truncamento de arquivos via fallocate. Se houver risco de conflito, o driver força a alocação imediata para garantir a integridade.
- Gravação definitiva: a conversão dos clusters virtuais em espaço físico real ocorre apenas no momento do writeback (quando o kernel decide esvaziar o cache para o disco) ou quando o arquivo é fechado, permitindo agrupar escritas vizinhas em uma única operação sequencial.
Modernização da infraestrutura (iomap e folios)
O driver NTFS3 está abandonando códigos legados para se alinhar aos padrões modernos do VFS (Virtual File System) do Linux:
- Adoção do iomap: operações críticas de arquivo foram portadas para usar iomap. Isso padroniza o comportamento do NTFS3 com outros sistemas de arquivos de alta performance, facilitando a manutenção futura e reduzindo a dívida técnica.
- Uso de folios: o código agora utiliza “folios” (a nova abstração de memória do kernel que substitui as antigas “páginas” individuais). Isso é visível na nova função ntfs_read_folio(), que zera corretamente os buffers que excedem o tamanho válido do arquivo (i_valid), evitando vazamento de dados antigos da memória RAM para o arquivo.
Melhorias em arquivos esparsos e metadados
A atualização corrige deficiências antigas na manipulação de arquivos especiais:
- Detecção de buracos: a implementação de SEEK_DATA e SEEK_HOLE agora escaneia as data runs reais do disco. Isso significa que ferramentas de backup e clonagem podem pular “buracos” (espaços vazios não alocados) em arquivos de máquinas virtuais ou bancos de dados com precisão, economizando tempo e espaço.
- Limpeza de alocações: o driver agora descarta proativamente clusters pré-alocados para arquivos esparsos e comprimidos, liberando espaço em disco que, de outra forma, ficaria “preso” e inutilizável.
Correções de estabilidade e segurança
Uma lista extensa de bugs críticos foi resolvida neste ciclo:
- Loops infinitos: foram corrigidos erros de lógica em indx_find (busca em índices), attr_load_runs_range e situações onde listas de atributos de tamanho zero (zero-sized ATTR_LIST) faziam o driver entrar em processamento eterno.
- Deadlocks: resolvida uma dependência circular de bloqueio (locking dependency) na função run_unpack_ex e um travamento fatal em ni_read_folio_cmpr (leitura de arquivos comprimidos).
- Leitura fora dos limites: corrigida uma vulnerabilidade de slab-out-of-bounds read na função DeleteIndexEntryRoot, que poderia ser explorada ou causar falhas de sistema ao manipular entradas de índice malformadas.