1

鉴于磁盘上的分区,我想检索dev_t整个磁盘的结构。这是给blkext司机的,比如nvme.

就像是:

dev_t part_disk;
dev_t whole_disk = get_whole_disk_dev_t(part_disk);

我希望我的界面get_whole_disk_dev_t()是:

参数dev_t::part_disk
返回dev_t::whole_disk

我提出的算法:

  1. dev_t从即“/dev/nvme1n1p3”获取分区磁盘的路径。我找不到任何 API 来获取路径dev_t
  2. 做一些字符串操作来删除“p3”,给出整个磁盘的路径
  3. 传递整个磁盘的 path_nameblk_lookup_devt以获取整个磁盘的路径dev_t
    IEwhole_disk=blk_lookup_devt(path_name,0)

这是正确的方法还是有更好的方法?如果是前者,那么我该如何获取路径dev_t

PS:我需要在设备驱动程序中实现它(即在内核上下文中)。在用户空间中,我知道我可以使用udevAPI。

4

2 回答 2

1
static int hello_init(void)

{

dev_t devno;

struct block_device *bddev;

struct gendisk *bddisk;

char disk_major[32];

devno=MKDEV(252,67);

printk(KERN_ALERT "Hello, world .... current devno is %x \n", devno);

bddev=bdget(devno);

if(bddev) {

    bddisk=bddev->bd_disk;

    if(bddisk) {

         strcpy(disk_major,bddisk->disk_name);

         printk(KERN_ALERT "bddisk is present %s", disk_major);

     } else {

       printk(KERN_ALERT "bddisk is not present");

    }

} else {

printk(KERN_ALERT "bdev failed ");

}

devno = blk_lookup_devt(disk_major,0);
printk(KERN_ALERT "after blk_lookup_dev:  dev_t: 0x%x  Major No %d   Minor No %d \n", devno, MAJOR(devno), MINOR(devno));

return 0;

}


static void hello_exit(void)
{

printk(KERN_ALERT "Goodbye, world\n");

}
于 2015-12-01T04:58:11.670 回答
0

这不是问题:您可以读取 /proc/partitions 文件,获取所需的 sd[a|b|c] 驱动器 ID。假设 id: char devId[] = "sdb" 之后调用 devno = blk_lookup_devt(devId, 0);

于 2017-11-15T13:16:37.293 回答