diff --git a/nos/extend_features/ext4_err_report/Kconfig b/nos/extend_features/ext4_err_report/Kconfig new file mode 100644 index 0000000000000000000000000000000000000000..047cd6d7168ce002a0bf671956474edd8f88d9a5 --- /dev/null +++ b/nos/extend_features/ext4_err_report/Kconfig @@ -0,0 +1,5 @@ +config EXT4_ERR_REPORT + tristate "ext4 error report" + default m + help + Ext4 error report diff --git a/nos/extend_features/ext4_err_report/Makefile b/nos/extend_features/ext4_err_report/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..fa91c693635eb2bf4af1ddbcc5830e44b95010fd --- /dev/null +++ b/nos/extend_features/ext4_err_report/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_EXT4_ERR_REPORT) += ext4_err_report.o diff --git a/nos/extend_features/ext4_err_report/ext4_err_report.c b/nos/extend_features/ext4_err_report/ext4_err_report.c new file mode 100644 index 0000000000000000000000000000000000000000..3cb1b6d54e586ac63011cf94899c08f21065b891 --- /dev/null +++ b/nos/extend_features/ext4_err_report/ext4_err_report.c @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * ext4_err_report.c + * + * Copyright (C) 2024 ZTE Corporation. All rights reserved. + */ +#include +#include +#include +#ifdef CONFIG_HOBOT_FUSA_DIAG +#include +#endif +#include +#include +#include + +#ifdef CONFIG_HOBOT_FUSA_DIAG +int32_t diag_register_kernel_fs(void) +{ + struct diag_register_info *register_info; + int32_t ret; + + register_info = kmalloc((size_t)sizeof(struct diag_register_info), + GFP_KERNEL); + if (!register_info) + return -ENOMEM; + + register_info->module_id = (uint16_t)ModuleDiag_kernel_fs; + register_info->event_cnt = 2; + + register_info->event_handle[0].event_id = + (uint8_t)EventIdEXT4RO; + register_info->event_handle[0].min_snd_ms = 20; + register_info->event_handle[0].max_snd_ms = 100; + register_info->event_handle[0].cb = NULL; + register_info->event_handle[0].data = NULL; + + register_info->event_handle[1].event_id = + (uint8_t)EventIdEXT4Err; + register_info->event_handle[1].min_snd_ms = 20; + register_info->event_handle[1].max_snd_ms = 100; + register_info->event_handle[1].cb = NULL; + register_info->event_handle[1].data = NULL; + + ret = diagnose_register(register_info); + if (ret != 0) { + kfree(register_info); + return ret; + } + + kfree(register_info); + return 0; +} + +int32_t diag_unregister_kernel_fs(void) +{ + int32_t ret; + + ret = diagnose_unregister((uint16_t)ModuleDiag_kernel_fs); + if (ret != 0) + return ret; + return 0; +} + +int32_t diag_send_event_kernel_fs(uint16_t event_id, uint8_t event_prio) +{ + struct diag_event event; + int32_t ret; + + event.module_id = (uint16_t)ModuleDiag_kernel_fs; + event.event_id = event_id; + event.event_prio = event_prio; + event.event_sta = (uint8_t)DiagEventStaFail; + event.fchm_err_code = 0xFFFF; + event.env_len = 0; + ret = diagnose_send_event(&event); + if (ret != 0) + return -1; + return 0; +} +#endif + +static void ext4_report_hook(void *ignore, struct super_block *sb, + const char *function, unsigned int line) +{ +#ifdef CONFIG_HOBOT_FUSA_DIAG + uint16_t event_id = 0; + uint8_t diag_msg_level = 0; + + if (sb->s_flags & SB_RDONLY) { + event_id = (uint16_t)EventIdEXT4RO; + diag_msg_level = (uint8_t)DiagMsgPrioMid; + } else { + event_id = (uint16_t)EventIdEXT4Err; + diag_msg_level = (uint8_t)DiagMsgPrioMid; + } + + diag_send_event_kernel_fs(event_id, diag_msg_level); +#endif + +} + +/* Started by AICoder, pid:5d0de557383767d1478308daf0824f238a41c7b8 */ +static void register_tracepoint_by_name(struct tracepoint *tp, void *priv) +{ + int ret; + + if (strncmp(tp->name, "ext4_error", sizeof("ext4_error") - 1) == 0) { + ret = tracepoint_probe_register(tp, ext4_report_hook, NULL); + if (ret != 0) + pr_err("register trace ext4_error failed: %d\n", ret); + } +} + +static void unregister_tracepoint_by_name(struct tracepoint *tp, void *priv) +{ + int ret; + + if (strncmp(tp->name, "ext4_error", sizeof("ext4_error") - 1) == 0) { + ret = tracepoint_probe_unregister(tp, ext4_report_hook, NULL); + if (ret != 0) + pr_err("unregister trace ext4_error failed: %d\n", ret); + } +} +/* Ended by AICoder, pid:5d0de557383767d1478308daf0824f238a41c7b8 */ + +static int __init ext4_report_init(void) +{ +#ifdef CONFIG_HOBOT_FUSA_DIAG + diag_register_kernel_fs(); +#endif + for_each_kernel_tracepoint(register_tracepoint_by_name, NULL); + return 0; +} + +static void __exit ext4_report_exit(void) +{ +#ifdef CONFIG_HOBOT_FUSA_DIAG + diag_unregister_kernel_fs(); +#endif + for_each_kernel_tracepoint(unregister_tracepoint_by_name, NULL); +} + +module_init(ext4_report_init); +module_exit(ext4_report_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("ZTE"); +MODULE_DESCRIPTION("EXT4 err report by tracepoint and diag");