1.5 块设备请求返回处理回调机制
本节我们继续完善1.4节中的代码,在上节我们完成了请求的过滤转发,那么请求被磁盘处理完成后返回回来的路径处理是怎样的,本节我们继续带着这样的问题再一次完善我们的驱动程序,通过本节的学习,我们能够真正掌握请求处理,转发过滤,请求完成后回调处理机制的完整学习。
先给出完善后的IO架构图,我们对比一下1.4节最后给出的图有何区别:
相比1.4节,在fbd_driver框图右侧增加了fbd_driver end io function处理模块,底层设备sd#的请求返回后,进入fbd_driver的请求回调处理函数中。我们再次贴一下完善后的代码。
1 #ifndef _FBD_DRIVER_H
2 #define _FBD_DRIVER_H
3 #include <linux/init.h>
4 #include <linux/module.h>
5 #include <linux/blkdev.h>
6 #include <linux/bio.h>
7 #include <linux/genhd.h>
8
9 #define SECTOR_BITS (9)
10 #define DEV_NAME_LEN 32
11
12 #define DRIVER_NAME "filter driver"
13
14 #define DEVICE1_NAME "fbd1_dev"
15 #define DEVICE1_MINOR 0
16 #define DEVICE2_NAME "fbd2_dev"
17 #define DEVICE2_MINOR 1
18
19 struct fbd_dev {
20 struct request_queue *queue;
21 struct gendisk *disk;
22 sector_t size; /* devicesize in Bytes */
23 char lower_dev_name[DEV_NAME_LEN];
24 struct block_device *lower_bdev;
25 };
26
27 struct bio_context {
28 void *old_private;
29 void *old_callback;
30 };
31 #endif
1 /**
2 * fbd-driver - filter blockdevice driver
3 * Author: Talk@studio
4 **/
5 #include "fbd_driver.h"
6
7 static int fbd_driver_major = 0;
8
9 static struct fbd_dev fbd_dev1 =
10 {
11 .queue = NULL,
12 .disk = NULL,
13 .lower_dev_name = "/dev/sdb",
14 .lower_bdev = NULL,
15 .size = 0
16 };
17
18 static struct fbd_dev fbd_dev2 =
19 {
20 .queue = NULL,
21 .disk = NULL,
22 .lower_dev_name = "/dev/sdc",
23 .lower_bdev = NULL,
24 .size = 0
25 };
26
27 static int fbddev_open(struct inode *inode,struct file *file);
28 static int fbddev_close(struct inode*inode, struct file *file);
29
30 static struct block_device_operationsdisk_fops = { </