4

私はいくつかの Linux カーネルに取り組んでおり、/dev/blah/whatever という偽のパスがあり、それが /dev/block/real_device を指しています。

問題は、lookup_bdev がシンボリック リンクをたどることができないため、実際のパス (/dev/block/real_device) を取得して事前にパスをマッサージしたいので、それを lookup_bdev に渡して、エラーではなく正常に返されるようにすることです。 .

または、指定された初期パスで block_device 情報を正しく取得するその他のカーネル呼び出し。

ありがとう

4

2 に答える 2

4

これには 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)、削除されたファイルにサフィックスを追加する可能性があることに注意してください。

于 2015-01-29T20:47:21.183 に答える
0

sys_readlink() システム コールを使用してみてください。

于 2015-01-30T17:19:41.527 に答える