raid1: degraded mode support

Properly handle IO when one or more base bdevs are missing.

Change-Id: I51161b01a625c20da5156d7db1c5e5d9b62ce298
Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
This commit is contained in:
Artur Paszkiewicz 2022-10-03 14:06:54 +02:00 committed by David Ko
parent 65f2af1dcb
commit cdf0959bc4

View File

@ -51,12 +51,25 @@ raid1_submit_read_request(struct raid_bdev_io *raid_io)
struct raid_bdev *raid_bdev = raid_io->raid_bdev;
struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx(raid_io);
struct spdk_bdev_ext_io_opts io_opts;
uint8_t ch_idx = 0;
struct raid_base_bdev_info *base_info = &raid_bdev->base_bdev_info[ch_idx];
struct spdk_io_channel *base_ch = raid_io->raid_ch->base_channel[ch_idx];
uint8_t idx = 0;
struct raid_base_bdev_info *base_info;
struct spdk_io_channel *base_ch = NULL;
uint64_t pd_lba, pd_blocks;
int ret;
RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
base_ch = raid_io->raid_ch->base_channel[idx];
if (base_ch != NULL) {
break;
}
idx++;
}
if (idx == raid_bdev->num_base_bdevs) {
raid_bdev_io_complete(raid_io, SPDK_BDEV_IO_STATUS_FAILED);
return 0;
}
pd_lba = bdev_io->u.bdev.offset_blocks;
pd_blocks = bdev_io->u.bdev.num_blocks;
@ -88,7 +101,7 @@ raid1_submit_write_request(struct raid_bdev_io *raid_io)
struct raid_base_bdev_info *base_info;
struct spdk_io_channel *base_ch;
uint64_t pd_lba, pd_blocks;
uint16_t idx = raid_io->base_bdev_io_submitted;
uint8_t idx;
uint64_t base_bdev_io_not_submitted;
int ret = 0;
@ -100,10 +113,16 @@ raid1_submit_write_request(struct raid_bdev_io *raid_io)
}
raid1_init_ext_io_opts(bdev_io, &io_opts);
for (; idx < raid_bdev->num_base_bdevs; idx++) {
for (idx = raid_io->base_bdev_io_submitted; idx < raid_bdev->num_base_bdevs; idx++) {
base_info = &raid_bdev->base_bdev_info[idx];
base_ch = raid_io->raid_ch->base_channel[idx];
if (base_ch == NULL) {
raid_io->base_bdev_io_submitted++;
raid_bdev_io_complete_part(raid_io, 1, SPDK_BDEV_IO_STATUS_SUCCESS);
continue;
}
ret = raid_bdev_writev_blocks_ext(base_info, base_ch,
bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt,
pd_lba, pd_blocks, raid1_bdev_io_completion,
@ -125,6 +144,10 @@ raid1_submit_write_request(struct raid_bdev_io *raid_io)
raid_io->base_bdev_io_submitted++;
}
if (raid_io->base_bdev_io_submitted == 0) {
ret = -ENODEV;
}
return ret;
}