composite: Add forward_metadata support

Signed-off-by: Robert Baldyga <robert.baldyga@huawei.com>
Signed-off-by: Michal Mielewczyk <michal.mielewczyk@huawei.com>
This commit is contained in:
Robert Baldyga 2023-10-13 15:43:41 +02:00 committed by Michal Mielewczyk
parent 5859e432c8
commit 07abdf5d8b

View File

@ -244,6 +244,53 @@ void ocf_composite_forward_write_zeros(ocf_volume_t cvolume,
ocf_forward_end(token, 0); ocf_forward_end(token, 0);
} }
void ocf_composite_forward_metadata(ocf_volume_t cvolume,
ocf_forward_token_t token, int dir, uint64_t addr,
uint64_t bytes, uint64_t offset)
{
struct ocf_composite_volume *composite = ocf_volume_get_priv(cvolume);
uint64_t member_bytes, caddr;
int i;
ENV_BUG_ON(addr >= composite->length);
ENV_BUG_ON(addr + bytes > composite->length);
caddr = addr;
for (i = 0; i < composite->members_cnt; i++) {
if (addr >= composite->end_addr[i])
continue;
if (unlikely(!composite->member[i].volume.opened)) {
ocf_forward_end(token, -OCF_ERR_INVAL);
return;
}
addr = addr - (i > 0 ? composite->end_addr[i-1] : 0);
break;
}
for (; i < composite->members_cnt && bytes; i++) {
if (unlikely(!composite->member[i].volume.opened)) {
ocf_forward_end(token, -OCF_ERR_INVAL);
return;
}
member_bytes = OCF_MIN(bytes, composite->end_addr[i] - caddr);
ocf_forward_metadata(&composite->member[i].volume, token, dir,
addr, member_bytes, offset);
addr = 0;
caddr = composite->end_addr[i];
bytes -= member_bytes;
offset += member_bytes;
}
/* Put io forward counter to account for the original forward */
ocf_forward_end(token, 0);
}
/* *** VOLUME OPS *** */ /* *** VOLUME OPS *** */
static int ocf_composite_volume_open(ocf_volume_t cvolume, void *volume_params) static int ocf_composite_volume_open(ocf_volume_t cvolume, void *volume_params)
@ -366,6 +413,7 @@ const struct ocf_volume_properties ocf_composite_volume_properties = {
.forward_flush = ocf_composite_forward_flush, .forward_flush = ocf_composite_forward_flush,
.forward_discard = ocf_composite_forward_discard, .forward_discard = ocf_composite_forward_discard,
.forward_write_zeros = ocf_composite_forward_write_zeros, .forward_write_zeros = ocf_composite_forward_write_zeros,
.forward_metadata = ocf_composite_forward_metadata,
.open = ocf_composite_volume_open, .open = ocf_composite_volume_open,
.close = ocf_composite_volume_close, .close = ocf_composite_volume_close,