Commit 0ba4da03 authored by David S. Miller's avatar David S. Miller Committed by Linus Torvalds

[PATCH] sparc64: Fix stat

Like Alpha, sparc64's struct stat was defined before we had the
nanosecond et al.  fields added.  So like Alpha I have to cons up a
struct stat64 to get this stuff.  I'll work on the glibc bits soon. 

Also, we were forgetting to fill in the nanosecond fields in the sparc
compat stat64 syscalls. 
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 0b2cad2f
...@@ -352,11 +352,11 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf) ...@@ -352,11 +352,11 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf)
err |= put_user(old_encode_dev(stat->rdev), &statbuf->st_rdev); err |= put_user(old_encode_dev(stat->rdev), &statbuf->st_rdev);
err |= put_user(stat->size, &statbuf->st_size); err |= put_user(stat->size, &statbuf->st_size);
err |= put_user(stat->atime.tv_sec, &statbuf->st_atime); err |= put_user(stat->atime.tv_sec, &statbuf->st_atime);
err |= put_user(0, &statbuf->__unused1); err |= put_user(stat->atime.tv_nsec, &statbuf->st_atime_nsec);
err |= put_user(stat->mtime.tv_sec, &statbuf->st_mtime); err |= put_user(stat->mtime.tv_sec, &statbuf->st_mtime);
err |= put_user(0, &statbuf->__unused2); err |= put_user(stat->mtime.tv_nsec, &statbuf->st_mtime_nsec);
err |= put_user(stat->ctime.tv_sec, &statbuf->st_ctime); err |= put_user(stat->ctime.tv_sec, &statbuf->st_ctime);
err |= put_user(0, &statbuf->__unused3); err |= put_user(stat->ctime.tv_nsec, &statbuf->st_ctime_nsec);
err |= put_user(stat->blksize, &statbuf->st_blksize); err |= put_user(stat->blksize, &statbuf->st_blksize);
err |= put_user(stat->blocks, &statbuf->st_blocks); err |= put_user(stat->blocks, &statbuf->st_blocks);
err |= put_user(0, &statbuf->__unused4[0]); err |= put_user(0, &statbuf->__unused4[0]);
...@@ -365,6 +365,68 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf) ...@@ -365,6 +365,68 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf)
return err; return err;
} }
int cp_compat_stat64(struct kstat *stat, struct compat_stat64 __user *statbuf)
{
int err;
err = put_user(huge_encode_dev(stat->dev), &statbuf->st_dev);
err |= put_user(stat->ino, &statbuf->st_ino);
err |= put_user(stat->mode, &statbuf->st_mode);
err |= put_user(stat->nlink, &statbuf->st_nlink);
err |= put_user(stat->uid, &statbuf->st_uid);
err |= put_user(stat->gid, &statbuf->st_gid);
err |= put_user(huge_encode_dev(stat->rdev), &statbuf->st_rdev);
err |= put_user(0, (unsigned long __user *) &statbuf->__pad3[0]);
err |= put_user(stat->size, &statbuf->st_size);
err |= put_user(stat->blksize, &statbuf->st_blksize);
err |= put_user(0, (unsigned int __user *) &statbuf->__pad4[0]);
err |= put_user(0, (unsigned int __user *) &statbuf->__pad4[4]);
err |= put_user(stat->blocks, &statbuf->st_blocks);
err |= put_user(stat->atime.tv_sec, &statbuf->st_atime);
err |= put_user(stat->atime.tv_nsec, &statbuf->st_atime_nsec);
err |= put_user(stat->mtime.tv_sec, &statbuf->st_mtime);
err |= put_user(stat->mtime.tv_nsec, &statbuf->st_mtime_nsec);
err |= put_user(stat->ctime.tv_sec, &statbuf->st_ctime);
err |= put_user(stat->ctime.tv_nsec, &statbuf->st_ctime_nsec);
err |= put_user(0, &statbuf->__unused4);
err |= put_user(0, &statbuf->__unused5);
return err;
}
asmlinkage long compat_sys_stat64(char __user * filename,
struct compat_stat64 __user *statbuf)
{
struct kstat stat;
int error = vfs_stat(filename, &stat);
if (!error)
error = cp_compat_stat64(&stat, statbuf);
return error;
}
asmlinkage long compat_sys_lstat64(char __user * filename,
struct compat_stat64 __user *statbuf)
{
struct kstat stat;
int error = vfs_lstat(filename, &stat);
if (!error)
error = cp_compat_stat64(&stat, statbuf);
return error;
}
asmlinkage long compat_sys_fstat64(unsigned int fd,
struct compat_stat64 __user * statbuf)
{
struct kstat stat;
int error = vfs_fstat(fd, &stat);
if (!error)
error = cp_compat_stat64(&stat, statbuf);
return error;
}
asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2) asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2)
{ {
return sys_sysfs(option, arg1, arg2); return sys_sysfs(option, arg1, arg2);
......
...@@ -32,7 +32,7 @@ sys_call_table32: ...@@ -32,7 +32,7 @@ sys_call_table32:
.word sys32_umount, sys32_setgid16, sys32_getgid16, sys32_signal, sys32_geteuid16 .word sys32_umount, sys32_setgid16, sys32_getgid16, sys32_signal, sys32_geteuid16
/*50*/ .word sys32_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl /*50*/ .word sys32_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl
.word sys32_reboot, sys32_mmap2, sys_symlink, sys32_readlink, sys32_execve .word sys32_reboot, sys32_mmap2, sys_symlink, sys32_readlink, sys32_execve
/*60*/ .word sys32_umask, sys_chroot, compat_sys_newfstat, sys_fstat64, sys_getpagesize /*60*/ .word sys32_umask, sys_chroot, compat_sys_newfstat, compat_sys_fstat64, sys_getpagesize
.word sys32_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid .word sys32_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid
/*70*/ .word sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect /*70*/ .word sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect
.word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys32_getgroups16 .word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys32_getgroups16
...@@ -46,8 +46,8 @@ sys_call_table32: ...@@ -46,8 +46,8 @@ sys_call_table32:
.word sys32_getgroups, sys32_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd .word sys32_getgroups, sys32_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd
/*120*/ .word compat_sys_readv, compat_sys_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod /*120*/ .word compat_sys_readv, compat_sys_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod
.word sys_nis_syscall, sys32_setreuid16, sys32_setregid16, sys_rename, sys_truncate .word sys_nis_syscall, sys32_setreuid16, sys32_setregid16, sys_rename, sys_truncate
/*130*/ .word sys_ftruncate, sys_flock, sys_lstat64, sys_nis_syscall, sys_nis_syscall /*130*/ .word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall
.word sys_nis_syscall, sys32_mkdir, sys_rmdir, sys32_utimes, sys_stat64 .word sys_nis_syscall, sys32_mkdir, sys_rmdir, sys32_utimes, compat_sys_stat64
/*140*/ .word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit /*140*/ .word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit
.word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write .word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write
/*150*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 /*150*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64
...@@ -98,7 +98,7 @@ sys_call_table: ...@@ -98,7 +98,7 @@ sys_call_table:
.word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid .word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid
/*50*/ .word sys_getegid, sys_acct, sys_memory_ordering, sys_nis_syscall, sys_ioctl /*50*/ .word sys_getegid, sys_acct, sys_memory_ordering, sys_nis_syscall, sys_ioctl
.word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve .word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve
/*60*/ .word sys_umask, sys_chroot, sys_newfstat, sys_nis_syscall, sys_getpagesize /*60*/ .word sys_umask, sys_chroot, sys_newfstat, sys_stat64, sys_getpagesize
.word sys_msync, sys_vfork, sys_pread64, sys_pwrite64, sys_nis_syscall .word sys_msync, sys_vfork, sys_pread64, sys_pwrite64, sys_nis_syscall
/*70*/ .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys64_munmap, sys_mprotect /*70*/ .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys64_munmap, sys_mprotect
.word sys_madvise, sys_vhangup, sys_nis_syscall, sys_mincore, sys_getgroups .word sys_madvise, sys_vhangup, sys_nis_syscall, sys_mincore, sys_getgroups
...@@ -112,8 +112,8 @@ sys_call_table: ...@@ -112,8 +112,8 @@ sys_call_table:
.word sys_nis_syscall, sys_gettimeofday, sys_getrusage, sys_getsockopt, sys_getcwd .word sys_nis_syscall, sys_gettimeofday, sys_getrusage, sys_getsockopt, sys_getcwd
/*120*/ .word sys_readv, sys_writev, sys_settimeofday, sys_fchown, sys_fchmod /*120*/ .word sys_readv, sys_writev, sys_settimeofday, sys_fchown, sys_fchmod
.word sys_recvfrom, sys_setreuid, sys_setregid, sys_rename, sys_truncate .word sys_recvfrom, sys_setreuid, sys_setregid, sys_rename, sys_truncate
/*130*/ .word sys_ftruncate, sys_flock, sys_nis_syscall, sys_sendto, sys_shutdown /*130*/ .word sys_ftruncate, sys_flock, sys_lstat64, sys_sendto, sys_shutdown
.word sys_socketpair, sys_mkdir, sys_rmdir, sys_utimes, sys_nis_syscall .word sys_socketpair, sys_mkdir, sys_rmdir, sys_utimes, sys_stat64
/*140*/ .word sys_sendfile64, sys_getpeername, sys_futex, sys_gettid, sys_getrlimit /*140*/ .word sys_sendfile64, sys_getpeername, sys_futex, sys_gettid, sys_getrlimit
.word sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write .word sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write
/*150*/ .word sys_getsockname, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 /*150*/ .word sys_getsockname, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64
......
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
#define __NR_umask 60 /* Common */ #define __NR_umask 60 /* Common */
#define __NR_chroot 61 /* Common */ #define __NR_chroot 61 /* Common */
#define __NR_fstat 62 /* Common */ #define __NR_fstat 62 /* Common */
#define __NR_fstat64 63 /* Linux sparc32 Specific */ #define __NR_fstat64 63 /* Linux Specific */
#define __NR_getpagesize 64 /* Common */ #define __NR_getpagesize 64 /* Common */
#define __NR_msync 65 /* Common in newer 1.3.x revs... */ #define __NR_msync 65 /* Common in newer 1.3.x revs... */
#define __NR_vfork 66 /* Common */ #define __NR_vfork 66 /* Common */
...@@ -148,14 +148,14 @@ ...@@ -148,14 +148,14 @@
#define __NR_truncate 129 /* Common */ #define __NR_truncate 129 /* Common */
#define __NR_ftruncate 130 /* Common */ #define __NR_ftruncate 130 /* Common */
#define __NR_flock 131 /* Common */ #define __NR_flock 131 /* Common */
#define __NR_lstat64 132 /* Linux sparc32 Specific */ #define __NR_lstat64 132 /* Linux Specific */
#define __NR_sendto 133 /* Common */ #define __NR_sendto 133 /* Common */
#define __NR_shutdown 134 /* Common */ #define __NR_shutdown 134 /* Common */
#define __NR_socketpair 135 /* Common */ #define __NR_socketpair 135 /* Common */
#define __NR_mkdir 136 /* Common */ #define __NR_mkdir 136 /* Common */
#define __NR_rmdir 137 /* Common */ #define __NR_rmdir 137 /* Common */
#define __NR_utimes 138 /* SunOS Specific */ #define __NR_utimes 138 /* SunOS Specific */
#define __NR_stat64 139 /* Linux sparc32 Specific */ #define __NR_stat64 139 /* Linux Specific */
#define __NR_sendfile64 140 /* adjtime under SunOS */ #define __NR_sendfile64 140 /* adjtime under SunOS */
#define __NR_getpeername 141 /* Common */ #define __NR_getpeername 141 /* Common */
#define __NR_futex 142 /* gethostid under SunOS */ #define __NR_futex 142 /* gethostid under SunOS */
......
...@@ -51,16 +51,50 @@ struct compat_stat { ...@@ -51,16 +51,50 @@ struct compat_stat {
compat_dev_t st_rdev; compat_dev_t st_rdev;
compat_off_t st_size; compat_off_t st_size;
compat_time_t st_atime; compat_time_t st_atime;
u32 __unused1; compat_ulong_t st_atime_nsec;
compat_time_t st_mtime; compat_time_t st_mtime;
u32 __unused2; compat_ulong_t st_mtime_nsec;
compat_time_t st_ctime; compat_time_t st_ctime;
u32 __unused3; compat_ulong_t st_ctime_nsec;
compat_off_t st_blksize; compat_off_t st_blksize;
compat_off_t st_blocks; compat_off_t st_blocks;
u32 __unused4[2]; u32 __unused4[2];
}; };
struct compat_stat64 {
unsigned long long st_dev;
unsigned long long st_ino;
unsigned int st_mode;
unsigned int st_nlink;
unsigned int st_uid;
unsigned int st_gid;
unsigned long long st_rdev;
unsigned char __pad3[8];
long long st_size;
unsigned int st_blksize;
unsigned char __pad4[8];
unsigned int st_blocks;
unsigned int st_atime;
unsigned int st_atime_nsec;
unsigned int st_mtime;
unsigned int st_mtime_nsec;
unsigned int st_ctime;
unsigned int st_ctime_nsec;
unsigned int __unused4;
unsigned int __unused5;
};
struct compat_flock { struct compat_flock {
short l_type; short l_type;
short l_whence; short l_whence;
......
...@@ -21,43 +21,28 @@ struct stat { ...@@ -21,43 +21,28 @@ struct stat {
unsigned long __unused4[2]; unsigned long __unused4[2];
}; };
#ifdef __KERNEL__
/* This is sparc32 stat64 structure. */
struct stat64 { struct stat64 {
unsigned long long st_dev; unsigned long st_dev;
unsigned long st_ino;
unsigned long long st_ino; unsigned long st_nlink;
unsigned int st_mode; unsigned int st_mode;
unsigned int st_nlink;
unsigned int st_uid; unsigned int st_uid;
unsigned int st_gid; unsigned int st_gid;
unsigned int __pad0;
unsigned long long st_rdev;
unsigned long st_rdev;
unsigned char __pad3[8]; long st_size;
long st_blksize;
long long st_size; long st_blocks;
unsigned int st_blksize;
unsigned long st_atime;
unsigned char __pad4[8]; unsigned long st_atime_nsec;
unsigned int st_blocks; unsigned long st_mtime;
unsigned long st_mtime_nsec;
unsigned int st_atime; unsigned long st_ctime;
unsigned int st_atime_nsec; unsigned long st_ctime_nsec;
long __unused[3];
unsigned int st_mtime;
unsigned int st_mtime_nsec;
unsigned int st_ctime;
unsigned int st_ctime_nsec;
unsigned int __unused4;
unsigned int __unused5;
}; };
#endif #endif
#endif
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
#define __NR_umask 60 /* Common */ #define __NR_umask 60 /* Common */
#define __NR_chroot 61 /* Common */ #define __NR_chroot 61 /* Common */
#define __NR_fstat 62 /* Common */ #define __NR_fstat 62 /* Common */
/* #define __NR_fstat64 63 Linux sparc32 Specific */ #define __NR_fstat64 63 /* Linux Specific */
#define __NR_getpagesize 64 /* Common */ #define __NR_getpagesize 64 /* Common */
#define __NR_msync 65 /* Common in newer 1.3.x revs... */ #define __NR_msync 65 /* Common in newer 1.3.x revs... */
#define __NR_vfork 66 /* Common */ #define __NR_vfork 66 /* Common */
...@@ -148,14 +148,14 @@ ...@@ -148,14 +148,14 @@
#define __NR_truncate 129 /* Common */ #define __NR_truncate 129 /* Common */
#define __NR_ftruncate 130 /* Common */ #define __NR_ftruncate 130 /* Common */
#define __NR_flock 131 /* Common */ #define __NR_flock 131 /* Common */
/* #define __NR_lstat64 132 Linux sparc32 Specific */ #define __NR_lstat64 132 /* Linux Specific */
#define __NR_sendto 133 /* Common */ #define __NR_sendto 133 /* Common */
#define __NR_shutdown 134 /* Common */ #define __NR_shutdown 134 /* Common */
#define __NR_socketpair 135 /* Common */ #define __NR_socketpair 135 /* Common */
#define __NR_mkdir 136 /* Common */ #define __NR_mkdir 136 /* Common */
#define __NR_rmdir 137 /* Common */ #define __NR_rmdir 137 /* Common */
#define __NR_utimes 138 /* SunOS Specific */ #define __NR_utimes 138 /* SunOS Specific */
/* #define __NR_stat64 139 Linux sparc32 Specific */ #define __NR_stat64 139 /* Linux Specific */
#define __NR_sendfile64 140 /* adjtime under SunOS */ #define __NR_sendfile64 140 /* adjtime under SunOS */
#define __NR_getpeername 141 /* Common */ #define __NR_getpeername 141 /* Common */
#define __NR_futex 142 /* gethostid under SunOS */ #define __NR_futex 142 /* gethostid under SunOS */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment