at v2.6.15-rc2 111 lines 2.8 kB view raw
1/* 2 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. 3 * All Rights Reserved. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it would be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18#include "debug.h" 19#include "spin.h" 20#include <asm/page.h> 21#include <linux/sched.h> 22#include <linux/kernel.h> 23 24static char message[256]; /* keep it off the stack */ 25static DEFINE_SPINLOCK(xfs_err_lock); 26 27/* Translate from CE_FOO to KERN_FOO, err_level(CE_FOO) == KERN_FOO */ 28#define XFS_MAX_ERR_LEVEL 7 29#define XFS_ERR_MASK ((1 << 3) - 1) 30static char *err_level[XFS_MAX_ERR_LEVEL+1] = 31 {KERN_EMERG, KERN_ALERT, KERN_CRIT, 32 KERN_ERR, KERN_WARNING, KERN_NOTICE, 33 KERN_INFO, KERN_DEBUG}; 34 35void 36assfail(char *a, char *f, int l) 37{ 38 printk("XFS assertion failed: %s, file: %s, line: %d\n", a, f, l); 39 BUG(); 40} 41 42#if ((defined(DEBUG) || defined(INDUCE_IO_ERRROR)) && !defined(NO_WANT_RANDOM)) 43 44unsigned long 45random(void) 46{ 47 static unsigned long RandomValue = 1; 48 /* cycles pseudo-randomly through all values between 1 and 2^31 - 2 */ 49 register long rv = RandomValue; 50 register long lo; 51 register long hi; 52 53 hi = rv / 127773; 54 lo = rv % 127773; 55 rv = 16807 * lo - 2836 * hi; 56 if( rv <= 0 ) rv += 2147483647; 57 return( RandomValue = rv ); 58} 59 60int 61get_thread_id(void) 62{ 63 return current->pid; 64} 65 66#endif /* DEBUG || INDUCE_IO_ERRROR || !NO_WANT_RANDOM */ 67 68void 69cmn_err(register int level, char *fmt, ...) 70{ 71 char *fp = fmt; 72 int len; 73 ulong flags; 74 va_list ap; 75 76 level &= XFS_ERR_MASK; 77 if (level > XFS_MAX_ERR_LEVEL) 78 level = XFS_MAX_ERR_LEVEL; 79 spin_lock_irqsave(&xfs_err_lock,flags); 80 va_start(ap, fmt); 81 if (*fmt == '!') fp++; 82 len = vsprintf(message, fp, ap); 83 if (message[len-1] != '\n') 84 strcat(message, "\n"); 85 printk("%s%s", err_level[level], message); 86 va_end(ap); 87 spin_unlock_irqrestore(&xfs_err_lock,flags); 88 89 if (level == CE_PANIC) 90 BUG(); 91} 92 93 94void 95icmn_err(register int level, char *fmt, va_list ap) 96{ 97 ulong flags; 98 int len; 99 100 level &= XFS_ERR_MASK; 101 if(level > XFS_MAX_ERR_LEVEL) 102 level = XFS_MAX_ERR_LEVEL; 103 spin_lock_irqsave(&xfs_err_lock,flags); 104 len = vsprintf(message, fmt, ap); 105 if (message[len-1] != '\n') 106 strcat(message, "\n"); 107 spin_unlock_irqrestore(&xfs_err_lock,flags); 108 printk("%s%s", err_level[level], message); 109 if (level == CE_PANIC) 110 BUG(); 111}