URN Logo
UNIX Resources » Linux » China Linux Forum » Linux内核技术 » 18 » 获得mounts相关的信息
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  TI专版
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
获得mounts相关的信息
获得mounts相关的信息 - bychgcc [2007-11-18 21:30 | 1,099 byte(s)]
 
Re: 获得mounts相关的信息 - bychgcc [2007-11-19 15:01 | 3,257 byte(s)]
 
Re: 获得mounts相关的信息 - bychgcc [2007-11-19 15:15 | 1,221 byte(s)]
 
Subject: 获得mounts相关的信息
Author: bychgcc    Posted: 2007-11-18 21:30    Length: 1,099 byte(s)
[Original] [Print] [Top]
我在做一个小练习要求:在字符驱动中获得mounts相关的信息,
例如:在shell $mounts 后看到的信息一致,

现在我的方法是:通过
(1)filp = file_open("/",__, __);
(2)struct vfsmount *tmp_vfs_mnt = filp->mnt_vfsmnt;
(3)
struct list_head *list = container_of(tmp_vsf_mnt, struct vsfmount, mnt_);
list_for_each(p_list,list){
spin_lock(&vfsmnt_lock);
tmp_vfs_mnt = list_enter(p_list, struct vfsmount, root);
prink(KERNEL_ERR"device_name: %s ", tmp_vfs_mnt->mnt_devname);
//get dev name(just test)
//获得设备名 没有问题
//但是 如何获得挂载点 ,文件类型 , 读写权限都有问题?
//我 主要 是 参考内核源代码中的 namespace.c 文件中的 获得 mounts信息 的方法

spin_unlock(&vfsmnt_lock);
}



///////////////////////////////////////////////////////
希望大家给我思路,,
或者谁有其它的 获得mounts信息的方法,还请各位赐教,,呵呵
----
没有翅膀不是天使
[Original] [Print] [Top]
Subject: Re: 获得mounts相关的信息
Author: bychgcc    Posted: 2007-11-19 15:01    Length: 3,257 byte(s)
[Original] [Print] [Top]
/* =====================================================================================
*
* Filename: do_mo_info.c
*
* Description:
*
* Version: 1.0
* Created: 2007年11月15日 16时58分34秒 CST
* Revision: none
* Compiler: gcc
*
* Author: bych, bychgcc@126.com
* Company:
*
* =====================================================================================
*/
#include "mo_info_hdr.h"

#include <linux/spinlock.h>
#include <linux/mount.h>

spinlock_t vfsmnt_lock = SPIN_LOCK_UNLOCKED;

int once_get_mo_info(struct list_head *v);
/*
*get root file's struct file
* */
inline struct file* get_root_filp(void)
{
struct file *filp = filp_open("/", O_RDONLY, S_IRUSR|S_IWUSR);
return (IS_ERR(filp))? NULL : filp;
}

/*
*get root's vfsmount
* */
inline struct vfsmount* get_root_vfsmnt(void)
{
struct vfsmount *root_vfsmnt;
struct file *tmp_filp;
if((tmp_filp = get_root_filp()) == NULL){
printk(KERN_ERR"[ get_root_filp ] error! ");
return NULL;
}

return (IS_ERR(root_vfsmnt = tmp_filp->f_vfsmnt))? NULL : root_vfsmnt;
}

/*
*get next vfsmount
* */
struct vfsmount *next_mnt(struct vfsmount *p, struct vfsmount *root)
{
struct list_head *next = p->mnt_mounts.next;
if(next == &p->mnt_mounts){
while(1){
if(p == root)
return NULL;
next = p->mnt_child.next;
if(next != &p->mnt_parent->mnt_mounts)
break;
p = p->mnt_parent;
}
}
return list_entry(next, struct vfsmount, mnt_child);
}

/*
*for each vfsmount, and then get mounts' infomations
* */
int get_mounts_info(void)
{
struct vfsmount *p_vfsmnt,*root_vfsmnt;
unsigned long flags;

root_vfsmnt = get_root_vfsmnt();

spin_lock_irqsave(&vfsmnt_lock, flags);
/*
*testing mounts' infomations
* */
for(p_vfsmnt = root_vfsmnt; p_vfsmnt; p_vfsmnt = next_mnt(p_vfsmnt, root_vfsmnt)){
printk(KERN_ERR"%s on", (p_vfsmnt->mnt_devname ? p_vfsmnt->mnt_devname : "none"));
printk(" type %s", p_vfsmnt->mnt_sb->s_type->name);
printk(" (%s) ", p_vfsmnt->mnt_sb->s_flags & MS_RDONLY? "ro": "rw");
}
spin_unlock_irqrestore(&vfsmnt_lock, flags);

return 0;
}
----
没有翅膀不是天使
[Original] [Print] [Top]
Subject: Re: 获得mounts相关的信息
Author: bychgcc    Posted: 2007-11-19 15:15    Length: 1,221 byte(s)
[Original] [Print] [Top]
第一种方法:

获得的next_mounts (vfsmounts)结构体后,如果再想进一步获得文件类型,权限,挂载点等相关信息就难得的多,,
我想可能是锁的问题,因为我拿不到superblock(-->strutc file_system_type{};结构体)锁,以至我无法读取文件类型等信息
虽然第一种方法 可以正常获得 ”设备名“
但是 第一种方法 目前对我来说 ,,还是不 能够 获得我所需要的mounts信息,,

============================================
第二种方法 :

我是参考内核代码fs/namesapce.c 文件中的
struct vfsmount *next_mnt(struct vfsmount *p, struct vfsmount *root)
{}
这个函数,主要是获得下一个 vfsmount的结构体指针,,

============================================
通过 实验 ,,第二种方法 我可以正确获得 设备名 , 文件类型, 权限,(挂载点暂时还没有获得)

但是 后来 我 又想到 两种方法都是 获得 vfsmount的结构体指针,然后就是通过这个vfsmount的指针来进一步获得mounts相关的信息的,至于是锁的原因引起的第一种方法不正确的假设我现在也在怀疑,,
还请大牛们指点一二,,,,,
----
没有翅膀不是天使
[Original] [Print] [Top]
« Previous thread
PCI DMA 操作中的 pci_map_sg()
Linux内核技术
18
Next thread »
web2.0前途在哪里——30家VC寻找2.0项目!!
     

Copyright © 2007~2009 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
webmaster: webmaster@unixresources.net
This page created on 2009-09-07 16:26:33, cost 0.0332570075989 ms.