当前位置:嗨网首页>书籍在线阅读

17-vmem_disk设备驱动block_device_operations及成员函数

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

13.7.3 vmem_disk设备驱动block_device_operations及成员函数

vmem_disk提供block_device_operations结构体中open()、release()、getgeo()、media_changed()、revalidate_disk()这些成员函数,代码清单13.18给出了vmem_disk设备驱动的blockdevice operations结构体定义及其成员函数的实现。

代码清单13.18 vmem.disk设备驱动block.device.operations结构体及成员函数

1 /*

2 * Open和close.

3 */

4

5 static int vmem_disk_open(struct block_device *bdev, fmode_t mode)

6 {

7 struct vmem_disk_dev *dev = bdev->bd_disk->private_data;

8

9 del_timer_sync(&dev->timer);

10 spin_lock(&dev->lock);

11 dev->users++;

12 spin_unlock(&dev->lock);

13

14 return 0;

15 }

16

17 static int vmem_disk_release(struct gendisk *disk, fmode_t mode)

18 {

19 struct vmem_disk_dev *dev = disk->private_data;

20

21 spin_lock(&dev->lock);

22 dev->users--;

23

24 if (!dev->users) {

25 dev->timer.expires = jiffies + INVALIDATE_DELAY;

26 add_timer(&dev->timer);

27 }

28 spin_unlock(&dev->lock);

29

30 return 0;

31 }

32

33 int vmem_disk_media_changed(struct gendisk *gd)

34 {

35 struct vmem_disk_dev *dev = gd->private_data;

36

37 return dev->media_change;

38 }

39

40 int vmem_disk_revalidate(struct gendisk *gd)

41 {

42 struct vmem_disk_dev *dev = gd->private_data;

43

44 if (dev->media_change) {

45 dev->media_change = 0;

46 memset (dev->data, 0, dev->size);

47 }

48 return 0;

49 }

50

51 /*

52 * invalidate()在定时器到期时执行,设置一个标志来模拟磁盘的移除

53 */

54 void vmem_disk_invalidate(unsigned long ldev)

55 {

56 struct vmem_disk_dev dev = (struct vmem_disk_dev ) ldev;

57

58 spin_lock(&dev->lock);

59 if (dev->users || !dev->data)

60 printk (KERN_WARNING "vmem_disk: timer sanity check failed\n");

61 else

62 dev->media_change = 1;

63 spin_unlock(&dev->lock);

64 }

65

66 /*

67 * getgeo() 实现

68 */

69

70 static int vmem_disk_getgeo(struct block_device bdev, struct hd_geometry geo)

71 {

72 long size;

73 struct vmem_disk_dev *dev = bdev->bd_disk->private_data;

74

75 size = dev->size*(hardsect_size/KERNEL_SECTOR_SIZE);

76 geo->cylinders = (size & ~0x3f) >> 6;

77 geo->heads = 4;

78 geo->sectors = 16;

79 geo->start = 4;

80

81 return 0;

82 }

83

84 /*

85 * block_device_operations结构体

86 */

87 static struct block_device_operations vmem_disk_ops = {

88 .owner = THIS_MODULE,

89 .open = vmem_disk_open,

90 .release = vmem_disk_release,

91 .media_changed = vmem_disk_media_changed,

92 .revalidate_disk = vmem_disk_revalidate,

93 .getgeo = vmem_disk_getgeo,

94 };