免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5756 | 回复: 11
打印 上一主题 下一主题

求助: 怎样在kernel2.6下,获取某个设备的容量大小和sector大小(已结) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-02 13:28 |只看该作者 |倒序浏览
首先,我不是以gendisk和block设备驱动模块方式编写的代码.
其次,filp_open()获取了filp之后,通过filp->f_entry->d_inode获取inode之后,看到内核fs.h中struct inode中有个字段是i_blksize,但是我取这个字段的时候,居然编译说结构中不存在这个字段,何解?这个字段是打开的设备文件大小吗?
还有其他的方法吗?
谢谢啦,各位大侠帮帮忙.

[ 本帖最后由 mwishes 于 2007-7-2 23:48 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-07-02 13:45 |只看该作者
filp->f_dentry->d_inode->i_blksize

怎么不存在?

论坛徽章:
0
3 [报告]
发表于 2007-07-02 13:50 |只看该作者
$ uname -a
Linux localhost.localdomain 2.6.18-1.2798.fc6 #1 SMP Mon Oct 16 14:54:20 EDT 2006 i686 i686 i386 GNU/Linux

我刚才看了,在这个内核版本中,确实不存在那个字段.

有何种方法获取容量大小呢?  2.4中的blksize[][]是肯定不行的,有谁能详解一下inode的结构字段的各个意思吗?还有file结构.
谢谢啦.

论坛徽章:
0
4 [报告]
发表于 2007-07-02 13:51 |只看该作者
sector size呢?怎么获取?

论坛徽章:
0
5 [报告]
发表于 2007-07-02 15:56 |只看该作者
在2.4中, hardsect_size 和 blk_size数组可以提获取 sector大小和容量大小.  但在2.6中, 由于major不在做256限制,因此这个方式不再使用,有没有人能告诉我取代hardsect_size和blk_size的办法是什么?
紧急求助啊~

论坛徽章:
0
6 [报告]
发表于 2007-07-02 17:10 |只看该作者
或者说, 当执行  dd if=/dev/zero of=myfile bs=1M seek=199 count=1 &&   losetup /dev/loop1  myfile
我应该怎么样在2.6的内核模块中获取/dev/loop1的blk_size,  hardsect_size等值?

论坛徽章:
0
7 [报告]
发表于 2007-07-02 22:47 |只看该作者

回复 #1 mwishes 的帖子

size:  i_size_read(file->f_mapping->host);

blocksize:  1 << file->f_mapping->host->i_blkbits

论坛徽章:
0
8 [报告]
发表于 2007-07-02 23:48 |只看该作者
呵呵,感谢楼上兄弟, blocksize只是块的大小,在inode->i_blkbits中就可以获取,不是我需要的容量值啊,或许可以乘上用1<<i_blkbits  *  i_blocks,但是i_blocks永远只为0.  i_size_read等会愿意尝试一下.

不过下班前已经有解决办法了.
2.6内核loop设备是块设备方式的,可以通过filp_open()获取其inode,然后通过inode->i_bdev->bd_disk->capacity获取其以512byte为粒度的容量值,或者说是sector个数,而sector可以在获取inode->i_bdev->bd_disk之后通过blk_queue_hardsect_size方式获取.
这种办法可以让char设备模块mount块设备,模拟block模块进行块操作.我本意就是如此.
还有别的办法可以写下让我学习一下了.thx

论坛徽章:
0
9 [报告]
发表于 2007-07-02 23:57 |只看该作者
7楼的兄弟: 似乎不能获取,
Jul  2 23:53:43 localhost kernel: mquid: Get major: 253
Jul  2 23:53:43 localhost kernel: mquid: Go into mquid_device_init
Jul  2 23:53:43 localhost kernel: mquid: mquid_devicp->name is mquid0,len is 6(
Jul  2 23:53:43 localhost kernel: mquid: mquid_devicp->mount is /dev/loop1,len is 10(12)
Jul  2 23:53:43 localhost kernel: mquid: Go into mquid_setup_cdev
Jul  2 23:55:02 localhost kernel: mquid: Go into mquid_open
Jul  2 23:55:02 localhost kernel: mquid: Device mquid0 first initialize
Jul  2 23:55:02 localhost kernel: mquid: Mounted /dev/loop1 when first initialize
Jul  2 23:55:02 localhost kernel: mquid: I_bloks 204800,major 7,minor 1
Jul  2 23:55:02 localhost kernel: mquid: I_bloks again 0

代码:
                mquid_devicp->dev_filp = filp_open(mquid_devicp->dev_mount,O_RDWR,0666);
               
                if(!mquid_devicp->dev_filp || !mquid_devicp->dev_filp->f_dentry || !mquid_devicp->dev_filp->f_dentry->d_inode)
                {
                        DEBUG_PRINTK(KERN_ALERT "mquid: Mount %s failed,maybe perm deny\n",mquid_devicp->dev_mount);
                        return -EPERM;
                }
               
                mquid_devicp->dev_inode = mquid_devicp->dev_filp->f_dentry->d_inode;
                mquid_devicp->dev_mount_major = imajor(mquid_devicp->dev_inode);
                mquid_devicp->dev_mount_minor = iminor(mquid_devicp->dev_inode);
               
                DEBUG_PRINTK(KERN_WARNING "mquid: I_bloks %lld,major %u,minor %u\n",mquid_devicp->dev_inode->i_bdev->bd_disk->capacity,
                                                mquid_devicp->dev_mount_major,mquid_devicp->dev_mount_minor);
                DEBUG_PRINTK(KERN_WARNING "mquid: I_bloks again %lld\n",i_size_read(filp->f_mapping->host));

论坛徽章:
0
10 [报告]
发表于 2007-07-03 01:45 |只看该作者

回复 #9 mwishes 的帖子

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/err.h>
#include <asm/uaccess.h>

#define BDEV_NAME "/dev/hda"

static int read_init(void)
{
        struct file *filp = filp_open(BDEV_NAME, O_RDWR, 0);
        if (IS_ERR(filp))
                return -1;

        printk(KERN_INFO"%lld\n", i_size_read(filp->f_mapping->host));
        filp_close(filp, NULL);
        return -1;
}

static void read_exit(void) { }

module_init(read_init);
module_exit(read_exit);
MODULE_LICENSE("GPL");

我怎么可以得到正确的结果呢, 将BDEV_NAME换成一个loop device也一样. 你是不是用非常规的方法设置的loop device.

[ 本帖最后由 daemeon 于 2007-7-3 02:07 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP