BTRFS como obter o ID do dispositivo real

0

Estou monitorando eventos de operações de arquivos (VFS).
Eu tenho um problema com o sistema de arquivos BTRFS, BTRFS está usando subvolumes, Todos os diretórios de hierarquia mais altos em btrfs tem o mesmo inode (256/512).

História curta:
Quando recebo um evento de operação de arquivo, recebo o caminho e, em seguida, o resolvo para inode.
Ao resolver quero dizer: dado um caminho, eu recebo seu dentry (user_path () chamada), do dentry eu puxo: dEntry- > d_inode- > i_ino
O problema é que recebo o mesmo inode para diretórios diferentes no mesmo dispositivo.
Eu acho que o BTRFS tem algum tipo de camada de abstração, que cria um número de inode "virtual" (os idênticos são virtuais) - não há como dois inodes idênticos no mesmo ID de dispositivo.

Prova de problema com o ID do dispositivo:

Do kernel recebo o ID do dispositivo 29:

Código: resolução do ID do dispositivo: para um determinado caminho (/ home) - > Obtenha o dentry com user_path, depois dEntry- > d_inode- > i_sb- > s_dev OU eu executo o comando:

"grep btrfs /proc/self/mountinfo | less"

saída:

/proc/self/mountinfo return inode 29 also: 34 18 0:29 /home /home rw,noatime,nodiratime shared:19 - btrfs /dev/md127 rw,nospace_cache,subvolid=257,subvol=/home

Do espaço do usuário, recebo o ID do dispositivo 33:

root@nas-B9-43-AA:/# stat /home
  File: '/home'
  Size: 90              Blocks: 0          IO Block: 4096   directory
Device: 21h/33d Inode: 256         Links: 1

root@nas-B9-43-AA:/# mountpoint -d /home
0:33

Então eu recebo 29 e 33 como identificação de dispositivo.
Vamos chamar id de dispositivo 29 "id real" "e 33 é" id virtual ".
Existe uma maneira de obter o id real do código do kernel?
Eu estou procurando por substituição para dEntry- > d_inode- > i_sb- > s_dev .. para obter o mesmo id que recebemos do modo de usuário.

Eu estou no Debian 7

    
por ilansch 15.02.2017 / 15:53

1 resposta

0

Em vez de ir ao dentry - inode - superblock - id do dispositivo.
Eu recebo o ID do dispositivo usando o getattr (..) no dentry.

Minha solução é tirada do patch Suse no assunto (depois de muita digitação no google).

link

    
por 16.02.2017 / 13:57