Commit 9820a949 authored by Artur Paszkiewicz's avatar Artur Paszkiewicz Committed by Jim Harris
Browse files

raid: add a default completion status to raid_bdev_io



As base I/Os complete, the final raid I/O completion status will change
only if the base I/O status is different than the default. So if the
default is "FAILED" and a base I/O completes with "SUCCESS", it will be
set to "SUCCESS" and won't change if subsequent I/Os complete with
"FAILED".

This will be used by raid1 writes, where the completion status should be
successful even if some base I/Os failed.

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


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarKrzysztof Karas <krzysztof.karas@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent f1a03e33
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -672,7 +672,7 @@ raid_bdev_io_complete_part(struct raid_bdev_io *raid_io, uint64_t completed,
	assert(raid_io->base_bdev_io_remaining >= completed);
	raid_io->base_bdev_io_remaining -= completed;

	if (status != SPDK_BDEV_IO_STATUS_SUCCESS) {
	if (status != raid_io->base_bdev_io_status_default) {
		raid_io->base_bdev_io_status = status;
	}

@@ -895,9 +895,10 @@ raid_bdev_io_init(struct raid_bdev_io *raid_io, struct raid_bdev_io_channel *rai
	raid_io->raid_ch = raid_ch;
	raid_io->base_bdev_io_remaining = 0;
	raid_io->base_bdev_io_submitted = 0;
	raid_io->base_bdev_io_status = SPDK_BDEV_IO_STATUS_SUCCESS;
	raid_io->completion_cb = NULL;
	raid_io->split.offset = RAID_OFFSET_BLOCKS_INVALID;

	raid_bdev_io_set_default_status(raid_io, SPDK_BDEV_IO_STATUS_SUCCESS);
}

/*
+10 −0
Original line number Diff line number Diff line
@@ -144,6 +144,8 @@ struct raid_bdev_io {
	uint64_t			base_bdev_io_remaining;
	uint8_t				base_bdev_io_submitted;
	enum spdk_bdev_io_status	base_bdev_io_status;
	/* This will be the raid_io completion status unless any base io's status is different. */
	enum spdk_bdev_io_status	base_bdev_io_status_default;

	/* Private data for the raid module */
	void				*module_private;
@@ -380,6 +382,14 @@ raid_bdev_base_bdev_slot(struct raid_base_bdev_info *base_info)
	return base_info - base_info->raid_bdev->base_bdev_info;
}

static inline void
raid_bdev_io_set_default_status(struct raid_bdev_io *raid_io, enum spdk_bdev_io_status status)
{
	assert(raid_io->base_bdev_io_submitted == 0);
	raid_io->base_bdev_io_status = status;
	raid_io->base_bdev_io_status_default = status;
}

int raid_bdev_remap_dix_reftag(void *md_buf, uint64_t num_blocks,
			       struct spdk_bdev *bdev, uint32_t remapped_offset);
int raid_bdev_verify_dix_reftag(struct iovec *iovs, int iovcnt, void *md_buf,
+2 −2
Original line number Diff line number Diff line
@@ -253,7 +253,7 @@ raid_test_bdev_io_init(struct raid_bdev_io *raid_io, struct raid_bdev *raid_bdev
	raid_io->iovcnt = iovcnt;
	raid_io->md_buf = md_buf;

	raid_io->base_bdev_io_status = SPDK_BDEV_IO_STATUS_SUCCESS;
	raid_bdev_io_set_default_status(raid_io, SPDK_BDEV_IO_STATUS_SUCCESS);
}

void
@@ -273,7 +273,7 @@ raid_bdev_io_complete_part(struct raid_bdev_io *raid_io, uint64_t completed,
	SPDK_CU_ASSERT_FATAL(raid_io->base_bdev_io_remaining >= completed);
	raid_io->base_bdev_io_remaining -= completed;

	if (status != SPDK_BDEV_IO_STATUS_SUCCESS) {
	if (status != raid_io->base_bdev_io_status_default) {
		raid_io->base_bdev_io_status = status;
	}