vfsmountの検証


Rev.1を表示中。最新版はこちら

vfsmount構造体のパスリンクに掛かる情報は以下のとうりで、実際この内容を検証してみました。
struct vfsmount {
       struct dentry *mnt_root;        /* root of the mounted tree */
  :
};

struct mount {
       struct mount *mnt_parent;
       struct dentry *mnt_mountpoint;
       struct vfsmount mnt;
       const char *mnt_devname;    
   :
};
/tmp/hoge0に/dev/loop0をマウントし、/tmp/hoge0/hoge1に/dev/loop1をマウントした状態の/dev/loop1のvfsmount構造体の内容です。
[root@localhost lkm]# mount
/home/kitamura/lkm/disk/disk0 on /tmp/hoge0 type ext2
/home/kitamura/lkm/disk/disk1 on /tmp/hoge0/hoge1 type ext2

#include <linux/kernel.h>
#include <linux/namei.h>
#include <linux/mnt_namespace.h>
#include <linux/mount.h>

struct mount {
       struct list_head mnt_hash;
       struct mount *mnt_parent;
       struct dentry *mnt_mountpoint;
       struct vfsmount mnt;

       int mnt_count;
       int mnt_writers;

       struct list_head mnt_mounts;    /* list of children, anchored here */
       struct list_head mnt_child;     /* and going through their mnt_child */
       struct list_head mnt_instance;  /* mount instance on sb->s_mounts */
       const char *mnt_devname;        /* Name of device e.g. /dev/dsk/hda1 */
       struct list_head mnt_list;
       struct list_head mnt_expire;    /* link in fs-specific expiry list */
       struct list_head mnt_share;     /* circular list of shared mounts */
       struct list_head mnt_slave_list;/* list of slave mounts */
       struct list_head mnt_slave;     /* slave list entry */
       struct mount *mnt_master;       /* slave is on master->mnt_slave_list */
       struct mnt_namespace *mnt_ns;   /* containing namespace */

       int mnt_id;                     /* mount identifier */
       int mnt_group_id;               /* peer group identifier */
       int mnt_expiry_mark;            /* true if marked for expiry */
       int mnt_pinned;
       int mnt_ghosts;
};
static inline struct mount *real_mount(struct vfsmount *mnt)
{
       return container_of(mnt, struct mount, mnt);
}

void get_mntinfo(char *pathname)
{
       struct path path;
       struct mount *r_mnt;
       int     err;

       printk("path:%s\n", pathname);
       err = kern_path(pathname, LOOKUP_FOLLOW|LOOKUP_AUTOMOUNT, &path);
       if (err) {
               printk("err\n");
       }
       else {
               r_mnt = real_mount(path.mnt);
               printk("devname:%s\n",r_mnt->mnt_devname);
               printk("root:%s\n", path.mnt->mnt_root->d_name.name);
               printk("parent:%s\n",r_mnt->mnt_parent->mnt_devname);
               printk("mountpoint:%s\n",r_mnt->mnt_mountpoint->d_name.name);
               path_put(&path);
       }
}

int init_module(void)
{
       get_mntinfo("/tmp/hoge0/hoge1");
   return 0;
}

void cleanup_module(void)
{
}
期待通りの結果となりました。
[root@localhost lkm]# dmesg
  :
[ 9876.577790] path:/tmp/hoge0/hoge1
[ 9876.577817] devname:/dev/loop1
[ 9876.577823] root:/               <- /dev/loop1の/がマウントされていると言う意味です。
[ 9876.577827] parent:/dev/loop0
[ 9876.577963] mountpoint:hoge1

最終更新 2013/06/29 19:08:25 - north
(2013/06/29 19:08:25 作成)


検索

アクセス数
3704426
最近のコメント
コアダンプファイル - sakaia
list_head構造体 - yocto_no_yomikata
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
Adsense
広告情報が設定されていません。