Commit 9d92f20d authored by Yankun Li's avatar Yankun Li Committed by Konrad Sztyber
Browse files

lib/reduce: add _reduce_vol_reset_chunk function



_reduce_vol_reset_chunk is a function used to reset allocated chunk

Change-Id: I4a2b13ac4d4db2e2663491c9a8f6bd44930e28f1
Signed-off-by: default avatarYankun Li <845245370@qq.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/24345


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarGangCao <gang.cao@intel.com>
parent 7e10e593
Loading
Loading
Loading
Loading
+20 −12
Original line number Diff line number Diff line
@@ -1015,14 +1015,31 @@ _reduce_vol_complete_req(struct spdk_reduce_vol_request *req, int reduce_errno)
	TAILQ_INSERT_HEAD(&vol->free_requests, req, tailq);
}

static void
_reduce_vol_reset_chunk(struct spdk_reduce_vol *vol, uint64_t chunk_map_index)
{
	struct spdk_reduce_chunk_map *chunk;
	uint32_t i;

	chunk = _reduce_vol_get_chunk_map(vol, chunk_map_index);
	for (i = 0; i < vol->backing_io_units_per_chunk; i++) {
		if (chunk->io_unit_index[i] == REDUCE_EMPTY_MAP_ENTRY) {
			break;
		}
		assert(spdk_bit_array_get(vol->allocated_backing_io_units,
					  chunk->io_unit_index[i]) == true);
		spdk_bit_array_clear(vol->allocated_backing_io_units, chunk->io_unit_index[i]);
		chunk->io_unit_index[i] = REDUCE_EMPTY_MAP_ENTRY;
	}
	spdk_bit_array_clear(vol->allocated_chunk_maps, chunk_map_index);
}

static void
_write_write_done(void *_req, int reduce_errno)
{
	struct spdk_reduce_vol_request *req = _req;
	struct spdk_reduce_vol *vol = req->vol;
	uint64_t old_chunk_map_index;
	struct spdk_reduce_chunk_map *old_chunk;
	uint32_t i;

	if (reduce_errno != 0) {
		req->reduce_errno = reduce_errno;
@@ -1040,16 +1057,7 @@ _write_write_done(void *_req, int reduce_errno)

	old_chunk_map_index = vol->pm_logical_map[req->logical_map_index];
	if (old_chunk_map_index != REDUCE_EMPTY_MAP_ENTRY) {
		old_chunk = _reduce_vol_get_chunk_map(vol, old_chunk_map_index);
		for (i = 0; i < vol->backing_io_units_per_chunk; i++) {
			if (old_chunk->io_unit_index[i] == REDUCE_EMPTY_MAP_ENTRY) {
				break;
			}
			assert(spdk_bit_array_get(vol->allocated_backing_io_units, old_chunk->io_unit_index[i]) == true);
			spdk_bit_array_clear(vol->allocated_backing_io_units, old_chunk->io_unit_index[i]);
			old_chunk->io_unit_index[i] = REDUCE_EMPTY_MAP_ENTRY;
		}
		spdk_bit_array_clear(vol->allocated_chunk_maps, old_chunk_map_index);
		_reduce_vol_reset_chunk(vol, old_chunk_map_index);
	}

	/*