Commit e56f1618 authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Ben Walker
Browse files

lib/ftl: Add explicit support for write unit sizes of base device



Currently we're supporting power of 2 write unit size that doesn't
exceed 1MiB. Added a check for lack of metadata support for base bdev,
since we never allocate any buffers for it.

Fixes #3579

Change-Id: I0c5ae610c983eae1efb7b0dc7358a464d22919e0
Signed-off-by: default avatarMateusz Kozlowski <mateusz.kozlowski@solidigm.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/25476


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Community-CI: Community CI Samsung <spdk.community.ci.samsung@gmail.com>
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarMariusz Barczak <mariusz.barczak@solidigmtechnology.com>
parent 04524ea4
Loading
Loading
Loading
Loading
+31 −1
Original line number Diff line number Diff line
@@ -11,7 +11,37 @@
static bool
is_bdev_compatible(struct spdk_ftl_dev *dev, struct spdk_bdev *bdev)
{
	return spdk_bdev_get_block_size(bdev) == FTL_BLOCK_SIZE;
	uint64_t write_unit_size = spdk_bdev_get_write_unit_size(bdev);

	if (spdk_bdev_get_block_size(bdev) != FTL_BLOCK_SIZE) {
		FTL_ERRLOG(dev, "Unsupported block size, only 4096 is supprted.\nn");
		return false;
	}

	if (spdk_bdev_get_md_size(bdev) != 0) {
		/* Bdev's metadata is unsupported */
		FTL_ERRLOG(dev, "Unsupported metadata size, sector metadata isn't supported.\n");
		return false;
	}

	if (write_unit_size == 1) {
		/* No write unit size, all alignments will work out fine */
		return true;
	}

	if (!spdk_u32_is_pow2(write_unit_size) || write_unit_size > (MiB / FTL_BLOCK_SIZE)) {
		/* Needs to be a power of 2 for current band size (1GiB) restrictions.
		 * Current buffers are allocated in 1MiB sizes (256 blocks), so it can't be larger than that.
		 * In the future, if the restriction is relaxed, the ftl_bitmap_buffer_alignment (64 blocks)
		 * will need to be taken into consideration as well.
		 */
		FTL_ERRLOG(dev,
			   "Unsupported write unit size (%lu), must be a power of 2 (in blocks). Can't be larger than 256 (1MiB)\n",
			   write_unit_size);
		return false;
	}

	return true;
}

static void