From ad3fd2ffb03cb1720b03c7d29bc71896d69cc80f Mon Sep 17 00:00:00 2001 From: Damian Raczkowski Date: Wed, 2 Nov 2022 15:39:45 +0100 Subject: [PATCH] cleanup req->error setting Signed-off-by: Damian Raczkowski --- src/engine/engine_bf.c | 6 +++--- src/engine/engine_common.c | 9 +++++---- src/engine/engine_d2c.c | 6 +++--- src/engine/engine_discard.c | 8 ++++---- src/engine/engine_fast.c | 6 +++--- src/engine/engine_inv.c | 4 ++-- src/engine/engine_ops.c | 6 +++--- src/engine/engine_pt.c | 6 +++--- src/engine/engine_rd.c | 14 +++++++------- src/engine/engine_wb.c | 12 ++++++------ src/engine/engine_wi.c | 16 ++++++++-------- src/engine/engine_wo.c | 12 ++++++------ src/engine/engine_wt.c | 18 +++++++++--------- src/engine/engine_zero.c | 6 +++--- src/metadata/metadata_raw.c | 4 ++-- src/metadata/metadata_raw_atomic.c | 12 ++++++------ src/ocf_request.c | 2 +- src/ocf_request.h | 2 +- src/utils/utils_cleaner.c | 14 +++++++------- 19 files changed, 82 insertions(+), 81 deletions(-) diff --git a/src/engine/engine_bf.c b/src/engine/engine_bf.c index 60d2cea2..db40dc37 100644 --- a/src/engine/engine_bf.c +++ b/src/engine/engine_bf.c @@ -42,11 +42,11 @@ static void _ocf_backfill_complete(struct ocf_request *req, int error) struct ocf_cache *cache = req->cache; if (error) { - req->error = error; + env_atomic_cmpxchg(&req->error, 0, error); ocf_core_stats_cache_error_update(req->core, OCF_WRITE); } - if (req->error) + if (env_atomic_read(&req->error)) inc_fallback_pt_error_counter(req->cache); /* Handle callback-caller race to let only one of the two complete the @@ -64,7 +64,7 @@ static void _ocf_backfill_complete(struct ocf_request *req, int error) ctx_data_free(cache->owner, req->data); req->data = NULL; - if (req->error) { + if (env_atomic_read(&req->error)) { ocf_engine_invalidate(req); } else { ocf_req_unlock(ocf_cache_line_concurrency(cache), req); diff --git a/src/engine/engine_common.c b/src/engine/engine_common.c index b54c8654..94218553 100644 --- a/src/engine/engine_common.c +++ b/src/engine/engine_common.c @@ -366,7 +366,8 @@ static void _ocf_engine_clean_end(void *private_data, int error) if (error) { OCF_DEBUG_RQ(req, "Cleaning ERROR"); - req->error |= error; + env_atomic_cmpxchg(&req->error, 0, error); + /* End request and do not processing */ ocf_req_unlock(ocf_cache_line_concurrency(req->cache), @@ -648,7 +649,7 @@ void ocf_engine_push_req_front_cb(struct ocf_request *req, ocf_engine_cb engine_cb, bool allow_sync) { - req->error = 0; /* Please explain why!!! */ + env_atomic_cmpxchg(&req->error, 0, 0);/* Please explain why!!! */ req->engine_handler = engine_cb; ocf_engine_push_req_front(req, allow_sync); } @@ -687,10 +688,10 @@ static int _ocf_engine_refresh(struct ocf_request *req) req->engine_handler(req); } else { ENV_WARN(true, "Inconsistent request"); - req->error = -OCF_ERR_INVAL; + env_atomic_cmpxchg(&req->error, 0, -OCF_ERR_INVAL); /* Complete request */ - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); /* Release WRITE lock of request */ ocf_req_unlock(ocf_cache_line_concurrency(req->cache), req); diff --git a/src/engine/engine_d2c.c b/src/engine/engine_d2c.c index 9f7351a5..d97a1b24 100644 --- a/src/engine/engine_d2c.c +++ b/src/engine/engine_d2c.c @@ -16,17 +16,17 @@ static void _ocf_d2c_completion(struct ocf_request *req, int error) { - req->error = error; + env_atomic_cmpxchg(&req->error, 0, error); OCF_DEBUG_RQ(req, "Completion"); - if (req->error) { + if (env_atomic_read(&req->error)) { req->info.core_error = 1; ocf_core_stats_core_error_update(req->core, req->rw); } /* Complete request */ - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); /* Release OCF request */ ocf_req_put(req); diff --git a/src/engine/engine_discard.c b/src/engine/engine_discard.c index 38603860..bcbc8ed8 100644 --- a/src/engine/engine_discard.c +++ b/src/engine/engine_discard.c @@ -116,7 +116,7 @@ static void _ocf_discard_finish_step(struct ocf_request *req) static void _ocf_discard_step_complete(struct ocf_request *req, int error) { if (error) - req->error |= error; + env_atomic_cmpxchg(&req->error, 0, error); if (env_atomic_dec_return(&req->req_remaining)) return; @@ -126,9 +126,9 @@ static void _ocf_discard_step_complete(struct ocf_request *req, int error) /* Release WRITE lock of request */ ocf_req_unlock_wr(ocf_cache_line_concurrency(req->cache), req); - if (req->error) { + if (env_atomic_read(&req->error)) { ocf_metadata_error(req->cache); - _ocf_discard_complete_req(req, req->error); + _ocf_discard_complete_req(req, env_atomic_read(&req->error)); return; } @@ -230,7 +230,7 @@ static int _ocf_discard_step(struct ocf_request *req) } } else { OCF_DEBUG_RQ(req, "LOCK ERROR %d", lock); - req->error |= lock; + env_atomic_cmpxchg(&req->error, 0, lock); _ocf_discard_finish_step(req); } diff --git a/src/engine/engine_fast.c b/src/engine/engine_fast.c index 91822f83..64e677e9 100644 --- a/src/engine/engine_fast.c +++ b/src/engine/engine_fast.c @@ -31,7 +31,7 @@ static void _ocf_read_fast_complete(struct ocf_request *req, int error) { if (error) { - req->error |= error; + env_atomic_cmpxchg(&req->error, 0, error); ocf_core_stats_cache_error_update(req->core, OCF_READ); } @@ -42,7 +42,7 @@ static void _ocf_read_fast_complete(struct ocf_request *req, int error) OCF_DEBUG_RQ(req, "HIT completion"); - if (req->error) { + if (env_atomic_read(&req->error)) { OCF_DEBUG_RQ(req, "ERROR"); ocf_engine_push_req_front_pt(req); @@ -50,7 +50,7 @@ static void _ocf_read_fast_complete(struct ocf_request *req, int error) ocf_req_unlock(ocf_cache_line_concurrency(req->cache), req); /* Complete request */ - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); /* Free the request at the last point of the completion path */ ocf_req_put(req); diff --git a/src/engine/engine_inv.c b/src/engine/engine_inv.c index 4b60b2b3..59c52404 100644 --- a/src/engine/engine_inv.c +++ b/src/engine/engine_inv.c @@ -19,7 +19,7 @@ static void _ocf_invalidate_req(struct ocf_request *req, int error) { if (error) { - req->error = error; + env_atomic_cmpxchg(&req->error, 0, error); ocf_core_stats_cache_error_update(req->core, OCF_WRITE); } @@ -28,7 +28,7 @@ static void _ocf_invalidate_req(struct ocf_request *req, int error) OCF_DEBUG_RQ(req, "Completion"); - if (req->error) + if (env_atomic_read(&req->error)) ocf_engine_error(req, true, "Failed to flush metadata to cache"); ocf_req_unlock_wr(ocf_cache_line_concurrency(req->cache), req); diff --git a/src/engine/engine_ops.c b/src/engine/engine_ops.c index c65fc0b5..f74fdd69 100644 --- a/src/engine/engine_ops.c +++ b/src/engine/engine_ops.c @@ -16,20 +16,20 @@ static void _ocf_engine_ops_complete(struct ocf_request *req, int error) { if (error) - req->error |= error; + env_atomic_cmpxchg(&req->error, 0, error); if (env_atomic_dec_return(&req->req_remaining)) return; OCF_DEBUG_RQ(req, "Completion"); - if (req->error) { + if (env_atomic_read(&req->error)) { /* An error occured */ ocf_engine_error(req, false, "Core operation failure"); } /* Complete requests - both to cache and to core*/ - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); /* Release OCF request */ ocf_req_put(req); diff --git a/src/engine/engine_pt.c b/src/engine/engine_pt.c index 8c5706dd..4e8f4467 100644 --- a/src/engine/engine_pt.c +++ b/src/engine/engine_pt.c @@ -20,20 +20,20 @@ static void _ocf_read_pt_complete(struct ocf_request *req, int error) { if (error) - req->error |= error; + env_atomic_cmpxchg(&req->error, 0, error); if (env_atomic_dec_return(&req->req_remaining)) return; OCF_DEBUG_RQ(req, "Completion"); - if (req->error) { + if (env_atomic_read(&req->error)) { req->info.core_error = 1; ocf_core_stats_core_error_update(req->core, OCF_READ); } /* Complete request */ - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); ocf_req_unlock_rd(ocf_cache_line_concurrency(req->cache), req); diff --git a/src/engine/engine_rd.c b/src/engine/engine_rd.c index 7d07dd0d..78a16d2c 100644 --- a/src/engine/engine_rd.c +++ b/src/engine/engine_rd.c @@ -28,7 +28,7 @@ static void _ocf_read_generic_hit_complete(struct ocf_request *req, int error) req->cache); if (error) { - req->error |= error; + env_atomic_cmpxchg(&req->error, 0, error); ocf_core_stats_cache_error_update(req->core, OCF_READ); inc_fallback_pt_error_counter(req->cache); } @@ -40,13 +40,13 @@ static void _ocf_read_generic_hit_complete(struct ocf_request *req, int error) if (env_atomic_dec_return(&req->req_remaining) == 0) { OCF_DEBUG_RQ(req, "HIT completion"); - if (req->error) { + if (env_atomic_read(&req->error)) { ocf_engine_push_req_front_pt(req); } else { ocf_req_unlock(c, req); /* Complete request */ - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); /* Free the request at the last point * of the completion path @@ -61,7 +61,7 @@ static void _ocf_read_generic_miss_complete(struct ocf_request *req, int error) struct ocf_cache *cache = req->cache; if (error) - req->error = error; + env_atomic_cmpxchg(&req->error, 0, error); /* Handle callback-caller race to let only one of the two complete the * request. Also, complete original request only if this is the last @@ -70,12 +70,12 @@ static void _ocf_read_generic_miss_complete(struct ocf_request *req, int error) if (env_atomic_dec_return(&req->req_remaining) == 0) { OCF_DEBUG_RQ(req, "MISS completion"); - if (req->error) { + if (env_atomic_read(&req->error)) { /* * --- Do not submit this request to write-back-thread. * Stop it here --- */ - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); req->info.core_error = 1; ocf_core_stats_core_error_update(req->core, OCF_READ); @@ -96,7 +96,7 @@ static void _ocf_read_generic_miss_complete(struct ocf_request *req, int error) req->byte_length); /* Complete request */ - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); ocf_engine_backfill(req); } diff --git a/src/engine/engine_wb.c b/src/engine/engine_wb.c index 15574aec..bceac385 100644 --- a/src/engine/engine_wb.c +++ b/src/engine/engine_wb.c @@ -49,17 +49,17 @@ static void _ocf_write_wb_update_bits(struct ocf_request *req) static void _ocf_write_wb_io_flush_metadata(struct ocf_request *req, int error) { if (error) - req->error = error; + env_atomic_cmpxchg(&req->error, 0, error); if (env_atomic_dec_return(&req->req_remaining)) return; - if (req->error) + if (env_atomic_read(&req->error)) ocf_engine_error(req, true, "Failed to write data to cache"); ocf_req_unlock_wr(ocf_cache_line_concurrency(req->cache), req); - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); ocf_req_put(req); } @@ -87,7 +87,7 @@ static void _ocf_write_wb_complete(struct ocf_request *req, int error) { if (error) { ocf_core_stats_cache_error_update(req->core, OCF_WRITE); - req->error |= error; + env_atomic_cmpxchg(&req->error, 0, error); } if (env_atomic_dec_return(&req->req_remaining)) @@ -95,10 +95,10 @@ static void _ocf_write_wb_complete(struct ocf_request *req, int error) OCF_DEBUG_RQ(req, "Completion"); - if (req->error) { + if (env_atomic_read(&req->error)) { ocf_engine_error(req, true, "Failed to write data to cache"); - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); ocf_engine_invalidate(req); } else { diff --git a/src/engine/engine_wi.c b/src/engine/engine_wi.c index bc6def53..a1416318 100644 --- a/src/engine/engine_wi.c +++ b/src/engine/engine_wi.c @@ -21,7 +21,7 @@ int _ocf_write_wi_next_pass(struct ocf_request *req) ocf_req_unlock_wr(ocf_cache_line_concurrency(req->cache), req); if (req->wi_second_pass) { - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); ocf_req_put(req); return 0; @@ -47,25 +47,25 @@ static void _ocf_write_wi_io_flush_metadata(struct ocf_request *req, int error) { if (error) { ocf_core_stats_cache_error_update(req->core, OCF_WRITE); - req->error |= error; + env_atomic_cmpxchg(&req->error, 0, error); } if (env_atomic_dec_return(&req->req_remaining)) return; - if (!req->error && !req->wi_second_pass && ocf_engine_is_miss(req)) { + if (!env_atomic_read(&req->error) && !req->wi_second_pass && ocf_engine_is_miss(req)) { /* need another pass */ ocf_engine_push_req_front_cb(req, _ocf_write_wi_next_pass, true); return; } - if (req->error) + if (env_atomic_read(&req->error)) ocf_engine_error(req, true, "Failed to write data to cache"); ocf_req_unlock_wr(ocf_cache_line_concurrency(req->cache), req); - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); ocf_req_put(req); } @@ -105,7 +105,7 @@ static int ocf_write_wi_update_and_flush_metadata(struct ocf_request *req) static void _ocf_write_wi_core_complete(struct ocf_request *req, int error) { if (error) { - req->error = error; + env_atomic_cmpxchg(&req->error, 0, error); req->info.core_error = 1; ocf_core_stats_core_error_update(req->core, OCF_WRITE); } @@ -115,10 +115,10 @@ static void _ocf_write_wi_core_complete(struct ocf_request *req, int error) OCF_DEBUG_RQ(req, "Completion"); - if (req->error) { + if (env_atomic_read(&req->error)) { ocf_req_unlock_wr(ocf_cache_line_concurrency(req->cache), req); - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); ocf_req_put(req); } else { diff --git a/src/engine/engine_wo.c b/src/engine/engine_wo.c index df056bf1..6cb8b02e 100644 --- a/src/engine/engine_wo.c +++ b/src/engine/engine_wo.c @@ -22,7 +22,7 @@ static void ocf_read_wo_cache_complete(struct ocf_request *req, int error) { if (error) { ocf_core_stats_cache_error_update(req->core, OCF_READ); - req->error |= error; + env_atomic_cmpxchg(&req->error, 0, error); } if (env_atomic_dec_return(&req->req_remaining)) @@ -30,13 +30,13 @@ static void ocf_read_wo_cache_complete(struct ocf_request *req, int error) OCF_DEBUG_RQ(req, "Completion"); - if (req->error) + if (env_atomic_read(&req->error)) ocf_engine_error(req, true, "Failed to read data from cache"); ocf_req_unlock_rd(ocf_cache_line_concurrency(req->cache), req); /* Complete request */ - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); /* Release OCF request */ ocf_req_put(req); @@ -153,16 +153,16 @@ static int ocf_read_wo_cache_do(struct ocf_request *req) static void _ocf_read_wo_core_complete(struct ocf_request *req, int error) { if (error) { - req->error |= error; + env_atomic_cmpxchg(&req->error, 0, error); req->info.core_error = 1; ocf_core_stats_core_error_update(req->core, OCF_READ); } /* if all mapped cachelines are clean, the data we've read from core * is valid and we can complete the request */ - if (!req->info.dirty_any || req->error) { + if (!req->info.dirty_any || env_atomic_read(&req->error)) { OCF_DEBUG_RQ(req, "Completion"); - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); ocf_req_unlock_rd(ocf_cache_line_concurrency(req->cache), req); ocf_req_put(req); return; diff --git a/src/engine/engine_wt.c b/src/engine/engine_wt.c index c8249994..748b5ca0 100644 --- a/src/engine/engine_wt.c +++ b/src/engine/engine_wt.c @@ -57,17 +57,17 @@ static void _ocf_write_wt_do_flush_metadata_compl(struct ocf_request *req, int error) { if (error) - req->error = error; + env_atomic_cmpxchg(&req->error, 0, error); if (env_atomic_dec_return(&req->req_remaining)) return; - if (req->error) + if (env_atomic_read(&req->error)) ocf_engine_error(req, true, "Failed to write data to cache"); ocf_req_unlock_wr(ocf_cache_line_concurrency(req->cache), req); - req->complete(req, req->info.core_error ? req->error : 0); + req->complete(req, req->info.core_error ? env_atomic_read(&req->error) : 0); ocf_req_put(req); } @@ -99,11 +99,11 @@ static void _ocf_write_wt_req_complete(struct ocf_request *req) OCF_DEBUG_RQ(req, "Completion"); - if (req->error) { + if (env_atomic_read(&req->error)) { /* An error occured */ /* Complete request */ - req->complete(req, req->info.core_error ? req->error : 0); + req->complete(req, req->info.core_error ? env_atomic_read(&req->error) : 0); ocf_engine_invalidate(req); @@ -117,7 +117,7 @@ static void _ocf_write_wt_req_complete(struct ocf_request *req) } else { ocf_req_unlock_wr(ocf_cache_line_concurrency(req->cache), req); - req->complete(req, req->info.core_error ? req->error : 0); + req->complete(req, req->info.core_error ? env_atomic_read(&req->error) : 0); ocf_req_put(req); } @@ -126,10 +126,10 @@ static void _ocf_write_wt_req_complete(struct ocf_request *req) static void _ocf_write_wt_cache_complete(struct ocf_request *req, int error) { if (error) { - req->error = req->error ?: error; + env_atomic_cmpxchg(&req->error, 0, env_atomic_read(&req->error) ?: error); ocf_core_stats_cache_error_update(req->core, OCF_WRITE); - if (req->error) + if (env_atomic_read(&req->error)) inc_fallback_pt_error_counter(req->cache); } @@ -139,7 +139,7 @@ static void _ocf_write_wt_cache_complete(struct ocf_request *req, int error) static void _ocf_write_wt_core_complete(struct ocf_request *req, int error) { if (error) { - req->error = error; + env_atomic_cmpxchg(&req->error, 0, error); req->info.core_error = 1; ocf_core_stats_core_error_update(req->core, OCF_WRITE); } diff --git a/src/engine/engine_zero.c b/src/engine/engine_zero.c index 5d6352bc..a6051e67 100644 --- a/src/engine/engine_zero.c +++ b/src/engine/engine_zero.c @@ -18,7 +18,7 @@ static int ocf_zero_purge(struct ocf_request *req) { - if (req->error) { + if (env_atomic_read(&req->error)) { ocf_engine_error(req, true, "Failed to discard data on cache"); } else { /* There are mapped cache line, need to remove them */ @@ -33,7 +33,7 @@ static int ocf_zero_purge(struct ocf_request *req) ocf_req_unlock_wr(ocf_cache_line_concurrency(req->cache), req); - req->complete(req, req->error); + req->complete(req, env_atomic_read(&req->error)); ocf_req_put(req); @@ -44,7 +44,7 @@ static void _ocf_zero_io_flush_metadata(struct ocf_request *req, int error) { if (error) { ocf_core_stats_cache_error_update(req->core, OCF_WRITE); - req->error = error; + env_atomic_cmpxchg(&req->error, 0, error); } if (env_atomic_dec_return(&req->req_remaining)) diff --git a/src/metadata/metadata_raw.c b/src/metadata/metadata_raw.c index 867d7a9a..69737850 100644 --- a/src/metadata/metadata_raw.c +++ b/src/metadata/metadata_raw.c @@ -1,5 +1,5 @@ /* - * Copyright(c) 2012-2021 Intel Corporation + * Copyright(c) 2012-2022 Intel Corporation * SPDX-License-Identifier: BSD-3-Clause */ @@ -461,7 +461,7 @@ static void _raw_ram_flush_do_asynch_io_complete(ocf_cache_t cache, OCF_DEBUG_MSG(cache, "Asynchronous flushing complete"); /* Call metadata flush completed call back */ - ctx->req->error |= ctx->error; + env_atomic_cmpxchg(&ctx->req->error, 0, ctx->error); ctx->complete(ctx->req, ctx->error); env_free(ctx); diff --git a/src/metadata/metadata_raw_atomic.c b/src/metadata/metadata_raw_atomic.c index 7db099df..37f2ce14 100644 --- a/src/metadata/metadata_raw_atomic.c +++ b/src/metadata/metadata_raw_atomic.c @@ -41,18 +41,18 @@ static void _raw_atomic_io_discard_cmpl(struct _raw_atomic_flush_ctx *ctx, int error) { if (error) - ctx->req->error = error; + env_atomic_cmpxchg(&ctx->req->error, 0, error); if (env_atomic_dec_return(&ctx->flush_req_cnt)) return; - if (ctx->req->error) + if (env_atomic_read(&ctx->req->error)) ocf_metadata_error(ctx->req->cache); /* Call metadata flush completed call back */ OCF_DEBUG_MSG(cache, "Asynchronous flushing complete"); - ctx->complete(ctx->req, ctx->req->error); + ctx->complete(ctx->req, env_atomic_read(&ctx->req->error)); env_free(ctx); } @@ -74,8 +74,8 @@ static int _raw_atomic_io_discard_do(struct ocf_cache *cache, void *context, io = ocf_new_cache_io(cache, NULL, start_addr, len, OCF_WRITE, 0, 0); if (!io) { - req->error = -OCF_ERR_NO_MEM; - return req->error; + env_atomic_cmpxchg(&req->error, 0, -OCF_ERR_NO_MEM); + return env_atomic_read(&ctx->req->error); } OCF_DEBUG_PARAM(cache, "Page to flushing = %u, count of pages = %u", @@ -90,7 +90,7 @@ static int _raw_atomic_io_discard_do(struct ocf_cache *cache, void *context, else ocf_volume_submit_write_zeroes(io); - return req->error; + return env_atomic_read(&req->error); } void raw_atomic_flush_mark(struct ocf_cache *cache, struct ocf_request *req, diff --git a/src/ocf_request.c b/src/ocf_request.c index cb82561c..291dfde0 100644 --- a/src/ocf_request.c +++ b/src/ocf_request.c @@ -155,7 +155,7 @@ int ocf_req_alloc_map(struct ocf_request *req) ocf_req_sizeof_alock_status(req->core_line_count), ENV_MEM_NOIO); if (!req->map) { - req->error = -OCF_ERR_NO_MEM; + env_atomic_cmpxchg(&req->error, 0, -OCF_ERR_NO_MEM); return -OCF_ERR_NO_MEM; } diff --git a/src/ocf_request.h b/src/ocf_request.h index 47252903..aa6b1cfd 100644 --- a/src/ocf_request.h +++ b/src/ocf_request.h @@ -161,7 +161,7 @@ struct ocf_request { uint32_t alloc_core_line_count; /*! Number of core lines at time of request allocation */ - int error; + env_atomic error; /*!< This filed indicates an error for OCF request */ ocf_part_id_t part_id; diff --git a/src/utils/utils_cleaner.c b/src/utils/utils_cleaner.c index dcca1aa6..f2ae82b9 100644 --- a/src/utils/utils_cleaner.c +++ b/src/utils/utils_cleaner.c @@ -164,7 +164,7 @@ static void _ocf_cleaner_set_error(struct ocf_request *req) return; } - master->error = -OCF_ERR_IO; + env_atomic_cmpxchg(&master->error, 0, -OCF_ERR_IO); } static void _ocf_cleaner_complete_req(struct ocf_request *req) @@ -195,7 +195,7 @@ static void _ocf_cleaner_complete_req(struct ocf_request *req) /* Only master contains completion function and completion context */ cmpl = master->master_io_req; - cmpl(master->priv, master->error); + cmpl(master->priv, master->error.counter); } static void _ocf_cleaner_on_resume(struct ocf_request *req) @@ -263,7 +263,7 @@ static void _ocf_cleaner_flush_cache_io_end(struct ocf_io *io, int error) if (error) { ocf_metadata_error(req->cache); - req->error = error; + env_atomic_cmpxchg(&req->error, 0, error); } OCF_DEBUG_MSG(req->cache, "Cache flush finished"); @@ -282,7 +282,7 @@ static int _ocf_cleaner_fire_flush_cache(struct ocf_request *req) io = ocf_new_cache_io(req->cache, req->io_queue, 0, 0, OCF_WRITE, 0, 0); if (!io) { ocf_metadata_error(req->cache); - req->error = -OCF_ERR_NO_MEM; + env_atomic_cmpxchg(&req->error, 0, -OCF_ERR_NO_MEM); return -OCF_ERR_NO_MEM; } @@ -297,7 +297,7 @@ static void _ocf_cleaner_metadata_io_end(struct ocf_request *req, int error) { if (error) { ocf_metadata_error(req->cache); - req->error = error; + env_atomic_cmpxchg(&req->error, 0, error); _ocf_cleaner_finish_req(req); return; } @@ -791,7 +791,7 @@ static inline uint32_t _ocf_cleaner_get_req_max_count(uint32_t count, static void _ocf_cleaner_fire_error(struct ocf_request *master, struct ocf_request *req, int err) { - master->error = err; + env_atomic_cmpxchg(&master->error, 0, err); _ocf_cleaner_complete_req(req); _ocf_cleaner_dealloc_req(req); } @@ -865,7 +865,7 @@ void ocf_cleaner_fire(struct ocf_cache *cache, /* when request allocation failed stop processing */ if (!req) { - master->error = -OCF_ERR_NO_MEM; + env_atomic_cmpxchg(&master->error, 0, -OCF_ERR_NO_MEM); break; }