diff --git a/modules/cas_cache/utils/cas_err.h b/modules/cas_cache/utils/cas_err.h index e221cb7..45880c7 100644 --- a/modules/cas_cache/utils/cas_err.h +++ b/modules/cas_cache/utils/cas_err.h @@ -6,10 +6,12 @@ #include "cas_cache.h" -struct { - int cas_error; - int std_error; -} static cas_error_code_map[] = { +struct cas_error_map_entry { + int cas_err; + int errno; +}; + +static struct cas_error_map_entry cas_ocf_error_map[] = { /* OCF error mappings*/ { OCF_ERR_INVAL, EINVAL }, { OCF_ERR_AGAIN, EAGAIN }, @@ -46,8 +48,15 @@ struct { { OCF_ERR_CORE_IN_INACTIVE_STATE, ENODEV }, { OCF_ERR_INVALID_CACHE_MODE, EINVAL }, { OCF_ERR_INVALID_CACHE_LINE_SIZE, EINVAL }, + { OCF_ERR_CACHE_NAME_MISMATCH, EINVAL }, { OCF_ERR_INVAL_CACHE_DEV, EINVAL }, + { OCF_ERR_CORE_UUID_EXISTS, EINVAL }, + { OCF_ERR_METADATA_LAYOUT_MISMATCH, EINVAL }, + { OCF_ERR_CACHE_LINE_SIZE_MISMATCH, EINVAL }, + { OCF_ERR_CACHE_STANDBY, EBUSY }, +}; +static struct cas_error_map_entry cas_error_map[] = { /* CAS kernel error mappings*/ { KCAS_ERR_ROOT, EPERM }, { KCAS_ERR_SYSTEM, EINVAL }, @@ -61,28 +70,45 @@ struct { { KCAS_ERR_NVME_BAD_FORMAT, EINVAL }, { KCAS_ERR_CONTAINS_PART, EINVAL }, { KCAS_ERR_A_PART, EINVAL }, - { KCAS_ERR_DETACHED, EIO }, + { KCAS_ERR_DETACHED, EIO }, { KCAS_ERR_STOPPED_DIRTY, EIO }, + { KCAS_ERR_CORE_POOL_NOT_EMPTY, EEXIST }, + { KCAS_ERR_NO_CACHE_ATTACHED, ENODEV }, + { KCAS_ERR_CLS_RULE_INVALID_SYNTAX, EINVAL }, + { KCAS_ERR_CLS_RULE_UNKNOWN_CONDITION, EINVAL }, + { KCAS_ERR_WAITING_INTERRUPTED, EINTR }, { KCAS_ERR_CORE_IN_ACTIVE_STATE, ENODEV }, + { KCAS_ERR_INACTIVE_CORE_IS_DIRTY, ENODEV }, }; /*******************************************/ /* Helper which change cas-specific error */ /* codes to kernel generic error codes */ /*******************************************/ -static inline int map_cas_err_to_generic(int cas_error_code) +static inline int map_cas_err_to_generic(int error_code) { int i; - if (cas_error_code == 0) + if (error_code == 0) return 0; /* No Error */ - cas_error_code = abs(cas_error_code); + error_code = abs(error_code); - for (i = 0; i < ARRAY_SIZE(cas_error_code_map); i++) { - if (cas_error_code_map[i].cas_error == cas_error_code) - return -cas_error_code_map[i].std_error; + if (error_code >= OCF_ERR_MIN && error_code <= OCF_ERR_MAX) { + for (i = 0; i < ARRAY_SIZE(cas_ocf_error_map); i++) { + if (cas_ocf_error_map[i].cas_err == error_code) + return -cas_ocf_error_map[i].errno; + return -EINVAL; + } } - return -cas_error_code; + if (error_code >= KCAS_ERR_MIN && error_code <= KCAS_ERR_MAX) { + for (i = 0; i < ARRAY_SIZE(cas_error_map); i++) { + if (cas_error_map[i].cas_err == error_code) + return -cas_error_map[i].errno; + return -EINVAL; + } + } + + return -error_code; } diff --git a/modules/cas_cache/volume/vol_block_dev_top.c b/modules/cas_cache/volume/vol_block_dev_top.c index 2a682ea..e4ed365 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.c +++ b/modules/cas_cache/volume/vol_block_dev_top.c @@ -204,8 +204,9 @@ static void blkdev_complete_data_master(struct blk_data *master, int error) cas_generic_end_io_acct(master->bio, master->start_time); - result = master->error ? -EIO : 0; - CAS_BIO_ENDIO(master->bio, master->master_size, CAS_ERRNO_TO_BLK_STS(result)); + result = map_cas_err_to_generic(master->error); + CAS_BIO_ENDIO(master->bio, master->master_size, + CAS_ERRNO_TO_BLK_STS(result)); cas_free_blk_data(master); } @@ -340,7 +341,7 @@ err: static void blkdev_complete_discard(struct ocf_io *io, int error) { struct bio *bio = io->priv1; - int result = error ? -EIO : 0; + int result = map_cas_err_to_generic(error); CAS_BIO_ENDIO(bio, CAS_BIO_BISIZE(bio), CAS_ERRNO_TO_BLK_STS(result)); ocf_io_put(io); @@ -382,7 +383,7 @@ static void blkdev_complete_flush(struct ocf_io *io, int error) { struct bio *bio = io->priv1; struct bd_object *bvol = io->priv2; - int result = error ? -EIO : 0; + int result = map_cas_err_to_generic(error); ocf_io_put(io); diff --git a/modules/include/cas_ioctl_codes.h b/modules/include/cas_ioctl_codes.h index ba578bf..0800c31 100644 --- a/modules/include/cas_ioctl_codes.h +++ b/modules/include/cas_ioctl_codes.h @@ -507,8 +507,10 @@ struct kcas_failover_activate * Extended kernel CAS error codes */ enum kcas_error { + KCAS_ERR_MIN = 2000000, + /** Must be root */ - KCAS_ERR_ROOT = 2000000, + KCAS_ERR_ROOT = KCAS_ERR_MIN, /** System Error */ KCAS_ERR_SYSTEM, @@ -571,7 +573,9 @@ enum kcas_error { KCAS_ERR_CORE_IN_ACTIVE_STATE, /** Inactive core has dirty data assigned */ - KCAS_ERR_INACTIVE_CORE_IS_DIRTY + KCAS_ERR_INACTIVE_CORE_IS_DIRTY, + + KCAS_ERR_MAX = KCAS_ERR_INACTIVE_CORE_IS_DIRTY, }; #endif diff --git a/ocf b/ocf index 8669a29..e72018b 160000 --- a/ocf +++ b/ocf @@ -1 +1 @@ -Subproject commit 8669a296ccd87f5dc274920cf613143f74cb8cb3 +Subproject commit e72018bc02478f3ac73ee8984fafaf61f09c425d