Linux 内核:获取符号链接背后的真实路径
Linux Kernel: Get real path behind a symlink
我正在研究一些 linux 内核的东西,我有一个名为 /dev/blah/whatever 的假路径指向 /dev/block/real_device
问题是 lookup_bdev 将无法遵循符号链接,所以我想通过获取真实路径 (/dev/block/real_device) 来预先修改路径,这样我就可以将其交给 lookup_bdev 所以它 returns 成功而不是错误。
或任何其他可以在给定初始路径的情况下正确检索 block_device 信息的内核调用。
谢谢
为此使用 VFS 层(特别是 dcache/nameidata)。
#include <linux/namei.h>
#include <linux/dcache.h>
...
struct path path;
char buf[256];
char* ptr;
int err = kern_path("/dev/disk/by-id/dm-name-lkdevel-root",
LOOKUP_FOLLOW, &path);
if(!err) {
ptr = d_path(&path, buf, 256);
if(!IS_ERR(ptr)) {
/* ptr contains real path */
}
}
这是在原版 Linux 3.12
上测试的
请注意,d_path()
可能会 return 特殊文件系统的奇怪结果,并将 (deleted)
后缀附加到已删除的文件。
尝试使用sys_readlink()系统调用。
我正在研究一些 linux 内核的东西,我有一个名为 /dev/blah/whatever 的假路径指向 /dev/block/real_device
问题是 lookup_bdev 将无法遵循符号链接,所以我想通过获取真实路径 (/dev/block/real_device) 来预先修改路径,这样我就可以将其交给 lookup_bdev 所以它 returns 成功而不是错误。
或任何其他可以在给定初始路径的情况下正确检索 block_device 信息的内核调用。
谢谢
为此使用 VFS 层(特别是 dcache/nameidata)。
#include <linux/namei.h>
#include <linux/dcache.h>
...
struct path path;
char buf[256];
char* ptr;
int err = kern_path("/dev/disk/by-id/dm-name-lkdevel-root",
LOOKUP_FOLLOW, &path);
if(!err) {
ptr = d_path(&path, buf, 256);
if(!IS_ERR(ptr)) {
/* ptr contains real path */
}
}
这是在原版 Linux 3.12
上测试的请注意,d_path()
可能会 return 特殊文件系统的奇怪结果,并将 (deleted)
后缀附加到已删除的文件。
尝试使用sys_readlink()系统调用。