diff --git a/src/engine/engine_d2c.c b/src/engine/engine_d2c.c index 31730283..02cd21e7 100644 --- a/src/engine/engine_d2c.c +++ b/src/engine/engine_d2c.c @@ -21,10 +21,8 @@ static void _ocf_d2c_completion(struct ocf_request *req, int error) OCF_DEBUG_RQ(req, "Completion"); - if (req->error) { - req->info.core_error = 1; + if (req->error) ocf_core_stats_core_error_update(req->core, req->rw); - } /* Complete request */ req->complete(req, req->error); diff --git a/src/engine/engine_pt.c b/src/engine/engine_pt.c index fe249bd8..eec4afc2 100644 --- a/src/engine/engine_pt.c +++ b/src/engine/engine_pt.c @@ -28,10 +28,8 @@ static void _ocf_read_pt_complete(struct ocf_request *req, int error) OCF_DEBUG_RQ(req, "Completion"); - if (req->error) { - req->info.core_error = 1; + if (req->error) ocf_core_stats_core_error_update(req->core, OCF_READ); - } /* Complete request */ req->complete(req, req->error); diff --git a/src/engine/engine_rd.c b/src/engine/engine_rd.c index 3cf67c75..4721768a 100644 --- a/src/engine/engine_rd.c +++ b/src/engine/engine_rd.c @@ -78,7 +78,6 @@ static void _ocf_read_generic_miss_complete(struct ocf_request *req, int error) */ req->complete(req, req->error); - req->info.core_error = 1; ocf_core_stats_core_error_update(req->core, OCF_READ); ctx_data_free(cache->owner, req->cp_data); diff --git a/src/engine/engine_wi.c b/src/engine/engine_wi.c index 4ebb39e2..d2bf8cc6 100644 --- a/src/engine/engine_wi.c +++ b/src/engine/engine_wi.c @@ -107,7 +107,6 @@ static void _ocf_write_wi_core_complete(struct ocf_request *req, int error) { if (error) { req->error = error; - req->info.core_error = 1; ocf_core_stats_core_error_update(req->core, OCF_WRITE); } diff --git a/src/engine/engine_wo.c b/src/engine/engine_wo.c index 9414bda9..ea2c4edb 100644 --- a/src/engine/engine_wo.c +++ b/src/engine/engine_wo.c @@ -156,7 +156,6 @@ static void _ocf_read_wo_core_complete(struct ocf_request *req, int error) { if (error) { req->error |= error; - req->info.core_error = 1; ocf_core_stats_core_error_update(req->core, OCF_READ); } diff --git a/src/engine/engine_wt.c b/src/engine/engine_wt.c index 4dcce9bd..b4a8d7f9 100644 --- a/src/engine/engine_wt.c +++ b/src/engine/engine_wt.c @@ -68,7 +68,7 @@ static void _ocf_write_wt_do_flush_metadata_compl(struct ocf_request *req, ocf_req_unlock_wr(ocf_cache_line_concurrency(req->cache), req); - req->complete(req, req->info.core_error ? req->error : 0); + req->complete(req, error); ocf_req_put(req); } @@ -100,14 +100,9 @@ static void _ocf_write_wt_req_complete(struct ocf_request *req) OCF_DEBUG_RQ(req, "Completion"); - if (req->error) { - /* An error occured */ - - /* Complete request */ - req->complete(req, req->info.core_error ? req->error : 0); - + if (req->info.cache_error || req->info.core_error) { + req->complete(req, req->error); ocf_engine_invalidate(req); - return; } @@ -117,9 +112,7 @@ static void _ocf_write_wt_req_complete(struct ocf_request *req) OCF_QUEUE_ALLOW_SYNC | OCF_QUEUE_PRIO_HIGH); } 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, 0); ocf_req_put(req); } } @@ -127,11 +120,14 @@ 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; + /* Cache error code is not propagated further to the user here + * because data could be successfully written to the core device + * despite the cache IO error. + * Error flag is set though to indicate that the error occurred + * and to invalidate the request in completion. */ + req->info.cache_error = 1; ocf_core_stats_cache_error_update(req->core, OCF_WRITE); - - if (req->error) - inc_fallback_pt_error_counter(req->cache); + inc_fallback_pt_error_counter(req->cache); } _ocf_write_wt_req_complete(req); diff --git a/src/ocf_request.h b/src/ocf_request.h index 3ea539fe..2ce0f532 100644 --- a/src/ocf_request.h +++ b/src/ocf_request.h @@ -55,8 +55,11 @@ struct ocf_req_info { uint32_t cleaning_required : 1; /*!< Eviction failed, need to request cleaning */ + uint32_t cache_error : 1; + /*!< Error occurred during I/O on cache device */ + uint32_t core_error : 1; - /*!< Error occured during I/O on core device */ + /*!< Error occurred during I/O on core device */ uint32_t cleaner_cache_line_lock : 1; /*!< Cleaner flag - acquire cache line lock */ @@ -192,6 +195,12 @@ struct ocf_request { int error; /*!< This filed indicates an error for OCF request */ + int cache_error; + /*!< Indicator of forward IO cache device error */ + + int core_error; + /*!< Indicator of forward IO core device error */ + ocf_part_id_t part_id; /*!< Targeted partition of requests */