Skip to content

Commit

Permalink
[PATCH] sparc64: Fix stat
Browse files Browse the repository at this point in the history
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: David S. Miller <davem@davemloft.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
David S. Miller authored and Linus Torvalds committed Apr 18, 2005
1 parent 0b2cad2 commit 0ba4da0
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 50 deletions.
68 changes: 65 additions & 3 deletions arch/sparc64/kernel/sys_sparc32.c
Original file line number Diff line number Diff line change
Expand Up @@ -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(stat->size, &statbuf->st_size);
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(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(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->blocks, &statbuf->st_blocks);
err |= put_user(0, &statbuf->__unused4[0]);
Expand All @@ -365,6 +365,68 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf)
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)
{
return sys_sysfs(option, arg1, arg2);
Expand Down
12 changes: 6 additions & 6 deletions arch/sparc64/kernel/systbls.S
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ sys_call_table32:
.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
.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
/*70*/ .word sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect
.word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys32_getgroups16
Expand All @@ -46,8 +46,8 @@ sys_call_table32:
.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
.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
.word sys_nis_syscall, sys32_mkdir, sys_rmdir, sys32_utimes, sys_stat64
/*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, compat_sys_stat64
/*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
/*150*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64
Expand Down Expand Up @@ -98,7 +98,7 @@ sys_call_table:
.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
.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
/*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
Expand All @@ -112,8 +112,8 @@ sys_call_table:
.word sys_nis_syscall, sys_gettimeofday, sys_getrusage, sys_getsockopt, sys_getcwd
/*120*/ .word sys_readv, sys_writev, sys_settimeofday, sys_fchown, sys_fchmod
.word sys_recvfrom, sys_setreuid, sys_setregid, sys_rename, sys_truncate
/*130*/ .word sys_ftruncate, sys_flock, sys_nis_syscall, sys_sendto, sys_shutdown
.word sys_socketpair, sys_mkdir, sys_rmdir, sys_utimes, sys_nis_syscall
/*130*/ .word sys_ftruncate, sys_flock, sys_lstat64, sys_sendto, sys_shutdown
.word sys_socketpair, sys_mkdir, sys_rmdir, sys_utimes, sys_stat64
/*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
/*150*/ .word sys_getsockname, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64
Expand Down
6 changes: 3 additions & 3 deletions include/asm-sparc/unistd.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
#define __NR_umask 60 /* Common */
#define __NR_chroot 61 /* 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_msync 65 /* Common in newer 1.3.x revs... */
#define __NR_vfork 66 /* Common */
Expand Down Expand Up @@ -148,14 +148,14 @@
#define __NR_truncate 129 /* Common */
#define __NR_ftruncate 130 /* 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_shutdown 134 /* Common */
#define __NR_socketpair 135 /* Common */
#define __NR_mkdir 136 /* Common */
#define __NR_rmdir 137 /* Common */
#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_getpeername 141 /* Common */
#define __NR_futex 142 /* gethostid under SunOS */
Expand Down
40 changes: 37 additions & 3 deletions include/asm-sparc64/compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,50 @@ struct compat_stat {
compat_dev_t st_rdev;
compat_off_t st_size;
compat_time_t st_atime;
u32 __unused1;
compat_ulong_t st_atime_nsec;
compat_time_t st_mtime;
u32 __unused2;
compat_ulong_t st_mtime_nsec;
compat_time_t st_ctime;
u32 __unused3;
compat_ulong_t st_ctime_nsec;
compat_off_t st_blksize;
compat_off_t st_blocks;
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 {
short l_type;
short l_whence;
Expand Down
49 changes: 17 additions & 32 deletions include/asm-sparc64/stat.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,43 +21,28 @@ struct stat {
unsigned long __unused4[2];
};

#ifdef __KERNEL__
/* This is sparc32 stat64 structure. */

struct stat64 {
unsigned long long st_dev;

unsigned long long st_ino;
unsigned long st_dev;
unsigned long st_ino;
unsigned long st_nlink;

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;
unsigned int __pad0;

unsigned long st_rdev;
long st_size;
long st_blksize;
long st_blocks;

unsigned long st_atime;
unsigned long st_atime_nsec;
unsigned long st_mtime;
unsigned long st_mtime_nsec;
unsigned long st_ctime;
unsigned long st_ctime_nsec;
long __unused[3];
};

#endif

#endif
6 changes: 3 additions & 3 deletions include/asm-sparc64/unistd.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
#define __NR_umask 60 /* Common */
#define __NR_chroot 61 /* 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_msync 65 /* Common in newer 1.3.x revs... */
#define __NR_vfork 66 /* Common */
Expand Down Expand Up @@ -148,14 +148,14 @@
#define __NR_truncate 129 /* Common */
#define __NR_ftruncate 130 /* 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_shutdown 134 /* Common */
#define __NR_socketpair 135 /* Common */
#define __NR_mkdir 136 /* Common */
#define __NR_rmdir 137 /* Common */
#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_getpeername 141 /* Common */
#define __NR_futex 142 /* gethostid under SunOS */
Expand Down

0 comments on commit 0ba4da0

Please sign in to comment.