2015-01-29 1 views
3

Я работаю на некоторых Linux ядра вещи, и у меня есть фальшивый путь под названием/DEV/бла/все, что указывает на/Dev/блок/real_deviceLinux Kernel: Получить реальный путь за линке

Этот вопрос что lookup_bdev не сможет следовать символической ссылке, поэтому я хотел бы массировать путь вверх, получая реальный путь (/ dev/block/real_device), чтобы я мог передать это на lookup_bdev, чтобы он успешно возвращался вместо ошибки.

Или любой другой вызов ядра, который бы корректно извлекал информацию block_device с учетом исходного пути.

Благодаря

+0

Попробуйте realpath() или canonicalize_file_name()? http://www.gnu.org/software/libc/manual/html_node/Symbolic-Links.html. Хотя, если вы работаете в пространстве ядра, то это, вероятно, не поможет. –

ответ

3

Используйте ВФС слой для этого (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) суффикс к удаленным файлам.

+0

Без buf [256] это тоже «works4me»: ptr = path.dentry-> d_name.name – MarcH

0

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