【问题标题】:Linux kernel vfs_stat function does not return device id of the fileLinux内核vfs_stat函数不返回文件的设备id
【发布时间】:2015-06-26 22:57:24
【问题描述】:

我正在尝试在内核模式下获取文件的设备号。我要查找的设备 ID 是 stat 附带的:

大小:1024 块:2 IO 块:1024 目录 设备:700h/1792d 索引节点:2 链接:3 访问:(0755/drwxr-xr-x) Uid:(0/root) Gid:(0/root) 上下文:system_u:object_r:unlabeled_t:s0

我使用 vfs_stat 编写了代码,但没有得到相同的数字

struct kstat sb;
int error = 0;
sb.rdev = 0;
error = vfs_fstat(fd, &sb);
if (error) {
    monks_error("Could not get vfs stat %d", error);
}
if (sb.mode == 0060000) {
    monks_info("The device number is %d", MINOR(sb.dev));
}
return  sb.dev;

不知道这里出了什么问题?

【问题讨论】:

  • 请提供更多信息。你得到了什么错误代码,或者你得到了什么数字,与预期的不一样。
  • 我得到的错误代码是-9。任何线索为什么会这样?我在内核中
  • 错误代码 -9 是 -EBADF。您可能有无效的文件描述符 (fd)。
  • 谢谢 .... 我能够从 inode 结构中提取设备 ID,kdev_t 存在于文件系统的超级块中。我可以从中获得次要号码,但不知何故,主要号码并没有好起来。有什么建议在这里使用什么宏吗?我正在使用 MINOR & MAJOR 文件->f_inode->i_sb->s_dev
  • 使用MINORMAJOR 应该没问题。可能是,返回的主编号是可以的,但你的期望是错误的?在任何情况下,都需要具体示例(当主编号不正确时)以进行进一步调试。

标签: linux linux-kernel linux-device-driver


【解决方案1】:

好吧,代码示例不足以给出有意义的答案。即使 vfs_fstat 失败,您也在检查 sb.mode,更糟糕的是,您无条件返回 sb.dev。

然而,开始挖掘的明显地方是 stat 系统调用,以查看它是否对从 vfs_fstat 获得的内容执行任何操作。正如在 cp_new_stat 中看到的那样,它确实如此: tmp.st_dev = encode_dev(stat->dev);

【讨论】:

  • 我得到的错误代码是-9。任何线索为什么会这样?我在内核中
猜你喜欢
  • 1970-01-01
  • 2021-08-02
  • 2022-08-07
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
相关资源
最近更新 更多