09-块设备的打开与释放
13.4 块设备的打开与释放
块设备驱动的open()和release()函数并非是必须的,一个简单的块设备驱动可以不提供open() 和release()函数。
块设备驱动的open()函数和其字符设备驱动的对等体不太相似,不以相关的inode和file结构体指针作为参数。在open()中我们可以通过block_device参数bdev获取private_data、在release()函数中则通过gendisk参数disk获取,如代码清单13.12所示。
代码清单13.12 在块设备的open()/release()函数中获取private.data
1 static int xxx_open(struct block_device *bdev, fmode_t mode)
2 {
3 struct xxx_dev *dev = bdev->bd_disk->private_data;
4
5 ...
6
7 return 0;
8 }
9
10 static int xxx_release(struct gendisk *disk, fmode_t mode)
11 {
12 struct xxx_dev *dev = disk->private_data;
13
14 ...
15
16 return 0;
17 }
在一个处理真实的硬件设备的驱动中,open()和release()方法还应当设置驱动和硬件的状态,这些工作可能包括启停磁盘、加锁一个可移出设备和分配DMA缓冲等。