2019-05-22 10:51:42 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-17 02:20:36 +04:00
/*
* debug . c - NTFS kernel debug support . Part of the Linux - NTFS project .
*
* Copyright ( c ) 2001 - 2004 Anton Altaparmakov
*/
2014-04-08 02:36:53 +04:00
# define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2005-04-17 02:20:36 +04:00
# include "debug.h"
/**
* __ntfs_warning - output a warning to the syslog
* @ function : name of function outputting the warning
* @ sb : super block of mounted ntfs filesystem
* @ fmt : warning string containing format specifications
* @ . . . : a variable number of arguments specified in @ fmt
*
* Outputs a warning to the syslog for the mounted ntfs filesystem described
* by @ sb .
*
* @ fmt and the corresponding @ . . . is printf style format string containing
* the warning string and the corresponding format arguments , respectively .
*
* @ function is the name of the function from which __ntfs_warning is being
* called .
*
* Note , you should be using debug . h : : ntfs_warning ( @ sb , @ fmt , @ . . . ) instead
* as this provides the @ function parameter automatically .
*/
void __ntfs_warning ( const char * function , const struct super_block * sb ,
const char * fmt , . . . )
{
2014-04-08 02:36:53 +04:00
struct va_format vaf ;
2005-04-17 02:20:36 +04:00
va_list args ;
int flen = 0 ;
# ifndef DEBUG
if ( ! printk_ratelimit ( ) )
return ;
# endif
if ( function )
flen = strlen ( function ) ;
va_start ( args , fmt ) ;
2014-04-08 02:36:53 +04:00
vaf . fmt = fmt ;
vaf . va = & args ;
2005-04-17 02:20:36 +04:00
if ( sb )
2014-04-08 02:36:53 +04:00
pr_warn ( " (device %s): %s(): %pV \n " ,
sb - > s_id , flen ? function : " " , & vaf ) ;
2005-04-17 02:20:36 +04:00
else
2014-04-08 02:36:53 +04:00
pr_warn ( " %s(): %pV \n " , flen ? function : " " , & vaf ) ;
va_end ( args ) ;
2005-04-17 02:20:36 +04:00
}
/**
* __ntfs_error - output an error to the syslog
* @ function : name of function outputting the error
* @ sb : super block of mounted ntfs filesystem
* @ fmt : error string containing format specifications
* @ . . . : a variable number of arguments specified in @ fmt
*
* Outputs an error to the syslog for the mounted ntfs filesystem described
* by @ sb .
*
* @ fmt and the corresponding @ . . . is printf style format string containing
* the error string and the corresponding format arguments , respectively .
*
* @ function is the name of the function from which __ntfs_error is being
* called .
*
* Note , you should be using debug . h : : ntfs_error ( @ sb , @ fmt , @ . . . ) instead
* as this provides the @ function parameter automatically .
*/
void __ntfs_error ( const char * function , const struct super_block * sb ,
const char * fmt , . . . )
{
2014-04-08 02:36:53 +04:00
struct va_format vaf ;
2005-04-17 02:20:36 +04:00
va_list args ;
int flen = 0 ;
# ifndef DEBUG
if ( ! printk_ratelimit ( ) )
return ;
# endif
if ( function )
flen = strlen ( function ) ;
va_start ( args , fmt ) ;
2014-04-08 02:36:53 +04:00
vaf . fmt = fmt ;
vaf . va = & args ;
2005-04-17 02:20:36 +04:00
if ( sb )
2014-04-08 02:36:53 +04:00
pr_err ( " (device %s): %s(): %pV \n " ,
sb - > s_id , flen ? function : " " , & vaf ) ;
2005-04-17 02:20:36 +04:00
else
2014-04-08 02:36:53 +04:00
pr_err ( " %s(): %pV \n " , flen ? function : " " , & vaf ) ;
va_end ( args ) ;
2005-04-17 02:20:36 +04:00
}
# ifdef DEBUG
/* If 1, output debug messages, and if 0, don't. */
int debug_msgs = 0 ;
2014-10-10 02:24:48 +04:00
void __ntfs_debug ( const char * file , int line , const char * function ,
2005-04-17 02:20:36 +04:00
const char * fmt , . . . )
{
2014-04-08 02:36:53 +04:00
struct va_format vaf ;
2005-04-17 02:20:36 +04:00
va_list args ;
int flen = 0 ;
if ( ! debug_msgs )
return ;
if ( function )
flen = strlen ( function ) ;
va_start ( args , fmt ) ;
2014-04-08 02:36:53 +04:00
vaf . fmt = fmt ;
vaf . va = & args ;
pr_debug ( " (%s, %d): %s(): %pV " , file , line , flen ? function : " " , & vaf ) ;
2005-04-17 02:20:36 +04:00
va_end ( args ) ;
}
/* Dump a runlist. Caller has to provide synchronisation for @rl. */
void ntfs_debug_dump_runlist ( const runlist_element * rl )
{
int i ;
const char * lcn_str [ 5 ] = { " LCN_HOLE " , " LCN_RL_NOT_MAPPED " ,
" LCN_ENOENT " , " LCN_unknown " } ;
if ( ! debug_msgs )
return ;
2014-04-08 02:36:53 +04:00
pr_debug ( " Dumping runlist (values in hex): \n " ) ;
2005-04-17 02:20:36 +04:00
if ( ! rl ) {
2014-04-08 02:36:53 +04:00
pr_debug ( " Run list not present. \n " ) ;
2005-04-17 02:20:36 +04:00
return ;
}
2014-04-08 02:36:53 +04:00
pr_debug ( " VCN LCN Run length \n " ) ;
2005-04-17 02:20:36 +04:00
for ( i = 0 ; ; i + + ) {
LCN lcn = ( rl + i ) - > lcn ;
if ( lcn < ( LCN ) 0 ) {
int index = - lcn - 1 ;
if ( index > - LCN_ENOENT - 1 )
index = 3 ;
2014-04-08 02:36:53 +04:00
pr_debug ( " %-16Lx %s %-16Lx%s \n " ,
2005-03-03 14:19:53 +03:00
( long long ) ( rl + i ) - > vcn , lcn_str [ index ] ,
( long long ) ( rl + i ) - > length ,
( rl + i ) - > length ? " " :
" (runlist end) " ) ;
2005-04-17 02:20:36 +04:00
} else
2014-04-08 02:36:53 +04:00
pr_debug ( " %-16Lx %-16Lx %-16Lx%s \n " ,
2005-03-03 14:19:53 +03:00
( long long ) ( rl + i ) - > vcn ,
( long long ) ( rl + i ) - > lcn ,
( long long ) ( rl + i ) - > length ,
( rl + i ) - > length ? " " :
" (runlist end) " ) ;
2005-04-17 02:20:36 +04:00
if ( ! ( rl + i ) - > length )
break ;
}
}
# endif