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:
parent
65f2af1dcb
commit
cdf0959bc4
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user