Несмотря на тот же ввод и логи c, вывод d_path отличается - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь получить путь к файлу из 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...