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 raid_bdev *raid_bdev = raid_io->raid_bdev;
|
||||||
struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx(raid_io);
|
struct spdk_bdev_io *bdev_io = spdk_bdev_io_from_ctx(raid_io);
|
||||||
struct spdk_bdev_ext_io_opts io_opts;
|
struct spdk_bdev_ext_io_opts io_opts;
|
||||||
uint8_t ch_idx = 0;
|
uint8_t idx = 0;
|
||||||
struct raid_base_bdev_info *base_info = &raid_bdev->base_bdev_info[ch_idx];
|
struct raid_base_bdev_info *base_info;
|
||||||
struct spdk_io_channel *base_ch = raid_io->raid_ch->base_channel[ch_idx];
|
struct spdk_io_channel *base_ch = NULL;
|
||||||
uint64_t pd_lba, pd_blocks;
|
uint64_t pd_lba, pd_blocks;
|
||||||
int ret;
|
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_lba = bdev_io->u.bdev.offset_blocks;
|
||||||
pd_blocks = bdev_io->u.bdev.num_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 raid_base_bdev_info *base_info;
|
||||||
struct spdk_io_channel *base_ch;
|
struct spdk_io_channel *base_ch;
|
||||||
uint64_t pd_lba, pd_blocks;
|
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;
|
uint64_t base_bdev_io_not_submitted;
|
||||||
int ret = 0;
|
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);
|
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_info = &raid_bdev->base_bdev_info[idx];
|
||||||
base_ch = raid_io->raid_ch->base_channel[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,
|
ret = raid_bdev_writev_blocks_ext(base_info, base_ch,
|
||||||
bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt,
|
bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt,
|
||||||
pd_lba, pd_blocks, raid1_bdev_io_completion,
|
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++;
|
raid_io->base_bdev_io_submitted++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (raid_io->base_bdev_io_submitted == 0) {
|
||||||
|
ret = -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user