2016-09-14 1 views
2

Mon programme de test appelle le stat(2) pour obtenir un périphérique sur lequel réside le fichier.L'appel Linux stat (2) donne un ID de périphérique inexistant

stat.c (construit avec cc stat.c -o stat)

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <sys/sysmacros.h> 
#include <errno.h> 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char *path = "/home/smoku/test.txt"; 
    unsigned int maj, min; 
    struct stat sb; 
    if (stat(path, &sb) < 0) { 
     fprintf(stderr, "Error getting stat for '%s': %d %s\n", path, errno, strerror(errno)); 
     return 1; 
    } 
    maj = major(sb.st_dev); 
    min = minor(sb.st_dev); 
    fprintf(stderr, "Found '%s' => %u:%u\n", path, maj, min); 
    return 0; 
} 

Got 0:44

$ ls -l /home/smoku/test.txt 
-rw-r--r-- 1 smoku smoku 306 08-30 09:33 /home/smoku/test.txt 

$ ./stat 
Found '/home/smoku/test.txt' => 0:44 

$ /usr/bin/stat -c "%d" /home/smoku/test.txt 
44 

Mais ... il n'y a pas un tel dispositif dans mon système et /home est 0:35

$ grep /home /proc/self/mountinfo 
75 59 0:35 /home /home rw,relatime shared:30 - btrfs /dev/bcache0 rw,ssd,space_cache,subvolid=258,subvol=/home 

Pourquoi est-ce que je reçois un ID d'appareil qui fait n'existe pas dans mon système?

+2

-vous vérifier ce que les retours 'stat'? Il ne retourne pas avec une erreur ('-1')? –

+0

@JoachimPileborg ... il le fait probablement ... – tofro

+0

Oui, je l'ai fait. Ceci est juste un extrait du vrai programme. – smoku

Répondre

0

stat(2) en fs/stat.c utilise inode->i_sb->s_dev pour remplir stat.st_dev

/proc/self/mountinfo dans fs/proc_namespace.c utilise mnt->mnt_sb->s_dev

Apparemment struct inode. i_sb Le superbloc peut être différent de struct vfsmount. mnt_sb superbloc en cas de montage de soustracteur btrfs.

Ceci est un problème inhérent à la mise en œuvre de Btrfs, qui « exige des changements non négligeables dans la couche VFS » pour fixer: https://mail-archive.com/[email protected]/msg57667.html

+0

" * bug du noyau * "- - Peut-être que oui, mais si c'était moi, je ne compterais pas particulièrement sur les numéros de périphériques émis par de tels systèmes de fichiers comme btrfs qui ont une abstraction aussi complète entre les périphériques physiques et la couche VFS. Je ne serais pas surpris si ZFS avait des effets similaires. – Dolda2000

+0

Je pourrais déjà avoir un patch ... ;-) Si seulement reconstruire le noyau Fedora ne prendrait pas des heures ... :-( – smoku