2005-04-16 15:20:36 -07:00
/*
* Copyright ( C ) International Business Machines Corp . , 2000 - 2004
* Portions Copyright ( C ) Christoph Hellwig , 2001 - 2002
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2006-10-02 09:55:27 -05:00
* the Free Software Foundation ; either version 2 of the License , or
2005-04-16 15:20:36 -07:00
* ( at your option ) any later version .
2006-10-02 09:55:27 -05:00
*
2005-04-16 15:20:36 -07:00
* This program is distributed in the hope that it will 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 .
*
* You should have received a copy of the GNU General Public License
2006-10-02 09:55:27 -05:00
* along with this program ; if not , write to the Free Software
2005-04-16 15:20:36 -07:00
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# include <linux/fs.h>
# include <linux/ctype.h>
# include <linux/module.h>
# include <linux/proc_fs.h>
# include <asm/uaccess.h>
# include "jfs_incore.h"
# include "jfs_filsys.h"
# include "jfs_debug.h"
# ifdef PROC_FS_JFS /* see jfs_debug.h */
static struct proc_dir_entry * base ;
# ifdef CONFIG_JFS_DEBUG
static int loglevel_read ( char * page , char * * start , off_t off ,
int count , int * eof , void * data )
{
int len ;
len = sprintf ( page , " %d \n " , jfsloglevel ) ;
len - = off ;
* start = page + off ;
if ( len > count )
len = count ;
else
* eof = 1 ;
if ( len < 0 )
len = 0 ;
return len ;
}
static int loglevel_write ( struct file * file , const char __user * buffer ,
unsigned long count , void * data )
{
char c ;
if ( get_user ( c , buffer ) )
return - EFAULT ;
/* yes, I know this is an ASCIIism. --hch */
if ( c < ' 0 ' | | c > ' 9 ' )
return - EINVAL ;
jfsloglevel = c - ' 0 ' ;
return count ;
}
# endif
static struct {
const char * name ;
read_proc_t * read_fn ;
write_proc_t * write_fn ;
} Entries [ ] = {
# ifdef CONFIG_JFS_STATISTICS
{ " lmstats " , jfs_lmstats_read , } ,
{ " txstats " , jfs_txstats_read , } ,
{ " xtstat " , jfs_xtstat_read , } ,
{ " mpstat " , jfs_mpstat_read , } ,
# endif
# ifdef CONFIG_JFS_DEBUG
{ " TxAnchor " , jfs_txanchor_read , } ,
{ " loglevel " , loglevel_read , loglevel_write }
# endif
} ;
2006-03-24 03:15:34 -08:00
# define NPROCENT ARRAY_SIZE(Entries)
2005-04-16 15:20:36 -07:00
void jfs_proc_init ( void )
{
int i ;
if ( ! ( base = proc_mkdir ( " jfs " , proc_root_fs ) ) )
return ;
base - > owner = THIS_MODULE ;
for ( i = 0 ; i < NPROCENT ; i + + ) {
struct proc_dir_entry * p ;
if ( ( p = create_proc_entry ( Entries [ i ] . name , 0 , base ) ) ) {
p - > read_proc = Entries [ i ] . read_fn ;
p - > write_proc = Entries [ i ] . write_fn ;
}
}
}
void jfs_proc_clean ( void )
{
int i ;
if ( base ) {
for ( i = 0 ; i < NPROCENT ; i + + )
remove_proc_entry ( Entries [ i ] . name , base ) ;
remove_proc_entry ( " jfs " , proc_root_fs ) ;
}
}
# endif /* PROC_FS_JFS */