Commit 597fbea9 authored by Artur Paszkiewicz's avatar Artur Paszkiewicz Committed by Tomasz Zawadzki
Browse files

raid1: degraded mode support



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

Change-Id: I51161b01a625c20da5156d7db1c5e5d9b62ce298
Signed-off-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15266


Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Community-CI: Mellanox Build Bot
parent b42cb0e5
Loading
Loading
Loading
Loading
+29 −5
Original line number Diff line number Diff line
@@ -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 (base_ch == NULL) {
		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,17 @@ 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) {
			/* skip a missing base bdev's slot */
			raid_io->base_bdev_io_submitted++;
			raid_bdev_io_complete_part(raid_io, 1, SPDK_BDEV_IO_STATUS_SUCCESS);
			continue;
		}

		ret = spdk_bdev_writev_blocks_ext(base_info->desc, base_ch,
						  bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt,
						  pd_lba, pd_blocks, raid1_bdev_io_completion,
@@ -125,6 +145,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;
}