在Android内核中打开MMC块设备导致崩溃

在Android内核中打开MMC块设备导致崩溃,android,linux,drivers,Android,Linux,Drivers,我正在为Android内核编写一个驱动程序,该内核需要打开并最终从MMC块设备读取数据(例如“/dev/block/mmcblk0”)。现在,我正在尝试使用blkdev_get_by_path()打开块设备,并计划通过构造一个用于读取的bio结构并使用generic_make_request()执行读取来从中读取 此时,我一步一个脚印,只尝试打开设备,然后在成功打开后关闭它(使用blkdev_put())。我面临的问题是,即使只是调用blkdev_get_by_path()有时也会导致内核崩溃并

我正在为Android内核编写一个驱动程序,该内核需要打开并最终从MMC块设备读取数据(例如“/dev/block/mmcblk0”)。现在,我正在尝试使用blkdev_get_by_path()打开块设备,并计划通过构造一个用于读取的bio结构并使用generic_make_request()执行读取来从中读取

此时,我一步一个脚印,只尝试打开设备,然后在成功打开后关闭它(使用blkdev_put())。我面临的问题是,即使只是调用blkdev_get_by_path()有时也会导致内核崩溃并重新启动设备

下面是一些代码:

#define MMC_DEV "/dev/block/mmcblk0"

void open_mmc_dev()
{
     struct block_device *mmc_dev;
     mmc_dev = blkdev_get_by_path(MMC_DEV, FMODE_READ, 0);
     if (!IS_ERR(mmc_dev))
     {
          blk_dev_put(mmc_dev);
          printk("Opened MMC Device\n");
     }
     else
     {
          printk("blkdev_get_by_path failed with %ld\n", PTR_ERR(blk_dev));
     }
}
我还应该补充一点,通过使用mod_timer()调度事件,打开MMC设备的代码正在重复运行,该事件最初在我自己的驱动程序的init函数中调度。原因是MMC设备最初不存在,所以我将此事件设置为每100ms运行一次。只要blkdev_get_by_path()返回-enoint,我就会重置事件,使其在100毫秒后再次运行,直到成功获取块设备指针。我所看到的是,每3或4只靴子中就有1只会挂断手机或导致手机重新启动。在成功引导时,我能够使用dmesg验证我最终能够获得指向MMC block_设备的指针。我还尝试在没有调用blkdev_get_by_path()和blkdev_put()的情况下反复运行我的事件,这不会导致我看到的崩溃,因此崩溃似乎与那些blkdev调用有关

什么可能导致blkdev_get_by_path()崩溃? 是否需要一些我缺少的同步组件来打开这样的块设备