Я пытаюсь получить путь к файлу из dentry на ядре linux. Но есть странная проблема. Пожалуйста, проверьте case2.
Код:
#if 0 // header reference
struct vfsmount {
struct dentry *mnt_root; /* root of the mounted tree */
struct super_block *mnt_sb; /* pointer to superblock */
int mnt_flags;
};
struct path {
struct vfsmount *mnt;
struct dentry *dentry;
};
#endif
char *get_path_from_mntdentry(struct vfsmount *mnt, struct dentry *dentry)
{
struct path mnt_path;
[snip]
// case1: use nmt directly
mnt_path.mnt = mnt;
mnt_path.dentry = dentry;
path = d_path(&mnt_path, buf, PAGE_SIZE);
if (IS_ERR(path)) {
kfree(buf);
return PTR_ERR(path);
}
printk("case1: dentry=0x%x sb=0x%x flag=0x%x path=(%s)\n",
mnt_path.mnt->mnt_root, mnt_path.mnt->mnt_sb, mnt_path.mnt->mnt_flags, path);
// case2: copy mnt to xxx and use it indirectly
struct vfsmount xxx;
xxx.mnt_root = mnt->mnt_root;
xxx.mnt_sb = mnt->mnt_sb;
xxx.mnt_flags = mnt->mnt_flags;
mnt_path.mnt = &xxx;
mnt_path.dentry = dentry;
path = d_path(&mnt_path, buf, PAGE_SIZE);
if (IS_ERR(path)) {
kfree(buf);
return PTR_ERR(path);
}
printk("case2: dentry=0x%x sb=0x%x flag=0x%x path=(%s)\n",
mnt_path.mnt->mnt_root, mnt_path.mnt->mnt_sb, mnt_path.mnt->mnt_flags, path);
[snip]
}
Вывод:
case1: dentry=0x745809c0 sb=0x75b27000 flag=0x1020 path=(/test1/file1)
case2: dentry=0x745809c0 sb=0x75b27000 flag=0x1020 path=(/)
Несмотря на одинаковые входные данные и одинаковые логи c Я думаю, что есть другой результат "дорожка". Case1 это "/ test1 / file1", а Case2 это "/". Есть ли проблемы на case2?