1*0b61f8a4SDave Chinner // SPDX-License-Identifier: GPL-2.0 2c59d87c4SChristoph Hellwig /* 3c59d87c4SChristoph Hellwig * Copyright (c) 2011 Red Hat, Inc. All Rights Reserved. 4c59d87c4SChristoph Hellwig */ 5c59d87c4SChristoph Hellwig 6c59d87c4SChristoph Hellwig #include "xfs.h" 7c59d87c4SChristoph Hellwig #include "xfs_fs.h" 8847f9f68SEric Sandeen #include "xfs_error.h" 94fb6e8adSChristoph Hellwig #include "xfs_format.h" 10239880efSDave Chinner #include "xfs_log_format.h" 11239880efSDave Chinner #include "xfs_trans_resv.h" 12c59d87c4SChristoph Hellwig #include "xfs_mount.h" 13c59d87c4SChristoph Hellwig 14c59d87c4SChristoph Hellwig /* 15c59d87c4SChristoph Hellwig * XFS logging functions 16c59d87c4SChristoph Hellwig */ 17c59d87c4SChristoph Hellwig static void 18c59d87c4SChristoph Hellwig __xfs_printk( 19c59d87c4SChristoph Hellwig const char *level, 20c59d87c4SChristoph Hellwig const struct xfs_mount *mp, 21c59d87c4SChristoph Hellwig struct va_format *vaf) 22c59d87c4SChristoph Hellwig { 23c59d87c4SChristoph Hellwig if (mp && mp->m_fsname) { 24c59d87c4SChristoph Hellwig printk("%sXFS (%s): %pV\n", level, mp->m_fsname, vaf); 25c59d87c4SChristoph Hellwig return; 26c59d87c4SChristoph Hellwig } 27c59d87c4SChristoph Hellwig printk("%sXFS: %pV\n", level, vaf); 28c59d87c4SChristoph Hellwig } 29c59d87c4SChristoph Hellwig 30c59d87c4SChristoph Hellwig #define define_xfs_printk_level(func, kern_level) \ 31c59d87c4SChristoph Hellwig void func(const struct xfs_mount *mp, const char *fmt, ...) \ 32c59d87c4SChristoph Hellwig { \ 33c59d87c4SChristoph Hellwig struct va_format vaf; \ 34c59d87c4SChristoph Hellwig va_list args; \ 35847f9f68SEric Sandeen int level; \ 36c59d87c4SChristoph Hellwig \ 37c59d87c4SChristoph Hellwig va_start(args, fmt); \ 38c59d87c4SChristoph Hellwig \ 39c59d87c4SChristoph Hellwig vaf.fmt = fmt; \ 40c59d87c4SChristoph Hellwig vaf.va = &args; \ 41c59d87c4SChristoph Hellwig \ 42c59d87c4SChristoph Hellwig __xfs_printk(kern_level, mp, &vaf); \ 43c59d87c4SChristoph Hellwig va_end(args); \ 44847f9f68SEric Sandeen \ 45847f9f68SEric Sandeen if (!kstrtoint(kern_level, 0, &level) && \ 46847f9f68SEric Sandeen level <= LOGLEVEL_ERR && \ 47847f9f68SEric Sandeen xfs_error_level >= XFS_ERRLEVEL_HIGH) \ 48847f9f68SEric Sandeen xfs_stack_trace(); \ 49c59d87c4SChristoph Hellwig } \ 50c59d87c4SChristoph Hellwig 51c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_emerg, KERN_EMERG); 52c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_alert, KERN_ALERT); 53c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_crit, KERN_CRIT); 54c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_err, KERN_ERR); 55c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_warn, KERN_WARNING); 56c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_notice, KERN_NOTICE); 57c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_info, KERN_INFO); 58c59d87c4SChristoph Hellwig #ifdef DEBUG 59c59d87c4SChristoph Hellwig define_xfs_printk_level(xfs_debug, KERN_DEBUG); 60c59d87c4SChristoph Hellwig #endif 61c59d87c4SChristoph Hellwig 62c59d87c4SChristoph Hellwig void 63c59d87c4SChristoph Hellwig xfs_alert_tag( 64c59d87c4SChristoph Hellwig const struct xfs_mount *mp, 65c59d87c4SChristoph Hellwig int panic_tag, 66c59d87c4SChristoph Hellwig const char *fmt, ...) 67c59d87c4SChristoph Hellwig { 68c59d87c4SChristoph Hellwig struct va_format vaf; 69c59d87c4SChristoph Hellwig va_list args; 70c59d87c4SChristoph Hellwig int do_panic = 0; 71c59d87c4SChristoph Hellwig 72c59d87c4SChristoph Hellwig if (xfs_panic_mask && (xfs_panic_mask & panic_tag)) { 73c59d87c4SChristoph Hellwig xfs_alert(mp, "Transforming an alert into a BUG."); 74c59d87c4SChristoph Hellwig do_panic = 1; 75c59d87c4SChristoph Hellwig } 76c59d87c4SChristoph Hellwig 77c59d87c4SChristoph Hellwig va_start(args, fmt); 78c59d87c4SChristoph Hellwig 79c59d87c4SChristoph Hellwig vaf.fmt = fmt; 80c59d87c4SChristoph Hellwig vaf.va = &args; 81c59d87c4SChristoph Hellwig 82c59d87c4SChristoph Hellwig __xfs_printk(KERN_ALERT, mp, &vaf); 83c59d87c4SChristoph Hellwig va_end(args); 84c59d87c4SChristoph Hellwig 85c59d87c4SChristoph Hellwig BUG_ON(do_panic); 86c59d87c4SChristoph Hellwig } 87c59d87c4SChristoph Hellwig 88c59d87c4SChristoph Hellwig void 89742ae1e3SDave Chinner asswarn(char *expr, char *file, int line) 90742ae1e3SDave Chinner { 91742ae1e3SDave Chinner xfs_warn(NULL, "Assertion failed: %s, file: %s, line: %d", 92742ae1e3SDave Chinner expr, file, line); 93742ae1e3SDave Chinner WARN_ON(1); 94742ae1e3SDave Chinner } 95742ae1e3SDave Chinner 96742ae1e3SDave Chinner void 97c59d87c4SChristoph Hellwig assfail(char *expr, char *file, int line) 98c59d87c4SChristoph Hellwig { 99c59d87c4SChristoph Hellwig xfs_emerg(NULL, "Assertion failed: %s, file: %s, line: %d", 100c59d87c4SChristoph Hellwig expr, file, line); 101ccdab3d6SBrian Foster if (xfs_globals.bug_on_assert) 102c59d87c4SChristoph Hellwig BUG(); 103ccdab3d6SBrian Foster else 104ccdab3d6SBrian Foster WARN_ON(1); 105c59d87c4SChristoph Hellwig } 106c59d87c4SChristoph Hellwig 107c59d87c4SChristoph Hellwig void 108c59d87c4SChristoph Hellwig xfs_hex_dump(void *p, int length) 109c59d87c4SChristoph Hellwig { 110c59d87c4SChristoph Hellwig print_hex_dump(KERN_ALERT, "", DUMP_PREFIX_ADDRESS, 16, 1, p, length, 1); 111c59d87c4SChristoph Hellwig } 112