[PATCH][COMPAT] compat_sys_[f]statfs - generic part

From: Stephen Rothwell (sfr@canb.auug.org.au)
Date: Mon Jan 13 2003 - 00:09:23 EST


Hi Linus,

This patch creates compat_sys_statfs and compat_sys_fstatfs. This is just
the generic part of the patch. Following are the arch specific parts. The
diffstat for the whole patch looks like this:

 arch/ia64/ia32/ia32_entry.S | 4 +-
 arch/ia64/ia32/sys_ia32.c | 55 ------------------------------
 arch/mips64/kernel/linux32.c | 66 ------------------------------------
 arch/mips64/kernel/scall_o32.S | 4 +-
 arch/parisc/kernel/sys_parisc32.c | 68 --------------------------------------
 arch/ppc64/kernel/misc.S | 4 +-
 arch/ppc64/kernel/sys_ppc32.c | 59 --------------------------------
 arch/s390x/kernel/entry.S | 4 +-
 arch/s390x/kernel/linux32.c | 55 ------------------------------
 arch/s390x/kernel/linux32.h | 13 -------
 arch/s390x/kernel/wrapper32.S | 16 ++++----
 arch/sparc64/kernel/sys_sparc32.c | 55 ------------------------------
 arch/sparc64/kernel/systbls.S | 4 +-
 arch/x86_64/ia32/ia32entry.S | 4 +-
 arch/x86_64/ia32/sys_ia32.c | 52 -----------------------------
 fs/compat.c | 57 +++++++++++++++++++++++++++++++
 include/asm-ia64/compat.h | 23 ++++++++++--
 include/asm-ia64/ia32.h | 13 -------
 include/asm-mips64/compat.h | 14 +++++++
 include/asm-parisc/compat.h | 13 +++++++
 include/asm-ppc64/compat.h | 13 +++++++
 include/asm-ppc64/ppc32.h | 13 -------
 include/asm-s390x/compat.h | 13 +++++++
 include/asm-sparc64/compat.h | 13 +++++++
 include/asm-sparc64/statfs.h | 14 -------
 include/asm-x86_64/compat.h | 13 +++++++
 include/asm-x86_64/ia32.h | 13 -------
 27 files changed, 174 insertions(+), 501 deletions(-)

I was wondering if put_compat_statfs would not be better if it declared a
struct compat_statfs and then zeroed it and then copied each of the
elements and then used copy_to_user on the whole structure. This would
have two effects: it may be faster in the copy to user mode and we would
no longer need to understand the internals of compat_fsid_t. What do you
think?

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff -ruN 2.5.56-32bit.3/fs/compat.c 2.5.56-32bit.4/fs/compat.c --- 2.5.56-32bit.3/fs/compat.c 2003-01-13 15:39:42.000000000 +1100 +++ 2.5.56-32bit.4/fs/compat.c 2003-01-13 15:58:34.000000000 +1100 @@ -17,6 +17,8 @@ #include <linux/time.h> #include <linux/fs.h> #include <linux/fcntl.h> +#include <linux/namei.h> +#include <linux/file.h> #include <asm/uaccess.h> @@ -101,3 +103,58 @@ err |= __put_user(kfl->l_pid, &ufl->l_pid); return err; } + +static int put_compat_statfs(struct compat_statfs *ubuf, struct statfs *kbuf) +{ + if (verify_area(VERIFY_WRITE, ubuf, sizeof(*ubuf)) || + __put_user(kbuf->f_type, &ubuf->f_type) || + __put_user(kbuf->f_bsize, &ubuf->f_bsize) || + __put_user(kbuf->f_blocks, &ubuf->f_blocks) || + __put_user(kbuf->f_bfree, &ubuf->f_bfree) || + __put_user(kbuf->f_bavail, &ubuf->f_bavail) || + __put_user(kbuf->f_files, &ubuf->f_files) || + __put_user(kbuf->f_ffree, &ubuf->f_ffree) || + __put_user(kbuf->f_namelen, &ubuf->f_namelen) || + __put_user(kbuf->f_fsid.val[0], &ubuf->f_fsid.val[0]) || + __put_user(kbuf->f_fsid.val[1], &ubuf->f_fsid.val[1])) + return -EFAULT; + return 0; +} + +/* + * The following statfs calls are copies of code from fs/open.c and + * should be checked against those from time to time + */ +asmlinkage long compat_sys_statfs(const char *path, struct compat_statfs *buf) +{ + struct nameidata nd; + int error; + + error = user_path_walk(path, &nd); + if (!error) { + struct statfs tmp; + error = vfs_statfs(nd.dentry->d_inode->i_sb, &tmp); + if (!error && put_compat_statfs(buf, &tmp)) + error = -EFAULT; + path_release(&nd); + } + return error; +} + +asmlinkage long compat_sys_fstatfs(unsigned int fd, struct compat_statfs *buf) +{ + struct file * file; + struct statfs tmp; + int error; + + error = -EBADF; + file = fget(fd); + if (!file) + goto out; + error = vfs_statfs(file->f_dentry->d_inode->i_sb, &tmp); + if (!error && put_compat_statfs(buf, &tmp)) + error = -EFAULT; + fput(file); +out: + return error; +} - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Wed Jan 15 2003 - 22:00:44 EST