2005-04-16 15:20:36 -07:00
/*
2005-11-02 14:58:39 +11:00
* Copyright ( c ) 2000 - 2003 , 2005 Silicon Graphics , Inc .
* All Rights Reserved .
2005-04-16 15:20:36 -07:00
*
2005-11-02 14:58:39 +11:00
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
2005-04-16 15:20:36 -07:00
* published by the Free Software Foundation .
*
2005-11-02 14:58:39 +11:00
* This program is distributed in the hope that it would be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
2005-04-16 15:20:36 -07:00
*
2005-11-02 14:58:39 +11:00
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
2005-04-16 15:20:36 -07:00
*/
2006-11-11 18:03:49 +11:00
# include <xfs.h>
2005-04-16 15:20:36 -07:00
# include "debug.h"
2008-12-17 12:27:36 -05:00
/* xfs_mount.h drags a lot of crap in, sorry.. */
# include "xfs_sb.h"
# include "xfs_inum.h"
# include "xfs_ag.h"
# include "xfs_dmapi.h"
# include "xfs_mount.h"
2009-03-12 09:33:37 -05:00
# include "xfs_error.h"
2008-12-17 12:27:36 -05:00
2007-02-10 18:34:38 +11:00
static char message [ 1024 ] ; /* keep it off the stack */
2005-04-16 15:20:36 -07:00
static DEFINE_SPINLOCK ( xfs_err_lock ) ;
/* Translate from CE_FOO to KERN_FOO, err_level(CE_FOO) == KERN_FOO */
# define XFS_MAX_ERR_LEVEL 7
# define XFS_ERR_MASK ((1 << 3) - 1)
2006-01-11 15:29:52 +11:00
static const char * const err_level [ XFS_MAX_ERR_LEVEL + 1 ] =
2005-04-16 15:20:36 -07:00
{ KERN_EMERG , KERN_ALERT , KERN_CRIT ,
KERN_ERR , KERN_WARNING , KERN_NOTICE ,
KERN_INFO , KERN_DEBUG } ;
void
cmn_err ( register int level , char * fmt , . . . )
{
char * fp = fmt ;
int len ;
ulong flags ;
va_list ap ;
level & = XFS_ERR_MASK ;
if ( level > XFS_MAX_ERR_LEVEL )
level = XFS_MAX_ERR_LEVEL ;
spin_lock_irqsave ( & xfs_err_lock , flags ) ;
va_start ( ap , fmt ) ;
if ( * fmt = = ' ! ' ) fp + + ;
2007-02-10 18:34:38 +11:00
len = vsnprintf ( message , sizeof ( message ) , fp , ap ) ;
if ( len > = sizeof ( message ) )
len = sizeof ( message ) - 1 ;
if ( message [ len - 1 ] = = ' \n ' )
message [ len - 1 ] = 0 ;
printk ( " %s%s \n " , err_level [ level ] , message ) ;
2005-04-16 15:20:36 -07:00
va_end ( ap ) ;
spin_unlock_irqrestore ( & xfs_err_lock , flags ) ;
2006-10-03 23:37:55 +02:00
BUG_ON ( level = = CE_PANIC ) ;
2005-04-16 15:20:36 -07:00
}
void
2008-12-17 12:27:36 -05:00
xfs_fs_vcmn_err (
int level ,
struct xfs_mount * mp ,
char * fmt ,
va_list ap )
2005-04-16 15:20:36 -07:00
{
2008-12-17 12:27:36 -05:00
unsigned long flags ;
int len = 0 ;
2005-04-16 15:20:36 -07:00
level & = XFS_ERR_MASK ;
2008-12-17 12:27:36 -05:00
if ( level > XFS_MAX_ERR_LEVEL )
2005-04-16 15:20:36 -07:00
level = XFS_MAX_ERR_LEVEL ;
2008-12-17 12:27:36 -05:00
2005-04-16 15:20:36 -07:00
spin_lock_irqsave ( & xfs_err_lock , flags ) ;
2008-12-17 12:27:36 -05:00
if ( mp ) {
len = sprintf ( message , " Filesystem \" %s \" : " , mp - > m_fsname ) ;
/*
* Skip the printk if we can ' t print anything useful
* due to an over - long device name .
*/
if ( len > = sizeof ( message ) )
goto out ;
}
len = vsnprintf ( message + len , sizeof ( message ) - len , fmt , ap ) ;
2007-02-10 18:34:38 +11:00
if ( len > = sizeof ( message ) )
len = sizeof ( message ) - 1 ;
if ( message [ len - 1 ] = = ' \n ' )
message [ len - 1 ] = 0 ;
2008-12-17 12:27:36 -05:00
2007-02-10 18:34:38 +11:00
printk ( " %s%s \n " , err_level [ level ] , message ) ;
2008-12-17 12:27:36 -05:00
out :
2005-04-16 15:20:36 -07:00
spin_unlock_irqrestore ( & xfs_err_lock , flags ) ;
2008-12-17 12:27:36 -05:00
2006-10-03 23:37:55 +02:00
BUG_ON ( level = = CE_PANIC ) ;
2005-04-16 15:20:36 -07:00
}
2006-01-12 10:29:53 +11:00
void
assfail ( char * expr , char * file , int line )
{
printk ( " Assertion failed: %s, file: %s, line: %d \n " , expr , file , line ) ;
BUG ( ) ;
}
2007-10-12 11:13:08 +10:00
void
xfs_hex_dump ( void * p , int length )
{
2008-10-30 17:05:58 +11:00
print_hex_dump ( KERN_ALERT , " " , DUMP_PREFIX_ADDRESS , 16 , 1 , p , length , 1 ) ;
2007-10-12 11:13:08 +10:00
}