Commit e0fb369c authored by Tomasz Zawadzki's avatar Tomasz Zawadzki
Browse files

lib/blob: add more error paths on blob_persist



This patch adds more ways to back off when parts of
blob persist fails.
Otherwise the process would proceed as if nothing happened.

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


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 597c91ab
Loading
Loading
Loading
Loading
+31 −1
Original line number Diff line number Diff line
@@ -1581,6 +1581,11 @@ _spdk_blob_persist_clear_clusters_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int
	struct spdk_blob_store		*bs = blob->bs;
	size_t				i;

	if (bserrno != 0) {
		_spdk_blob_persist_complete(seq, ctx, bserrno);
		return;
	}

	/* Release all clusters that were truncated */
	for (i = blob->active.num_clusters; i < blob->active.cluster_array_size; i++) {
		uint32_t cluster_num = _spdk_bs_lba_to_cluster(bs, blob->active.clusters[i]);
@@ -1627,6 +1632,11 @@ _spdk_blob_persist_clear_clusters(spdk_bs_sequence_t *seq, void *cb_arg, int bse
	uint64_t			lba;
	uint32_t			lba_count;

	if (bserrno != 0) {
		_spdk_blob_persist_complete(seq, ctx, bserrno);
		return;
	}

	/* Clusters don't move around in blobs. The list shrinks or grows
	 * at the end, but no changes ever occur in the middle of the list.
	 */
@@ -1678,6 +1688,11 @@ _spdk_blob_persist_zero_pages_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bse
	struct spdk_blob_store		*bs = blob->bs;
	size_t				i;

	if (bserrno != 0) {
		_spdk_blob_persist_complete(seq, ctx, bserrno);
		return;
	}

	/* This loop starts at 1 because the first page is special and handled
	 * below. The pages (except the first) are never written in place,
	 * so any pages in the clean list must be zeroed.
@@ -1708,6 +1723,11 @@ _spdk_blob_persist_zero_pages(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno
	spdk_bs_batch_t			*batch;
	size_t				i;

	if (bserrno != 0) {
		_spdk_blob_persist_complete(seq, ctx, bserrno);
		return;
	}

	batch = spdk_bs_sequence_to_batch(seq, _spdk_blob_persist_zero_pages_cpl, ctx);

	lba_count = _spdk_bs_byte_to_lba(bs, SPDK_BS_PAGE_SIZE);
@@ -1746,6 +1766,11 @@ _spdk_blob_persist_write_page_root(spdk_bs_sequence_t *seq, void *cb_arg, int bs
	uint32_t			lba_count;
	struct spdk_blob_md_page	*page;

	if (bserrno != 0) {
		_spdk_blob_persist_complete(seq, ctx, bserrno);
		return;
	}

	if (blob->active.num_pages == 0) {
		/* Move on to the next step */
		_spdk_blob_persist_zero_pages(seq, ctx, 0);
@@ -1774,6 +1799,11 @@ _spdk_blob_persist_write_page_chain(spdk_bs_sequence_t *seq, void *cb_arg, int b
	spdk_bs_batch_t			*batch;
	size_t				i;

	if (bserrno != 0) {
		_spdk_blob_persist_complete(seq, ctx, bserrno);
		return;
	}

	/* Clusters don't move around in blobs. The list shrinks or grows
	 * at the end, but no changes ever occur in the middle of the list.
	 */
@@ -1999,7 +2029,7 @@ _spdk_blob_persist_write_extent_pages(spdk_bs_sequence_t *seq, void *cb_arg, int
			ctx->next_extent_page = i + 1;
			rc = _spdk_blob_serialize_add_page(ctx->blob, &ctx->extent_page, &page_count, &ctx->extent_page);
			if (rc < 0) {
				assert(false);
				_spdk_blob_persist_complete(seq, ctx, rc);
				return;
			}