diff options
author | David S. Miller <davem@davemloft.net> | 2005-04-18 18:13:15 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-18 18:13:15 -0400 |
commit | 0ba4da03cc84f54b2574e1abcdaa18ef8456a9fb (patch) | |
tree | 6730c36a12833eaf05ddddd7b26fc4de1284ff5b /arch | |
parent | 0b2cad2f30d0353f2576b1a2207c0792ba713157 (diff) |
[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: David S. Miller <davem@davemloft.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/sparc64/kernel/sys_sparc32.c | 68 | ||||
-rw-r--r-- | arch/sparc64/kernel/systbls.S | 12 |
2 files changed, 71 insertions, 9 deletions
diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index 567c91c77b20..1d3aa588df8a 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c | |||
@@ -352,11 +352,11 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf) | |||
352 | err |= put_user(old_encode_dev(stat->rdev), &statbuf->st_rdev); | 352 | err |= put_user(old_encode_dev(stat->rdev), &statbuf->st_rdev); |
353 | err |= put_user(stat->size, &statbuf->st_size); | 353 | err |= put_user(stat->size, &statbuf->st_size); |
354 | err |= put_user(stat->atime.tv_sec, &statbuf->st_atime); | 354 | err |= put_user(stat->atime.tv_sec, &statbuf->st_atime); |
355 | err |= put_user(0, &statbuf->__unused1); | 355 | err |= put_user(stat->atime.tv_nsec, &statbuf->st_atime_nsec); |
356 | err |= put_user(stat->mtime.tv_sec, &statbuf->st_mtime); | 356 | err |= put_user(stat->mtime.tv_sec, &statbuf->st_mtime); |
357 | err |= put_user(0, &statbuf->__unused2); | 357 | err |= put_user(stat->mtime.tv_nsec, &statbuf->st_mtime_nsec); |
358 | err |= put_user(stat->ctime.tv_sec, &statbuf->st_ctime); | 358 | err |= put_user(stat->ctime.tv_sec, &statbuf->st_ctime); |
359 | err |= put_user(0, &statbuf->__unused3); | 359 | err |= put_user(stat->ctime.tv_nsec, &statbuf->st_ctime_nsec); |
360 | err |= put_user(stat->blksize, &statbuf->st_blksize); | 360 | err |= put_user(stat->blksize, &statbuf->st_blksize); |
361 | err |= put_user(stat->blocks, &statbuf->st_blocks); | 361 | err |= put_user(stat->blocks, &statbuf->st_blocks); |
362 | err |= put_user(0, &statbuf->__unused4[0]); | 362 | err |= put_user(0, &statbuf->__unused4[0]); |
@@ -365,6 +365,68 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf) | |||
365 | return err; | 365 | return err; |
366 | } | 366 | } |
367 | 367 | ||
368 | int cp_compat_stat64(struct kstat *stat, struct compat_stat64 __user *statbuf) | ||
369 | { | ||
370 | int err; | ||
371 | |||
372 | err = put_user(huge_encode_dev(stat->dev), &statbuf->st_dev); | ||
373 | err |= put_user(stat->ino, &statbuf->st_ino); | ||
374 | err |= put_user(stat->mode, &statbuf->st_mode); | ||
375 | err |= put_user(stat->nlink, &statbuf->st_nlink); | ||
376 | err |= put_user(stat->uid, &statbuf->st_uid); | ||
377 | err |= put_user(stat->gid, &statbuf->st_gid); | ||
378 | err |= put_user(huge_encode_dev(stat->rdev), &statbuf->st_rdev); | ||
379 | err |= put_user(0, (unsigned long __user *) &statbuf->__pad3[0]); | ||
380 | err |= put_user(stat->size, &statbuf->st_size); | ||
381 | err |= put_user(stat->blksize, &statbuf->st_blksize); | ||
382 | err |= put_user(0, (unsigned int __user *) &statbuf->__pad4[0]); | ||
383 | err |= put_user(0, (unsigned int __user *) &statbuf->__pad4[4]); | ||
384 | err |= put_user(stat->blocks, &statbuf->st_blocks); | ||
385 | err |= put_user(stat->atime.tv_sec, &statbuf->st_atime); | ||
386 | err |= put_user(stat->atime.tv_nsec, &statbuf->st_atime_nsec); | ||
387 | err |= put_user(stat->mtime.tv_sec, &statbuf->st_mtime); | ||
388 | err |= put_user(stat->mtime.tv_nsec, &statbuf->st_mtime_nsec); | ||
389 | err |= put_user(stat->ctime.tv_sec, &statbuf->st_ctime); | ||
390 | err |= put_user(stat->ctime.tv_nsec, &statbuf->st_ctime_nsec); | ||
391 | err |= put_user(0, &statbuf->__unused4); | ||
392 | err |= put_user(0, &statbuf->__unused5); | ||
393 | |||
394 | return err; | ||
395 | } | ||
396 | |||
397 | asmlinkage long compat_sys_stat64(char __user * filename, | ||
398 | struct compat_stat64 __user *statbuf) | ||
399 | { | ||
400 | struct kstat stat; | ||
401 | int error = vfs_stat(filename, &stat); | ||
402 | |||
403 | if (!error) | ||
404 | error = cp_compat_stat64(&stat, statbuf); | ||
405 | return error; | ||
406 | } | ||
407 | |||
408 | asmlinkage long compat_sys_lstat64(char __user * filename, | ||
409 | struct compat_stat64 __user *statbuf) | ||
410 | { | ||
411 | struct kstat stat; | ||
412 | int error = vfs_lstat(filename, &stat); | ||
413 | |||
414 | if (!error) | ||
415 | error = cp_compat_stat64(&stat, statbuf); | ||
416 | return error; | ||
417 | } | ||
418 | |||
419 | asmlinkage long compat_sys_fstat64(unsigned int fd, | ||
420 | struct compat_stat64 __user * statbuf) | ||
421 | { | ||
422 | struct kstat stat; | ||
423 | int error = vfs_fstat(fd, &stat); | ||
424 | |||
425 | if (!error) | ||
426 | error = cp_compat_stat64(&stat, statbuf); | ||
427 | return error; | ||
428 | } | ||
429 | |||
368 | asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2) | 430 | asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2) |
369 | { | 431 | { |
370 | return sys_sysfs(option, arg1, arg2); | 432 | return sys_sysfs(option, arg1, arg2); |
diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S index a4ccb65aece8..a5e36a4c8924 100644 --- a/arch/sparc64/kernel/systbls.S +++ b/arch/sparc64/kernel/systbls.S | |||
@@ -32,7 +32,7 @@ sys_call_table32: | |||
32 | .word sys32_umount, sys32_setgid16, sys32_getgid16, sys32_signal, sys32_geteuid16 | 32 | .word sys32_umount, sys32_setgid16, sys32_getgid16, sys32_signal, sys32_geteuid16 |
33 | /*50*/ .word sys32_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl | 33 | /*50*/ .word sys32_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl |
34 | .word sys32_reboot, sys32_mmap2, sys_symlink, sys32_readlink, sys32_execve | 34 | .word sys32_reboot, sys32_mmap2, sys_symlink, sys32_readlink, sys32_execve |
35 | /*60*/ .word sys32_umask, sys_chroot, compat_sys_newfstat, sys_fstat64, sys_getpagesize | 35 | /*60*/ .word sys32_umask, sys_chroot, compat_sys_newfstat, compat_sys_fstat64, sys_getpagesize |
36 | .word sys32_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid | 36 | .word sys32_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid |
37 | /*70*/ .word sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect | 37 | /*70*/ .word sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect |
38 | .word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys32_getgroups16 | 38 | .word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys32_getgroups16 |
@@ -46,8 +46,8 @@ sys_call_table32: | |||
46 | .word sys32_getgroups, sys32_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd | 46 | .word sys32_getgroups, sys32_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd |
47 | /*120*/ .word compat_sys_readv, compat_sys_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod | 47 | /*120*/ .word compat_sys_readv, compat_sys_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod |
48 | .word sys_nis_syscall, sys32_setreuid16, sys32_setregid16, sys_rename, sys_truncate | 48 | .word sys_nis_syscall, sys32_setreuid16, sys32_setregid16, sys_rename, sys_truncate |
49 | /*130*/ .word sys_ftruncate, sys_flock, sys_lstat64, sys_nis_syscall, sys_nis_syscall | 49 | /*130*/ .word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall |
50 | .word sys_nis_syscall, sys32_mkdir, sys_rmdir, sys32_utimes, sys_stat64 | 50 | .word sys_nis_syscall, sys32_mkdir, sys_rmdir, sys32_utimes, compat_sys_stat64 |
51 | /*140*/ .word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit | 51 | /*140*/ .word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit |
52 | .word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write | 52 | .word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write |
53 | /*150*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 | 53 | /*150*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 |
@@ -98,7 +98,7 @@ sys_call_table: | |||
98 | .word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid | 98 | .word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid |
99 | /*50*/ .word sys_getegid, sys_acct, sys_memory_ordering, sys_nis_syscall, sys_ioctl | 99 | /*50*/ .word sys_getegid, sys_acct, sys_memory_ordering, sys_nis_syscall, sys_ioctl |
100 | .word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve | 100 | .word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve |
101 | /*60*/ .word sys_umask, sys_chroot, sys_newfstat, sys_nis_syscall, sys_getpagesize | 101 | /*60*/ .word sys_umask, sys_chroot, sys_newfstat, sys_stat64, sys_getpagesize |
102 | .word sys_msync, sys_vfork, sys_pread64, sys_pwrite64, sys_nis_syscall | 102 | .word sys_msync, sys_vfork, sys_pread64, sys_pwrite64, sys_nis_syscall |
103 | /*70*/ .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys64_munmap, sys_mprotect | 103 | /*70*/ .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys64_munmap, sys_mprotect |
104 | .word sys_madvise, sys_vhangup, sys_nis_syscall, sys_mincore, sys_getgroups | 104 | .word sys_madvise, sys_vhangup, sys_nis_syscall, sys_mincore, sys_getgroups |
@@ -112,8 +112,8 @@ sys_call_table: | |||
112 | .word sys_nis_syscall, sys_gettimeofday, sys_getrusage, sys_getsockopt, sys_getcwd | 112 | .word sys_nis_syscall, sys_gettimeofday, sys_getrusage, sys_getsockopt, sys_getcwd |
113 | /*120*/ .word sys_readv, sys_writev, sys_settimeofday, sys_fchown, sys_fchmod | 113 | /*120*/ .word sys_readv, sys_writev, sys_settimeofday, sys_fchown, sys_fchmod |
114 | .word sys_recvfrom, sys_setreuid, sys_setregid, sys_rename, sys_truncate | 114 | .word sys_recvfrom, sys_setreuid, sys_setregid, sys_rename, sys_truncate |
115 | /*130*/ .word sys_ftruncate, sys_flock, sys_nis_syscall, sys_sendto, sys_shutdown | 115 | /*130*/ .word sys_ftruncate, sys_flock, sys_lstat64, sys_sendto, sys_shutdown |
116 | .word sys_socketpair, sys_mkdir, sys_rmdir, sys_utimes, sys_nis_syscall | 116 | .word sys_socketpair, sys_mkdir, sys_rmdir, sys_utimes, sys_stat64 |
117 | /*140*/ .word sys_sendfile64, sys_getpeername, sys_futex, sys_gettid, sys_getrlimit | 117 | /*140*/ .word sys_sendfile64, sys_getpeername, sys_futex, sys_gettid, sys_getrlimit |
118 | .word sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write | 118 | .word sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write |
119 | /*150*/ .word sys_getsockname, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 | 119 | /*150*/ .word sys_getsockname, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 |