关联block_device结构

本文详细解析了Linux内核中如何关联`block_device`结构,通过`register_disk`函数,介绍了`kobject_add`在`/sys/block`目录下创建设备节点的过程,以及`disk_sysfs_symlinks`如何创建软链接。文章还探讨了`blkdev_get`、`do_open`等函数在打开块设备时的角色,特别是`rescan_partitions`函数如何处理分区信息,最终在`/dev`目录下生成设备文件。
摘要由CSDN通过智能技术生成

1.5.3 关联block_device结构

接下来是register_disk函数,来自fs/partitions/check.c

 

    473 /* Not exported, helper to add_disk(). */

    474 void register_disk(struct gendisk *disk)

    475 {

    476         struct block_device *bdev;

    477         char *s;

    478         int i;

    479         struct hd_struct *p;

    480         int err;

    481

    482         strlcpy(disk->kobj.name,disk->disk_name,KOBJ_NAME_LEN);

    483         /* ewww... some of these buggers have / in name... */

    484         s = strchr(disk->kobj.name, '/');

    485         if (s)

    486                 *s = '!';

    487         if ((err = kobject_add(&disk->kobj)))

    488                 return;

    489         err = disk_sysfs_symlinks(disk);

    490         if (err) {

    491                 kobject_del(&disk->kobj);

    492                 return;

    493         }

    494         disk_sysfs_add_subdirs(disk);

    495

    496         /* No minors to use for partitions */

    497         if (disk->minors == 1)

    498                 goto exit;

    499

    500         /* No such device (e.g., media were just removed) */

    501         if (!get_capacity(disk))

    502                 goto exit;

    503

    504         bdev = bdget_disk(disk, 0);

    505         if (!bdev)

    506                 goto exit;

    507

    508         /* scan partition table, but suppress uevents */

    509         bdev->bd_invalidated = 1;

    510         disk->part_uevent_suppress = 1;

    511         err = blkdev_get(bdev, FMODE_READ, 0);

    512         disk->part_uevent_suppress = 0;

    513         if (err < 0)

    514                 goto exit;

    515         blkdev_put(bdev);

    516

    517 exit:

    518         /* announce disk after possible partitions are already created */

    519         kobject_uevent(&disk->kobj, KOBJ_ADD);

    520

    521         /* announce possible partitions */

    522         for (i = 1; i < disk->minors; i++) {

    523                 p = disk->part[i-1];

    524                 if (!p || !p->nr_sects)

    525                         continue;

    526                 kobject_uevent(&p->kobj, KOBJ_ADD);

    527         }

    528 }

 

首先487行这个kobject_add的作用是很直观的,在Sysfs中为这块磁盘建一个子目录,例如我们为的硬盘建立一个块设备驱动,则会在/sys/block/目录中看到一个sdf,要是把这个调用kobject_add函数这行注释掉,肯定就看不到这个sdf目录。这里有两个问题

 

第一为什么kobject_add这么一调用生成的这个子目录的名字就叫做sdf”,而不叫做别的呢其实在sd_probe中做过这么一件事情,通过精心计算得到disk_name而这个disk_name正是struct gendisk的一个成员这里我们看到482行我们把disk_name给了kobj.name这就是为什么我们调用kobject_add添加一个kobject的时候它的名字就是我们当时的disk_name

 

第二为什么生成的这个子目录是在/sys/block目录下面而不是在别的位置呢还记得在alloc_disk_node中我们申请struct gendisk的情景么kobj_set_kset_s(disk,block_subsys)做的就是让disk对应的kobject从属于block_subsys对应的kobject下面这就是为什么我们现在添加这个kobject的时候它很自然的就会在/sys/block子目录下面建立文件

 

继续走disk_sysfs_symlinks来自fs/partitions/check.c这个函数虽然不短

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值