我正在开发一个块分层设备驱动程序。所以,我拦截 WRITE 请求并加密数据,并在
此时,我使用以下限制来扫描磁盘扇区:
end_bio()
例程中解密数据(处理 READ 请求期间)。因此,在单个流中所有的工作都很正常。但是,如果尝试同时从两个或更多进程执行 I/O 操作,则会出现缓冲区内容损坏。我没有任何用于缓冲区的本地存储。
我需要在我的驱动程序中计算 BIO 合并吗?
Linux I/O 子系统是否有与并发 I/O 请求数量有关的某些要求?
使用堆栈或编译是否有相关的技巧和提示?
这是在内核4.15下进行的。此时,我使用以下限制来扫描磁盘扇区:
/*
* A portion of the bio_copy_data() ...
*/
for (vcnt = 0, src_iter = src->bi_iter; ; vcnt++)
{
if ( !src_iter.bi_size)
{
if ( !(src = src->bi_next) )
break;
src_iter = src->bi_iter;
}
src_bv = bio_iter_iovec(src, src_iter);
src_p = bv_page = kmap_atomic(src_bv.bv_page);
src_p += src_bv.bv_offset;
nlbn = src_bv.bv_len512;
for ( ; nlbn--; lbn++ , src_p += 512 )
{
{
/* Simulate a processing of data in the I/O buffer */
char *srcp = src_p, *dstp = src_p;
int count = DUDRV$K_SECTORSZ;
while ( count--)
{
*(dstp++) = ~ (*(srcp++));
}
}
}
kunmap_atomic(bv_page);
**bio_advance_iter**(src, &src_iter, src_bv.bv_len);
}
这正确吗?还是我需要使用类似于 bio_for_each_segment(bvl, bio, iter) 的东西?