免费注册 查看新帖 |

Chinaunix

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

[文件系统] blkdev_open 问题!!!!!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-14 13:31 |只看该作者 |倒序浏览
38kernel。假设我们第一次open  /dev/sda  主块设备文件。
blkdev_open-》blkdev_get-》__blkdev_get
ret = -ENXIO;
        disk = get_gendisk(bdev->bd_dev, &partno); //获取gendisk,一起分区号,partno=0
        if (!disk)
                goto out;

        mutex_lock_nested(&bdev->bd_mutex, for_part);
        if (!bdev->bd_openers) {    //第一次open,bd_openers=0
                bdev->bd_disk = disk;
                bdev->bd_contains = bdev;
                if (!partno) {  //partno=0,主设备文件
                        struct backing_dev_info *bdi;

                        ret = -ENXIO;
                        //主设备描述符的bd_part=null
                        bdev->bd_part = disk_get_part(disk, partno);
                        //直接跳出去了。。。。????。。。。后面的open什么没机会执行了。。。。
                        if (!bdev->bd_part)
                                goto out_clear;
                        //?????????????????这里什么时候执行
                        if (disk->fops->open) {
                                ret = disk->fops->open(bdev, mode);
                                if (ret == -ERESTARTSYS) {
                                        /* Lost a race with 'disk' being
                                         * deleted, try again.
                                         * See md.c
                                         */
                                        disk_put_part(bdev->bd_part);
                                        bdev->bd_part = NULL;
                                        module_put(disk->fops->owner);
                                        put_disk(disk);
                                        bdev->bd_disk = NULL;
                                        mutex_unlock(&bdev->bd_mutex);
                                        goto restart;
                                }
                                if (ret)
                                        goto out_clear;
                        }
                        if (!bdev->bd_openers) {
                                bd_set_size(bdev,(loff_t)get_capacity(disk)<<9);
                                bdi = blk_get_backing_dev_info(bdev);
                                if (bdi == NULL)
                                        bdi = &default_backing_dev_info;
                                bdev_inode_switch_bdi(bdev->bd_inode, bdi);
                        }
                        if (bdev->bd_invalidated)
                                rescan_partitions(disk, bdev);
                } else {
                        struct block_device *whole;
                        whole = bdget_disk(disk, 0);
                        ret = -ENOMEM;
                        if (!whole)
                                goto out_clear;
                        BUG_ON(for_part);
                        ret = __blkdev_get(whole, mode, 1);
                        if (ret)
                                goto out_clear;
                        bdev->bd_contains = whole;
                        bdev_inode_switch_bdi(bdev->bd_inode,
                                whole->bd_inode->i_data.backing_dev_info);
                        bdev->bd_part = disk_get_part(disk, partno);
                        if (!(disk->flags & GENHD_FL_UP) ||
                            !bdev->bd_part || !bdev->bd_part->nr_sects) {
                                ret = -ENXIO;
                                goto out_clear;
                        }
                        bd_set_size(bdev, (loff_t)bdev->bd_part->nr_sects << 9);
                }
        } else {
                module_put(disk->fops->owner);
                put_disk(disk);
                disk = NULL;
                if (bdev->bd_contains == bdev) {
                        if (bdev->bd_disk->fops->open) {
                                ret = bdev->bd_disk->fops->open(bdev, mode);
                                if (ret)
                                        goto out_unlock_bdev;
                        }
                        if (bdev->bd_invalidated)
                                rescan_partitions(bdev->bd_disk, bdev);
                }
        }
        bdev->bd_openers++;
        if (for_part)
                bdev->bd_part_count++;
        mutex_unlock(&bdev->bd_mutex);
        return 0;

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
2 [报告]
发表于 2012-06-14 16:02 |只看该作者
disk_get_part返回的是part0, .38中使用part0来描述disk。bdev->bd_part不会是NULL。

论坛徽章:
0
3 [报告]
发表于 2012-06-14 16:28 |只看该作者
回复 2# firkraag


    晕,原来内核改了啊。纠结啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP