WRITE_ZEROES não suportado em dispositivos de loop

WRITE_ZEROES não suportado em dispositivos de loop

Encontrei um problema estranho em que mkfs.ext4 não funcionava em dispositivos de loop apoiados por um arquivo temporário.

tmp_file="$(mktemp)"
fallocate -l 8M "$tmp_file"
loop="$(losetup --show -f "$tmp_file")"
mkfs.ext4 "$loop"

Eu tentei dd if=/dev/zeroe truncatetambém. Mesmo resultado. O que é absurdo é que a falha não se propague até a camada de aplicação. Os programas mkfs saem com 0, mas o sistema de arquivos de saída é basicamente mutilado. Provavelmente tem algo a ver com io em buffer/atrasado.

Não tenho permissão para fazer isso? Ou seria um inseto? Eu provavelmente poderia investigar mais detalhadamente lendo o código do kernel, mas primeiro queria ouvir os especialistas.

Atualizar Ops. Desculpe. Versão do kernel: 5.7.10-201.fc32.x86_64

As mensagens do kernel.

[ 3213.106709] blk_update_request: operation not supported error, dev loop6, sector 16256 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3213.107013] blk_update_request: operation not supported error, dev loop6, sector 196 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3213.108396] blk_update_request: operation not supported error, dev loop6, sector 708 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3213.110006] blk_update_request: operation not supported error, dev loop6, sector 160 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3213.110158] blk_update_request: operation not supported error, dev loop6, sector 166 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3213.110852] blk_update_request: operation not supported error, dev loop6, sector 710 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3223.152191] blk_update_request: operation not supported error, dev loop7, sector 16256 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3223.152619] blk_update_request: operation not supported error, dev loop7, sector 196 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3223.153694] blk_update_request: operation not supported error, dev loop7, sector 708 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3223.155495] blk_update_request: operation not supported error, dev loop7, sector 160 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3223.155670] blk_update_request: operation not supported error, dev loop7, sector 166 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3223.156233] blk_update_request: operation not supported error, dev loop7, sector 710 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3568.666245] blk_update_request: operation not supported error, dev loop6, sector 16256 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3568.666543] blk_update_request: operation not supported error, dev loop6, sector 196 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3568.667546] blk_update_request: operation not supported error, dev loop6, sector 708 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3568.669204] blk_update_request: operation not supported error, dev loop6, sector 160 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3568.669380] blk_update_request: operation not supported error, dev loop6, sector 166 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3568.669974] blk_update_request: operation not supported error, dev loop6, sector 710 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0

Como eu disse, o mkfs deve ser executado com sucesso. O erro é silencioso.

Responder1

Acabei de encontrar o que acredito ser o mesmo problema. Suspeito que você não seja mktemp em si, mas que seu /tmp seja um sistema de arquivos tmpfs. Aparentementetmpfs não suportaFALLOC_FL_ZERO_RANGE. O interessante é que você pode executar mkfs.ext4 em um arquivo em uma montagem tmpfs sem problemas. Mas quando é um dispositivo de loop apoiado por um arquivo no mesmo tmpfs, surgem problemas.

Você deve ser capaz de contornar isso usando a -popção de mktempdefinir TMPDIRum caminho em um sistema de arquivos que suporte intervalo zero (a maioria dos padrões).

informação relacionada