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