2022-07-17 22:31:21 -04:00
// SPDX-License-Identifier: GPL-2.0
# include "bcachefs.h"
# include "errcode.h"
2024-02-21 22:10:09 -05:00
# include "trace.h"
2022-07-17 22:31:21 -04:00
# include <linux/errname.h>
static const char * const bch2_errcode_strs [ ] = {
# define x(class, err) [BCH_ERR_##err - BCH_ERR_START] = #err,
BCH_ERRCODES ( )
# undef x
NULL
} ;
static unsigned bch2_errcode_parents [ ] = {
2022-09-18 15:43:50 -04:00
# define x(class, err) [BCH_ERR_##err - BCH_ERR_START] = class,
2022-07-17 22:31:21 -04:00
BCH_ERRCODES ( )
# undef x
} ;
const char * bch2_err_str ( int err )
{
const char * errstr ;
2022-10-22 15:59:53 -04:00
2022-07-17 22:31:21 -04:00
err = abs ( err ) ;
BUG_ON ( err > = BCH_ERR_MAX ) ;
if ( err > = BCH_ERR_START )
errstr = bch2_errcode_strs [ err - BCH_ERR_START ] ;
else if ( err )
errstr = errname ( err ) ;
else
errstr = " (No error) " ;
return errstr ? : " (Invalid error) " ;
}
bool __bch2_err_matches ( int err , int class )
{
err = abs ( err ) ;
class = abs ( class ) ;
BUG_ON ( err > = BCH_ERR_MAX ) ;
BUG_ON ( class > = BCH_ERR_MAX ) ;
while ( err > = BCH_ERR_START & & err ! = class )
err = bch2_errcode_parents [ err - BCH_ERR_START ] ;
return err = = class ;
}
2022-09-18 15:43:50 -04:00
2024-02-21 22:10:09 -05:00
int __bch2_err_class ( int bch_err )
2022-09-18 15:43:50 -04:00
{
2024-02-21 22:10:09 -05:00
int std_err = - bch_err ;
BUG_ON ( ( unsigned ) std_err > = BCH_ERR_MAX ) ;
2022-09-18 15:43:50 -04:00
2024-02-21 22:10:09 -05:00
while ( std_err > = BCH_ERR_START & & bch2_errcode_parents [ std_err - BCH_ERR_START ] )
std_err = bch2_errcode_parents [ std_err - BCH_ERR_START ] ;
trace_error_downcast ( bch_err , std_err , _RET_IP_ ) ;
2022-09-18 15:43:50 -04:00
2024-02-21 22:10:09 -05:00
return - std_err ;
2022-09-18 15:43:50 -04:00
}
2023-09-10 18:05:17 -04:00
const char * bch2_blk_status_to_str ( blk_status_t status )
{
if ( status = = BLK_STS_REMOVED )
return " device removed " ;
return blk_status_to_str ( status ) ;
}