Merge pull request #1004 from robertbaldyga/io-path-map-error
Map OCF error codes to errno in io path
This commit is contained in:
commit
f3c64d2538
@ -6,10 +6,12 @@
|
|||||||
#include "cas_cache.h"
|
#include "cas_cache.h"
|
||||||
|
|
||||||
|
|
||||||
struct {
|
struct cas_error_map_entry {
|
||||||
int cas_error;
|
int cas_err;
|
||||||
int std_error;
|
int errno;
|
||||||
} static cas_error_code_map[] = {
|
};
|
||||||
|
|
||||||
|
static struct cas_error_map_entry cas_ocf_error_map[] = {
|
||||||
/* OCF error mappings*/
|
/* OCF error mappings*/
|
||||||
{ OCF_ERR_INVAL, EINVAL },
|
{ OCF_ERR_INVAL, EINVAL },
|
||||||
{ OCF_ERR_AGAIN, EAGAIN },
|
{ OCF_ERR_AGAIN, EAGAIN },
|
||||||
@ -46,8 +48,15 @@ struct {
|
|||||||
{ OCF_ERR_CORE_IN_INACTIVE_STATE, ENODEV },
|
{ OCF_ERR_CORE_IN_INACTIVE_STATE, ENODEV },
|
||||||
{ OCF_ERR_INVALID_CACHE_MODE, EINVAL },
|
{ OCF_ERR_INVALID_CACHE_MODE, EINVAL },
|
||||||
{ OCF_ERR_INVALID_CACHE_LINE_SIZE, EINVAL },
|
{ OCF_ERR_INVALID_CACHE_LINE_SIZE, EINVAL },
|
||||||
|
{ OCF_ERR_CACHE_NAME_MISMATCH, EINVAL },
|
||||||
{ OCF_ERR_INVAL_CACHE_DEV, 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*/
|
/* CAS kernel error mappings*/
|
||||||
{ KCAS_ERR_ROOT, EPERM },
|
{ KCAS_ERR_ROOT, EPERM },
|
||||||
{ KCAS_ERR_SYSTEM, EINVAL },
|
{ KCAS_ERR_SYSTEM, EINVAL },
|
||||||
@ -63,26 +72,43 @@ struct {
|
|||||||
{ KCAS_ERR_A_PART, EINVAL },
|
{ KCAS_ERR_A_PART, EINVAL },
|
||||||
{ KCAS_ERR_DETACHED, EIO },
|
{ KCAS_ERR_DETACHED, EIO },
|
||||||
{ KCAS_ERR_STOPPED_DIRTY, 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_CORE_IN_ACTIVE_STATE, ENODEV },
|
||||||
|
{ KCAS_ERR_INACTIVE_CORE_IS_DIRTY, ENODEV },
|
||||||
};
|
};
|
||||||
|
|
||||||
/*******************************************/
|
/*******************************************/
|
||||||
/* Helper which change cas-specific error */
|
/* Helper which change cas-specific error */
|
||||||
/* codes to kernel generic error codes */
|
/* 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;
|
int i;
|
||||||
|
|
||||||
if (cas_error_code == 0)
|
if (error_code == 0)
|
||||||
return 0; /* No Error */
|
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 (error_code >= OCF_ERR_MIN && error_code <= OCF_ERR_MAX) {
|
||||||
if (cas_error_code_map[i].cas_error == cas_error_code)
|
for (i = 0; i < ARRAY_SIZE(cas_ocf_error_map); i++) {
|
||||||
return -cas_error_code_map[i].std_error;
|
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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
cas_generic_end_io_acct(master->bio, master->start_time);
|
||||||
|
|
||||||
result = master->error ? -EIO : 0;
|
result = map_cas_err_to_generic(master->error);
|
||||||
CAS_BIO_ENDIO(master->bio, master->master_size, CAS_ERRNO_TO_BLK_STS(result));
|
CAS_BIO_ENDIO(master->bio, master->master_size,
|
||||||
|
CAS_ERRNO_TO_BLK_STS(result));
|
||||||
cas_free_blk_data(master);
|
cas_free_blk_data(master);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -340,7 +341,7 @@ err:
|
|||||||
static void blkdev_complete_discard(struct ocf_io *io, int error)
|
static void blkdev_complete_discard(struct ocf_io *io, int error)
|
||||||
{
|
{
|
||||||
struct bio *bio = io->priv1;
|
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));
|
CAS_BIO_ENDIO(bio, CAS_BIO_BISIZE(bio), CAS_ERRNO_TO_BLK_STS(result));
|
||||||
ocf_io_put(io);
|
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 bio *bio = io->priv1;
|
||||||
struct bd_object *bvol = io->priv2;
|
struct bd_object *bvol = io->priv2;
|
||||||
int result = error ? -EIO : 0;
|
int result = map_cas_err_to_generic(error);
|
||||||
|
|
||||||
ocf_io_put(io);
|
ocf_io_put(io);
|
||||||
|
|
||||||
|
@ -507,8 +507,10 @@ struct kcas_failover_activate
|
|||||||
* Extended kernel CAS error codes
|
* Extended kernel CAS error codes
|
||||||
*/
|
*/
|
||||||
enum kcas_error {
|
enum kcas_error {
|
||||||
|
KCAS_ERR_MIN = 2000000,
|
||||||
|
|
||||||
/** Must be root */
|
/** Must be root */
|
||||||
KCAS_ERR_ROOT = 2000000,
|
KCAS_ERR_ROOT = KCAS_ERR_MIN,
|
||||||
|
|
||||||
/** System Error */
|
/** System Error */
|
||||||
KCAS_ERR_SYSTEM,
|
KCAS_ERR_SYSTEM,
|
||||||
@ -571,7 +573,9 @@ enum kcas_error {
|
|||||||
KCAS_ERR_CORE_IN_ACTIVE_STATE,
|
KCAS_ERR_CORE_IN_ACTIVE_STATE,
|
||||||
|
|
||||||
/** Inactive core has dirty data assigned */
|
/** 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
|
#endif
|
||||||
|
2
ocf
2
ocf
@ -1 +1 @@
|
|||||||
Subproject commit 8669a296ccd87f5dc274920cf613143f74cb8cb3
|
Subproject commit e72018bc02478f3ac73ee8984fafaf61f09c425d
|
Loading…
Reference in New Issue
Block a user