Ядро 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) суффикс для удаленных файлов.

Попробуйте использовать системный вызов sys_readlink().

Другие вопросы по тегам