2016-09-14 12 views
2

Моя тестовая программа вызывает stat(2), чтобы получить устройство, на котором находится файл.Вызов Linux stat (2) дает несуществующий идентификатор устройства

stat.c (построен 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 

... Но нет такого устройства в моей системе и /home является 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 

Почему получить идентификатор устройства, который es не существует в моей системе?

+2

ли вы проверить, что 'stat' возвращается? Он не возвращается с ошибкой ('-1')? –

+0

@JoachimPileborg ... это скорее всего ... – tofro

+0

Да, я это сделал. Это просто отрывок из реальной программы. – smoku

ответ

0

stat(2) в fs/stat.c использует inode->i_sb->s_dev для заполнения stat.st_dev

/proc/self/mountinfo в fs/proc_namespace.c использует mnt->mnt_sb->s_dev

Видимо struct inode. i_sb суперблока может отличаться от struct vfsmount. mnt_sb суперблока в случае крепления btrfs subvolume.

Это проблема присущая реализации Btrfs, которая «требует нетривиальных изменений в слое VFS» исправить: https://mail-archive.com/[email protected]/msg57667.html

+0

" * kernel bug * "- Возможно, это так, но если бы это был я, я бы не стал особенно полагаться на номера устройств, испускаемые такими файловыми системами, как btrfs, которые имеют такую ​​полную абстракцию между физическими устройствами и уровнем VFS. Я бы не удивился, если бы у ZFS были подобные эффекты. – Dolda2000

+0

У меня может быть патч уже ... ;-) Если бы только восстановление ядра Fedora не занимало бы часов ... :-( – smoku

 Смежные вопросы

  • Нет связанных вопросов^_^