linux内核源码翻阅之facebook硬盘加速flashcache之四
linux内核源码阅读之facebook硬盘加速flashcache之四这一小节介绍一下flashcache读写入口和读写的基础实现
linux内核源码阅读之facebook硬盘加速flashcache之四
这一小节介绍一下flashcache读写入口和读写的基础实现。首先,不管是模块还是程序,必须先找到入口,用户态代码会经常去先看main函数,内核看module_init,同样看IO流时候也要找到入口。flashcache作为一个dm_target,入口就是struct target_type 的map函数,对应的是flashcache_map函数:
1208 r = dm_kcopyd_client_create(FLASHCACHE_COPY_PAGES, &dmc->kcp_client);1209 if (r) {1210 ti->error = "Failed to initialize kcopyd client\n";1211 dm_io_client_destroy(dmc->io_client);1212 goto bad3;1213 }
第二个参数dm_io_region是源地址,第四个参数是目的地址,定义如下struct dm_io_region {
struct block_device *bdev;
sector_t sector;
sector_t count; /* If this is zero the region is ignored. */
};
dm_kcopyd_notify_fn fn是kcopyd处理完请求的回调函数context 是回调函数参数,在flashcache都设置对应的kcached_job小结一下,以上两类函数其实本质是一样的,调用者填写好源地址和目的地址,地址可以是内存中的也可以是设备的,填好之后就调用函数,再接着就等回调通知。就好比我们在网上购物,帐号(dm_client)登录,我们只负责填好订单(dm_io_region),具体的生产制造物流过程我不关心,我只关心门铃响(dm_kcopyd_notify_fn)的时候我要的物品都已经送上门来了。