Linux Kernel 5.3
Considere o fstat
syscall definido como int fstat(int fd, struct stat *statbuf);
. O acesso ao disco é necessário para o fstat
syscall no ext4?
Eu fiz algumas pesquisas relacionadas a ele e descobri algumas informações. O ponto de entrada no kernel para a chamada do sistema é a função vfs_statx_fd
. Veja como fica sua implementação:
int vfs_statx_fd(unsigned int fd, struct kstat *stat,
u32 request_mask, unsigned int query_flags)
{
struct fd f;
int error = -EBADF;
if (query_flags & ~KSTAT_QUERY_FLAGS)
return -EINVAL;
f = fdget_raw(fd);
if (f.file) {
error = vfs_getattr(&f.file->f_path, stat,
request_mask, query_flags);
fdput(f);
}
return error;
}
Então, o que temos aqui é que o unsigned int fd
descritor de arquivo real que um usuário passou para a chamada do sistema é usado para encontrar um ponteiro para o arquivo struct file
. A parte crucial de sua definição é
struct file {
//...
struct path f_path;
struct inode *f_inode; /* cached value */
//...
}
Então, basicamente, temos que struct file
representa um arquivo aberto e o struct contém referências dentry
einode
É verdade que, caso tenhamos um descritor de arquivo aberto, podemos obter todas as estatísticas apenas da memória, evitando o dispendioso acesso ao disco?
Atualização : Tentei liberar os caches do Kernel free && sync && echo 3 > /proc/sys/vm/drop_caches && free
antes de invocar o syscall
e isso não afetou o tempo do stat syscall. Então, eu tendo a pensar que nenhum acesso ao disco é necessário.
Em um sistema de arquivos Ext4, o gráfico de função a partir de
vfs_statx_fd
éObservar as implementações de todas essas funções mostra que não há provisão para E/S de disco. Como você supõe, os dados vêm do inode em cache.
Veja também a página de
fstat(2)
manual que menciona que:(embora isso tenha mais a ver com bloqueio do que com cache).
Com alguns outros sistemas de arquivos,
AT_STATX_FORCE_SYNC
podem ser incluídos nos sinalizadores de consulta para forçar uma sincronização remota; isso é suportado em pastas compartilhadas de convidados Ceph, FUSE, NFS e VirtualBox.