Commit c91f8b18 authored by Slawomir Ptak's avatar Slawomir Ptak Committed by Tomasz Zawadzki
Browse files

module/raid: disable DIF/DIX for RAID



Currently, the RAID bdevs do not support
DIF and DIX, so if any of the base bdevs
has any of the related flags set,
do not allow for RAID bdev creation

Change-Id: Iab8a3778c756464abbce74e497d941de61b9fc2a
Signed-off-by: default avatarSlawomir Ptak <slawomir.ptak@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20141


Reviewed-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 2b62e64d
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -1078,20 +1078,22 @@ raid_bdev_configure_md(struct raid_bdev *raid_bdev)
	for (i = 0; i < raid_bdev->num_base_bdevs; i++) {
		base_bdev = spdk_bdev_desc_get_bdev(raid_bdev->base_bdev_info[i].desc);

		/* Currently, RAID bdevs do not support DIF or DIX, so a RAID bdev cannot
		 * be created on top of any bdev which supports it */
		if (spdk_bdev_get_dif_type(base_bdev) != SPDK_DIF_DISABLE) {
			SPDK_ERRLOG("at least one base bdev has DIF or DIX enabled "
				    "- unsupported RAID configuration\n");
			return -EPERM;
		}

		if (i == 0) {
			raid_bdev->bdev.md_len = spdk_bdev_get_md_size(base_bdev);
			raid_bdev->bdev.md_interleave = spdk_bdev_is_md_interleaved(base_bdev);
			raid_bdev->bdev.dif_type = spdk_bdev_get_dif_type(base_bdev);
			raid_bdev->bdev.dif_is_head_of_md = spdk_bdev_is_dif_head_of_md(base_bdev);
			raid_bdev->bdev.dif_check_flags = base_bdev->dif_check_flags;
			continue;
		}

		if (raid_bdev->bdev.md_len != spdk_bdev_get_md_size(base_bdev) ||
		    raid_bdev->bdev.md_interleave != spdk_bdev_is_md_interleaved(base_bdev) ||
		    raid_bdev->bdev.dif_type != spdk_bdev_get_dif_type(base_bdev) ||
		    raid_bdev->bdev.dif_is_head_of_md != spdk_bdev_is_dif_head_of_md(base_bdev) ||
		    raid_bdev->bdev.dif_check_flags != base_bdev->dif_check_flags) {
		    raid_bdev->bdev.md_interleave != spdk_bdev_is_md_interleaved(base_bdev)) {
			SPDK_ERRLOG("base bdevs are configured with different metadata formats\n");
			return -EPERM;
		}