From: "David S. Miller" COMPAT layer bug fixes: 1) Compat layer statfs64 syscalls were missing 'sz' argument. 2) SPARC64 was not using the compat entry points, oops. arch/sparc64/kernel/systbls.S | 4 ++-- fs/compat.c | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff -puN arch/sparc64/kernel/systbls.S~compat-statfs-fixes arch/sparc64/kernel/systbls.S --- 25/arch/sparc64/kernel/systbls.S~compat-statfs-fixes 2003-11-18 22:16:05.000000000 -0800 +++ 25-akpm/arch/sparc64/kernel/systbls.S 2003-11-18 22:16:05.000000000 -0800 @@ -65,8 +65,8 @@ sys_call_table32: .word sys32_ipc, sys32_sigreturn, sys_clone, sys_nis_syscall, sys32_adjtimex /*220*/ .word compat_sys_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys_getpgid .word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys32_setfsuid16, sys32_setfsgid16 -/*230*/ .word sys32_select, sys_time, sys_nis_syscall, sys_stime, sys_statfs64 - .word sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall +/*230*/ .word sys32_select, sys_time, sys_nis_syscall, sys_stime, compat_statfs64 + .word compat_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall /*240*/ .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler .word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, sys32_sched_rr_get_interval, compat_sys_nanosleep /*250*/ .word sys32_mremap, sys32_sysctl, sys_getsid, sys_fdatasync, sys32_nfsservctl diff -puN fs/compat.c~compat-statfs-fixes fs/compat.c --- 25/fs/compat.c~compat-statfs-fixes 2003-11-18 22:16:05.000000000 -0800 +++ 25-akpm/fs/compat.c 2003-11-18 22:16:05.000000000 -0800 @@ -169,7 +169,6 @@ out: static int put_compat_statfs64(struct compat_statfs64 *ubuf, struct kstatfs *kbuf) { - if (sizeof ubuf->f_blocks == 4) { if ((kbuf->f_blocks | kbuf->f_bfree | kbuf->f_bavail | kbuf->f_files | kbuf->f_ffree) & @@ -192,11 +191,14 @@ static int put_compat_statfs64(struct co return 0; } -asmlinkage long compat_statfs64(const char *path, struct compat_statfs64 *buf) +asmlinkage long compat_statfs64(const char *path, compat_size_t sz, struct compat_statfs64 *buf) { struct nameidata nd; int error; + if (sz != sizeof(*buf)) + return -EINVAL; + error = user_path_walk(path, &nd); if (!error) { struct kstatfs tmp; @@ -208,12 +210,15 @@ asmlinkage long compat_statfs64(const ch return error; } -asmlinkage long compat_fstatfs64(unsigned int fd, struct compat_statfs64 *buf) +asmlinkage long compat_fstatfs64(unsigned int fd, compat_size_t sz, struct compat_statfs64 *buf) { struct file * file; struct kstatfs tmp; int error; + if (sz != sizeof(*buf)) + return -EINVAL; + error = -EBADF; file = fget(fd); if (!file) _