1 // SPDX-License-Identifier: GPL-2.0 1 // SPDX-License-Identifier: GPL-2.0 2 2 3 #include "bcachefs.h" 3 #include "bcachefs.h" 4 #include "errcode.h" 4 #include "errcode.h" 5 #include "trace.h" 5 #include "trace.h" 6 6 7 #include <linux/errname.h> 7 #include <linux/errname.h> 8 8 9 static const char * const bch2_errcode_strs[] 9 static const char * const bch2_errcode_strs[] = { 10 #define x(class, err) [BCH_ERR_##err - BCH_ERR 10 #define x(class, err) [BCH_ERR_##err - BCH_ERR_START] = #err, 11 BCH_ERRCODES() 11 BCH_ERRCODES() 12 #undef x 12 #undef x 13 NULL 13 NULL 14 }; 14 }; 15 15 16 static unsigned bch2_errcode_parents[] = { 16 static unsigned bch2_errcode_parents[] = { 17 #define x(class, err) [BCH_ERR_##err - BCH_ERR 17 #define x(class, err) [BCH_ERR_##err - BCH_ERR_START] = class, 18 BCH_ERRCODES() 18 BCH_ERRCODES() 19 #undef x 19 #undef x 20 }; 20 }; 21 21 22 const char *bch2_err_str(int err) 22 const char *bch2_err_str(int err) 23 { 23 { 24 const char *errstr; 24 const char *errstr; 25 25 26 err = abs(err); 26 err = abs(err); 27 27 28 BUG_ON(err >= BCH_ERR_MAX); 28 BUG_ON(err >= BCH_ERR_MAX); 29 29 30 if (err >= BCH_ERR_START) 30 if (err >= BCH_ERR_START) 31 errstr = bch2_errcode_strs[err 31 errstr = bch2_errcode_strs[err - BCH_ERR_START]; 32 else if (err) 32 else if (err) 33 errstr = errname(err); 33 errstr = errname(err); 34 else 34 else 35 errstr = "(No error)"; 35 errstr = "(No error)"; 36 return errstr ?: "(Invalid error)"; 36 return errstr ?: "(Invalid error)"; 37 } 37 } 38 38 39 bool __bch2_err_matches(int err, int class) 39 bool __bch2_err_matches(int err, int class) 40 { 40 { 41 err = abs(err); 41 err = abs(err); 42 class = abs(class); 42 class = abs(class); 43 43 44 BUG_ON(err >= BCH_ERR_MAX); 44 BUG_ON(err >= BCH_ERR_MAX); 45 BUG_ON(class >= BCH_ERR_MAX); 45 BUG_ON(class >= BCH_ERR_MAX); 46 46 47 while (err >= BCH_ERR_START && err != 47 while (err >= BCH_ERR_START && err != class) 48 err = bch2_errcode_parents[err 48 err = bch2_errcode_parents[err - BCH_ERR_START]; 49 49 50 return err == class; 50 return err == class; 51 } 51 } 52 52 53 int __bch2_err_class(int bch_err) 53 int __bch2_err_class(int bch_err) 54 { 54 { 55 int std_err = -bch_err; 55 int std_err = -bch_err; 56 BUG_ON((unsigned) std_err >= BCH_ERR_M 56 BUG_ON((unsigned) std_err >= BCH_ERR_MAX); 57 57 58 while (std_err >= BCH_ERR_START && bch 58 while (std_err >= BCH_ERR_START && bch2_errcode_parents[std_err - BCH_ERR_START]) 59 std_err = bch2_errcode_parents 59 std_err = bch2_errcode_parents[std_err - BCH_ERR_START]; 60 60 61 trace_error_downcast(bch_err, std_err, 61 trace_error_downcast(bch_err, std_err, _RET_IP_); 62 62 63 return -std_err; 63 return -std_err; 64 } 64 } 65 65 66 const char *bch2_blk_status_to_str(blk_status_ 66 const char *bch2_blk_status_to_str(blk_status_t status) 67 { 67 { 68 if (status == BLK_STS_REMOVED) 68 if (status == BLK_STS_REMOVED) 69 return "device removed"; 69 return "device removed"; 70 return blk_status_to_str(status); 70 return blk_status_to_str(status); 71 } 71 } 72 72
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.