块设备驱动实战基础篇三 (BIO请求回调机制)

本文详细介绍了Linux内核中块设备驱动的请求返回处理回调机制。通过分析代码,展示了如何在请求被底层设备处理完成后,进行回调处理,包括bio请求的上下文信息保存和恢复,以及最终的请求结束操作。文章旨在帮助读者理解完整的请求处理流程。
摘要由CSDN通过智能技术生成

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 = { </

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值