Eu tenho uma montagem NFS servida de um servidor Linux para um cliente FreeBSD. Se eu usar touch
para definir o atime e o mtime de um arquivo no cliente FreeBSD,
tavianator@muon $ touch -at "199112140000" ./foo
tavianator@muon $ touch -mt "199112150000" ./foo
em seguida, imprima os tempos estatísticos,
tavianator@muon $ stat -f $'Access: %Sa\nModify: %Sm\nChange: %Sc\n Birth: %SB' ./foo
Access: Dec 14 00:00:00 1991
Modify: Jun 22 16:44:08 2023
Change: Dec 15 00:00:00 1991
Birth: Jun 22 16:45:56 2023
o ctime e o mtime estão trocados! No entanto, a visualização do servidor Linux está correta:
tavianator@tachyon $ stat /srv/nfs/freebsd/usr/home/tavianator/foo
File: /srv/nfs/freebsd/usr/home/tavianator/foo
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 0,33 Inode: 54691999 Links: 1
Access: (0640/-rw-r-----) Uid: ( 1000/tavianator) Gid: ( 1000/tavianator)
Access: 1991-12-14 00:00:00.000000000 -0500
Modify: 1991-12-15 00:00:00.000000000 -0500
Change: 2023-06-22 16:45:56.731038486 -0400
Birth: 2023-06-22 16:44:08.075496568 -0400
Alguma ideia do que poderia causar isso, ou como corrigi-lo? Mais algumas informações que podem ser úteis:
root@tachyon ~ # uname -a
Linux tachyon 6.3.8-arch1-1 #1 SMP PREEMPT_DYNAMIC Wed, 14 Jun 2023 20:10:31 +0000 x86_64 GNU/Linux
root@tachyon ~ # findmnt -T /srv/nfs/freebsd/usr/home/tavianator
TARGET
SOURCE FSTYPE OPTIONS
/ /dev/mapper/cryptslash1[/@] btrfs rw,relatime,ssd,discard=async,space_cache=v2,subvolid=261,subvol=/@
root@tachyon ~ # exportfs -v
/srv/nfs 100.101.179.2/32(sync,wdelay,hide,no_subtree_check,fsid=0,sec=sys,rw,secure,no_root_squash,no_all_squash)
/srv/nfs 100.114.24.115/32(sync,wdelay,hide,no_subtree_check,fsid=0,sec=sys,rw,secure,no_root_squash,no_all_squash)
/srv/nfs/freebsd
100.101.179.2/32(sync,wdelay,nohide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/srv/nfs/freebsd
100.114.24.115/32(sync,wdelay,nohide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
tavianator@muon $ uname -a
FreeBSD muon 13.2-RELEASE FreeBSD 13.2-RELEASE releng/13.2-n254617-525ecfdad597 GENERIC amd64
tavianator@muon $ mount | grep nfs,
100.107.249.85:/freebsd/usr/home/tavianator on /usr/home/tavianator (nfs, nfsv4acls)
Olhando para uma captura de pacote no Wireshark, parece que este é um bug no servidor Linux, não no cliente FreeBSD.
Acredito que seja um bug no kernel Linux commit e377a3e698fb , incluído pela primeira vez na versão 5.18. Esse commit adiciona suporte para relatar
TIME_CREATE
a hora do nascimento. Após esse commit, o código que grava os carimbos de data/hora do arquivo fica assim:Acredito que a maneira como o protocolo funciona é que os tempos são escritos em uma ordem que deve corresponder ao
bmval1
bitmask. Nesse caso, a ordem seria[ACCESS, METADATA, MODIFY, CREATE]
. No entanto, vamos ver os valores reais do sinalizador de bit :Portanto, a ordem em que devem ser escritos é
[ACCESS, CREATE, METADATA, MODIFY]
. Isso bate com o que estou vendo: