Linux 内核:如何从分区磁盘中获取整个磁盘的 dev_t?
Linux kernel: How to get dev_t of whole disk from partitioned disk?
我想检索整个磁盘的 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
Return: dev_t
: whole_disk
我提出的算法:
- 从
dev_t
获取分区磁盘的路径,即“/dev/nvme1n1p3”。我找不到任何 API 从 dev_t
. 获取路径
- 进行一些字符串操作以删除 "p3",给出整个磁盘的路径
- 将整盘的path_name传给
blk_lookup_devt
得到整盘的dev_t
即 whole_disk=blk_lookup_devt(path_name,0)
这是正确的方法还是有更好的方法?如果是前者,那么如何从 dev_t
?
获取路径
P.S:我需要在设备驱动程序中(即在内核上下文中)实现它。在用户 space 中,我知道我可以使用 udev
API.
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");
}
没问题:可以读取/proc/partitions文件,获取需要的sd[a|b|c]
驱动器 ID。假设,那个id:
字符 devId[] = "sdb"
之后调用 devno = blk_lookup_devt(devId, 0);
我想检索整个磁盘的 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
Return: dev_t
: whole_disk
我提出的算法:
- 从
dev_t
获取分区磁盘的路径,即“/dev/nvme1n1p3”。我找不到任何 API 从dev_t
. 获取路径
- 进行一些字符串操作以删除 "p3",给出整个磁盘的路径
- 将整盘的path_name传给
blk_lookup_devt
得到整盘的dev_t
即whole_disk=blk_lookup_devt(path_name,0)
这是正确的方法还是有更好的方法?如果是前者,那么如何从 dev_t
?
P.S:我需要在设备驱动程序中(即在内核上下文中)实现它。在用户 space 中,我知道我可以使用 udev
API.
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");
}
没问题:可以读取/proc/partitions文件,获取需要的sd[a|b|c] 驱动器 ID。假设,那个id: 字符 devId[] = "sdb" 之后调用 devno = blk_lookup_devt(devId, 0);