Ядро Linux: получите реальный путь за символической ссылкой
Я работаю над некоторыми вещами ядра Linux, и у меня есть фальшивый путь под названием / dev / blah / что бы он ни указывал на /dev/block/real_device
Проблема заключается в том, что lookup_bdev не сможет перейти по символической ссылке, поэтому я хотел бы помассировать путь заранее, получив реальный путь (/dev/block/real_device), чтобы я мог передать его lookup_bdev, чтобы он успешно возвращался вместо ошибки,
Или любой другой вызов ядра, который будет правильно извлекать информацию block_device, указав начальный путь.
Спасибо
2 ответа
Для этого используйте слой 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()
может вернуть странные результаты для специальных файловых систем и добавить (deleted)
суффикс для удаленных файлов.