Linux stat(2) 调用给出了不存在的设备 ID

Linux stat(2) call gives non-existing device ID

我的测试程序正在调用 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;
}

得到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

但是...我的系统中没有这样的设备 /home0: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

为什么我得到的设备 ID 在我的系统中不存在?

fs/stat.c中的

stat(2)inode->i_sb->s_dev填充stat.st_dev

/proc/self/mountinfofs/proc_namespace.c 中使用 mnt->mnt_sb->s_dev

显然 struct inode.i_sb 超级块可能与 struct vfsmount.mnt_sb 超级块不同 btrfs 子卷挂载 ].

这是 btrfs 实现固有的问题,"requires non-trivial changes in the VFS layer" 需要解决:https://mail-archive.com/linux-btrfs@vger.kernel.org/msg57667.html