Commit 958364b4 authored by Tomasz Zawadzki's avatar Tomasz Zawadzki
Browse files

lib/blob: only verify cluster allocation when I/O is not frozen



During snapshot creation the original blob becomes
a thin provisioned blob that will only the diff of data after
snapshot creation.

Despite the comment in the UT the number of polls before issuing
blob write was hitting blob BEFORE it swapped with new one.

Issuing I/O during this period shall check for io freeze
before checking cluster allocation.

Otherwise bs_io_unit_is_allocated() hits assert for thin
provisioned blob. This is because cluster map of blob is
empty, but properties have not been updated yet.

Signed-off-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Change-Id: I742e1a50b14d456ae1e6de13b5111caec3e8322c
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7641


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent d0b4deab
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2612,8 +2612,6 @@ blob_request_submit_op_single(struct spdk_io_channel *_ch, struct spdk_blob *blo
	cpl.u.blob_basic.cb_fn = cb_fn;
	cpl.u.blob_basic.cb_arg = cb_arg;

	is_allocated = blob_calculate_lba_and_lba_count(blob, offset, length, &lba, &lba_count);

	if (blob->frozen_refcnt) {
		/* This blob I/O is frozen */
		spdk_bs_user_op_t *op;
@@ -2630,6 +2628,8 @@ blob_request_submit_op_single(struct spdk_io_channel *_ch, struct spdk_blob *blo
		return;
	}

	is_allocated = blob_calculate_lba_and_lba_count(blob, offset, length, &lba, &lba_count);

	switch (op_type) {
	case SPDK_BLOB_READ: {
		spdk_bs_batch_t *batch;
+3 −4
Original line number Diff line number Diff line
@@ -821,7 +821,7 @@ blob_snapshot_freeze_io(void)
	/* This is implementation specific.
	 * Flag 'frozen_io' is set in _spdk_bs_snapshot_freeze_cpl callback.
	 * Four async I/O operations happen before that. */
	poll_thread_times(0, 3);
	poll_thread_times(0, 4);

	CU_ASSERT(TAILQ_EMPTY(&bs_channel->queued_io));

@@ -833,9 +833,8 @@ blob_snapshot_freeze_io(void)

	/* Verify that I/O is queued */
	CU_ASSERT(!TAILQ_EMPTY(&bs_channel->queued_io));
	/* Verify that payload is not written to disk */
	CU_ASSERT(memcmp(payload_zero, &g_dev_buffer[blob->active.clusters[0]*SPDK_BS_PAGE_SIZE],
			 SPDK_BS_PAGE_SIZE) == 0);
	/* Verify that payload is not written to disk, at this point the blobs already switched */
	CU_ASSERT(blob->active.clusters[0] == 0);

	/* Finish all operations including spdk_bs_create_snapshot */
	poll_threads();