[ppc64] Tidy up the mf_proc code, from Stephen Rothwell --- /dev/null | 33 ---- arch/ppc64/kernel/mf.c | 1 arch/ppc64/kernel/mf_proc.c | 292 ++++++++++++++++------------------------- include/asm-ppc64/iSeries/mf.h | 51 ++----- 4 files changed, 139 insertions(+), 238 deletions(-) diff -puN arch/ppc64/kernel/mf.c~ppc64-mf_proc_cleanup arch/ppc64/kernel/mf.c --- 25/arch/ppc64/kernel/mf.c~ppc64-mf_proc_cleanup 2004-01-13 23:23:07.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/mf.c 2004-01-13 23:23:07.000000000 -0800 @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include diff -puN arch/ppc64/kernel/mf_proc.c~ppc64-mf_proc_cleanup arch/ppc64/kernel/mf_proc.c --- 25/arch/ppc64/kernel/mf_proc.c~ppc64-mf_proc_cleanup 2004-01-13 23:23:07.000000000 -0800 +++ 25-akpm/arch/ppc64/kernel/mf_proc.c 2004-01-13 23:23:07.000000000 -0800 @@ -16,151 +16,27 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - - -/* Change Activity: */ -/* End Change Activity */ - -#ifndef _MF_PROC_H -#include -#endif -#ifndef MF_H_INCLUDED -#include -#endif #include +#include static struct proc_dir_entry *mf_proc_root = NULL; -int proc_mf_dump_cmdline -(char *page, char **start, off_t off, int count, int *eof, void *data); - -int proc_mf_dump_vmlinux -(char *page, char **start, off_t off, int count, int *eof, void *data); - -int proc_mf_dump_side -(char *page, char **start, off_t off, int count, int *eof, void *data); - -int proc_mf_change_side -(struct file *file, const char *buffer, unsigned long count, void *data); - -int proc_mf_dump_src -(char *page, char **start, off_t off, int count, int *eof, void *data); -int proc_mf_change_src (struct file *file, const char *buffer, unsigned long count, void *data); -int proc_mf_change_cmdline(struct file *file, const char *buffer, unsigned long count, void *data); -int proc_mf_change_vmlinux(struct file *file, const char *buffer, unsigned long count, void *data); - - -void mf_proc_init(struct proc_dir_entry *iSeries_proc) +static int proc_mf_dump_cmdline(char *page, char **start, off_t off, + int count, int *eof, void *data) { - struct proc_dir_entry *ent = NULL; - struct proc_dir_entry *mf_a = NULL; - struct proc_dir_entry *mf_b = NULL; - struct proc_dir_entry *mf_c = NULL; - struct proc_dir_entry *mf_d = NULL; - - mf_proc_root = proc_mkdir("mf", iSeries_proc); - if (!mf_proc_root) return; - - mf_a = proc_mkdir("A", mf_proc_root); - if (!mf_a) return; - - ent = create_proc_entry("cmdline", S_IFREG|S_IRUSR|S_IWUSR, mf_a); - if (!ent) return; - ent->nlink = 1; - ent->data = (void *)0; - ent->read_proc = proc_mf_dump_cmdline; - ent->write_proc = proc_mf_change_cmdline; - - ent = create_proc_entry("vmlinux", S_IFREG|S_IWUSR, mf_a); - if (!ent) return; - ent->nlink = 1; - ent->data = (void *)0; - ent->write_proc = proc_mf_change_vmlinux; - ent->read_proc = NULL; - - mf_b = proc_mkdir("B", mf_proc_root); - if (!mf_b) return; - - ent = create_proc_entry("cmdline", S_IFREG|S_IRUSR|S_IWUSR, mf_b); - if (!ent) return; - ent->nlink = 1; - ent->data = (void *)1; - ent->read_proc = proc_mf_dump_cmdline; - ent->write_proc = proc_mf_change_cmdline; - - ent = create_proc_entry("vmlinux", S_IFREG|S_IWUSR, mf_b); - if (!ent) return; - ent->nlink = 1; - ent->data = (void *)1; - ent->write_proc = proc_mf_change_vmlinux; - ent->read_proc = NULL; - - mf_c = proc_mkdir("C", mf_proc_root); - if (!mf_c) return; - - ent = create_proc_entry("cmdline", S_IFREG|S_IRUSR|S_IWUSR, mf_c); - if (!ent) return; - ent->nlink = 1; - ent->data = (void *)2; - ent->read_proc = proc_mf_dump_cmdline; - ent->write_proc = proc_mf_change_cmdline; - - ent = create_proc_entry("vmlinux", S_IFREG|S_IWUSR, mf_c); - if (!ent) return; - ent->nlink = 1; - ent->data = (void *)2; - ent->write_proc = proc_mf_change_vmlinux; - ent->read_proc = NULL; - - mf_d = proc_mkdir("D", mf_proc_root); - if (!mf_d) return; - - - ent = create_proc_entry("cmdline", S_IFREG|S_IRUSR|S_IWUSR, mf_d); - if (!ent) return; - ent->nlink = 1; - ent->data = (void *)3; - ent->read_proc = proc_mf_dump_cmdline; - ent->write_proc = proc_mf_change_cmdline; -#if 0 - ent = create_proc_entry("vmlinux", S_IFREG|S_IRUSR, mf_d); - if (!ent) return; - ent->nlink = 1; - ent->data = (void *)3; - ent->read_proc = proc_mf_dump_vmlinux; - ent->write_proc = NULL; -#endif - ent = create_proc_entry("side", S_IFREG|S_IRUSR|S_IWUSR, mf_proc_root); - if (!ent) return; - ent->nlink = 1; - ent->data = (void *)0; - ent->read_proc = proc_mf_dump_side; - ent->write_proc = proc_mf_change_side; - - ent = create_proc_entry("src", S_IFREG|S_IRUSR|S_IWUSR, mf_proc_root); - if (!ent) return; - ent->nlink = 1; - ent->data = (void *)0; - ent->read_proc = proc_mf_dump_src; - ent->write_proc = proc_mf_change_src; -} - -int proc_mf_dump_cmdline -(char *page, char **start, off_t off, int count, int *eof, void *data) -{ - int len = count; + int len = count; char *p; len = mf_getCmdLine(page, &len, (u64)data); p = page + len - 1; - while ( p > page ) { - if ( (*p == 0) || (*p == ' ') ) + while (p > page) { + if ((*p == 0) || (*p == ' ')) --p; else break; } - if ( *p != '\n' ) { + if (*p != '\n') { ++p; *p = '\n'; } @@ -179,74 +55,76 @@ int proc_mf_dump_cmdline return len; } -int proc_mf_dump_vmlinux -(char *page, char **start, off_t off, int count, int *eof, void *data) +#if 0 +static int proc_mf_dump_vmlinux(char *page, char **start, off_t off, + int count, int *eof, void *data) { int sizeToGet = count; + if (!capable(CAP_SYS_ADMIN)) return -EACCES; - if (mf_getVmlinuxChunk(page, &sizeToGet, off, (u64)data) == 0) - { - if (sizeToGet != 0) - { + if (mf_getVmlinuxChunk(page, &sizeToGet, off, (u64)data) == 0) { + if (sizeToGet != 0) { *start = page + off; return sizeToGet; - } else { - *eof = 1; - return 0; } - } else { *eof = 1; return 0; } + *eof = 1; + return 0; } +#endif -int proc_mf_dump_side -(char *page, char **start, off_t off, int count, int *eof, void *data) +static int proc_mf_dump_side(char *page, char **start, off_t off, + int count, int *eof, void *data) { - int len = 0; - + int len; char mf_current_side = mf_getSide(); + len = sprintf(page, "%c\n", mf_current_side); - if (len <= off+count) *eof = 1; + if (len <= (off + count)) + *eof = 1; *start = page + off; len -= off; - if (len>count) len = count; - if (len<0) len = 0; + if (len > count) + len = count; + if (len < 0) + len = 0; return len; } -int proc_mf_change_side(struct file *file, const char *buffer, unsigned long count, void *data) +static int proc_mf_change_side(struct file *file, const char __user *buffer, + unsigned long count, void *data) { char stkbuf[10]; + if (!capable(CAP_SYS_ADMIN)) return -EACCES; - if (count > 9) count = 9; - if (copy_from_user (stkbuf, buffer, count)) { + if (count > (sizeof(stkbuf) - 1)) + count = sizeof(stkbuf) - 1; + if (copy_from_user(stkbuf, buffer, count)) return -EFAULT; - } stkbuf[count] = 0; - if ((*stkbuf != 'A') && - (*stkbuf != 'B') && - (*stkbuf != 'C') && - (*stkbuf != 'D')) - { + if ((*stkbuf != 'A') && (*stkbuf != 'B') && + (*stkbuf != 'C') && (*stkbuf != 'D')) { printk(KERN_ERR "mf_proc.c: proc_mf_change_side: invalid side\n"); return -EINVAL; } mf_setSide(*stkbuf); - return count; + return count; } -int proc_mf_dump_src -(char *page, char **start, off_t off, int count, int *eof, void *data) +static int proc_mf_dump_src(char *page, char **start, off_t off, + int count, int *eof, void *data) { - int len = 0; + int len; + mf_getSrcHistory(page, count); len = count; len -= off; @@ -260,34 +138,34 @@ int proc_mf_dump_src return len; } -int proc_mf_change_src(struct file *file, const char *buffer, unsigned long count, void *data) +static int proc_mf_change_src(struct file *file, const char __user *buffer, + unsigned long count, void *data) { char stkbuf[10]; + if (!capable(CAP_SYS_ADMIN)) return -EACCES; - if ((count < 4) && (count != 1)) - { + if ((count < 4) && (count != 1)) { printk(KERN_ERR "mf_proc: invalid src\n"); return -EINVAL; } - if (count > 9) count = 9; - if (copy_from_user (stkbuf, buffer, count)) { + if (count > (sizeof(stkbuf) - 1)) + count = sizeof(stkbuf) - 1; + if (copy_from_user(stkbuf, buffer, count)) return -EFAULT; - } - if ((count == 1) && ((*stkbuf) == '\0')) - { + if ((count == 1) && (*stkbuf == '\0')) mf_clearSrc(); - } else { + else mf_displaySrc(*(u32 *)stkbuf); - } return count; } -int proc_mf_change_cmdline(struct file *file, const char *buffer, unsigned long count, void *data) +static int proc_mf_change_cmdline(struct file *file, const char *buffer, + unsigned long count, void *data) { if (!capable(CAP_SYS_ADMIN)) return -EACCES; @@ -297,7 +175,8 @@ int proc_mf_change_cmdline(struct file * return count; } -int proc_mf_change_vmlinux(struct file *file, const char *buffer, unsigned long count, void *data) +static int proc_mf_change_vmlinux(struct file *file, const char *buffer, + unsigned long count, void *data) { if (!capable(CAP_SYS_ADMIN)) return -EACCES; @@ -307,3 +186,70 @@ int proc_mf_change_vmlinux(struct file * return count; } + +void mf_proc_init(struct proc_dir_entry *iSeries_proc) +{ + struct proc_dir_entry *ent; + struct proc_dir_entry *mf; + char name[2]; + int i; + + mf_proc_root = proc_mkdir("mf", iSeries_proc); + if (!mf_proc_root) + return; + + name[1] = '\0'; + for (i = 0; i < 4; i++) { + name[0] = 'A' + i; + mf = proc_mkdir(name, mf_proc_root); + if (!mf) + return; + + ent = create_proc_entry("cmdline", S_IFREG|S_IRUSR|S_IWUSR, mf); + if (!ent) + return; + ent->nlink = 1; + ent->data = (void *)(long)i; + ent->read_proc = proc_mf_dump_cmdline; + ent->write_proc = proc_mf_change_cmdline; + + if (i == 3) /* no vmlinux entry for 'D' */ + continue; + + ent = create_proc_entry("vmlinux", S_IFREG|S_IWUSR, mf); + if (!ent) + return; + ent->nlink = 1; + ent->data = (void *)(long)i; +#if 0 + if (i == 3) { + /* + * if we had a 'D' vmlinux entry, it would only + * be readable. + */ + ent->read_proc = proc_mf_dump_vmlinux; + ent->write_proc = NULL; + } else +#endif + { + ent->write_proc = proc_mf_change_vmlinux; + ent->read_proc = NULL; + } + } + + ent = create_proc_entry("side", S_IFREG|S_IRUSR|S_IWUSR, mf_proc_root); + if (!ent) + return; + ent->nlink = 1; + ent->data = (void *)0; + ent->read_proc = proc_mf_dump_side; + ent->write_proc = proc_mf_change_side; + + ent = create_proc_entry("src", S_IFREG|S_IRUSR|S_IWUSR, mf_proc_root); + if (!ent) + return; + ent->nlink = 1; + ent->data = (void *)0; + ent->read_proc = proc_mf_dump_src; + ent->write_proc = proc_mf_change_src; +} diff -puN include/asm-ppc64/iSeries/mf.h~ppc64-mf_proc_cleanup include/asm-ppc64/iSeries/mf.h --- 25/include/asm-ppc64/iSeries/mf.h~ppc64-mf_proc_cleanup 2004-01-13 23:23:07.000000000 -0800 +++ 25-akpm/include/asm-ppc64/iSeries/mf.h 2004-01-13 23:23:07.000000000 -0800 @@ -23,61 +23,50 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - #ifndef MF_H_INCLUDED #define MF_H_INCLUDED +#include + #include #include struct rtc_time; -typedef void (*MFCompleteHandler)( void * clientToken, int returnCode ); - -extern void mf_allocateLpEvents( HvLpIndex targetLp, - HvLpEvent_Type type, - unsigned size, - unsigned amount, - MFCompleteHandler hdlr, - void * userToken ); - -extern void mf_deallocateLpEvents( HvLpIndex targetLp, - HvLpEvent_Type type, - unsigned count, - MFCompleteHandler hdlr, - void * userToken ); - -extern void mf_powerOff( void ); - -extern void mf_reboot( void ); - -extern void mf_displaySrc( u32 word ); -extern void mf_displayProgress( u16 value ); +typedef void (*MFCompleteHandler)(void *clientToken, int returnCode); -extern void mf_clearSrc( void ); +extern void mf_allocateLpEvents(HvLpIndex targetLp, HvLpEvent_Type type, + unsigned size, unsigned amount, MFCompleteHandler hdlr, + void *userToken); +extern void mf_deallocateLpEvents(HvLpIndex targetLp, HvLpEvent_Type type, + unsigned count, MFCompleteHandler hdlr, void *userToken); + +extern void mf_powerOff(void); +extern void mf_reboot(void); + +extern void mf_displaySrc(u32 word); +extern void mf_displayProgress(u16 value); +extern void mf_clearSrc(void); -extern void mf_init( void ); +extern void mf_init(void); extern void mf_setSide(char side); - extern char mf_getSide(void); extern void mf_setCmdLine(const char *cmdline, int size, u64 side); - extern int mf_getCmdLine(char *cmdline, int *size, u64 side); extern void mf_getSrcHistory(char *buffer, int size); -extern int mf_setVmlinuxChunk(const char *buffer, int size, int offset, u64 side); - +extern int mf_setVmlinuxChunk(const char *buffer, int size, int offset, + u64 side); extern int mf_getVmlinuxChunk(char *buffer, int *size, int offset, u64 side); extern int mf_setRtcTime(unsigned long time); - extern int mf_getRtcTime(unsigned long *time); - extern int mf_getRtc( struct rtc_time * tm ); - extern int mf_setRtc( struct rtc_time * tm ); +extern void mf_proc_init(struct proc_dir_entry *iSeries_proc); + #endif /* MF_H_INCLUDED */ diff -puN -L include/asm-ppc64/iSeries/mf_proc.h include/asm-ppc64/iSeries/mf_proc.h~ppc64-mf_proc_cleanup /dev/null --- 25/include/asm-ppc64/iSeries/mf_proc.h +++ /dev/null 2002-08-30 16:31:37.000000000 -0700 @@ -1,33 +0,0 @@ -/* - * mf_proc.h - * Copyright (C) 2001 Kyle A. Lucke IBM Corporation - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -/* Change Activity: */ -/* End Change Activity */ - -#ifndef _MF_PROC_H -#define _MF_PROC_H - -#include - -void mf_proc_init(struct proc_dir_entry *iSeries_proc); - - -#endif /* _MF_PROC_H */ - _