В ядре 3.10 у меня есть намерение изменять данные на лету: содержимое запросов на чтение / запись. Поскольку я работаю с RBD, я сосредоточился на части функции rbd_img_request_fill
:
if (type == OBJ_REQUEST_BIO) {
bio_list = data_desc;
rbd_assert(img_offset == bio_list->bi_sector << SECTOR_SHIFT);
} else {
rbd_assert(type == OBJ_REQUEST_PAGES);
pages = data_desc;
}
Я решил выполнять здесь операции редактирования данных, а не bio_list
и pages
. Поскольку bio_list
просто bio *bio_list
, все в порядке.
Для доступа к страницам через BIO я использую что-то вроде:
struct bio_vec *bvec;
bio_for_each_segment(bvec, bio, iter) {
u8 *dst = page_address(bvec.bv_page) + bvec.bv_offset;
int len = bvec.bv_len;
// later rewriting len bytes of dst
Я знаю слой BIO и способ его итерации, однако:
- Есть ли рекомендуемый способ прохождения
struct page **pages
, позволяющий изменять данные буфера, как указано выше? - Я предполагаю, что если я перезапишу данные в этих структурах, операция чтения / записи впоследствии будет выполняться с этими точными данные, это правильно?
Спасибо.