diff options
| author | Alexander Viro <viro@math.psu.edu> | 2002-02-05 18:46:38 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@penguin.transmeta.com> | 2002-02-05 18:46:38 -0800 |
| commit | 65ae2396a0de6c156e49c1fe3fd4a8befed723da (patch) | |
| tree | 8a735cd4396ad3e9181300b47006f5200635da79 | |
| parent | d663eaa974916db46c9cb05f24498b6bbbdf3a42 (diff) | |
[PATCH] (5/5) beginning of getattr series.
ia64: switched from sys_new*stat() to vfs_*stat() and cleaned up.
| -rw-r--r-- | arch/ia64/ia32/sys_ia32.c | 157 |
1 files changed, 65 insertions, 92 deletions
diff --git a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c index 4e6d8f3b50cc..e11e8d92b471 100644 --- a/arch/ia64/ia32/sys_ia32.c +++ b/arch/ia64/ia32/sys_ia32.c @@ -171,77 +171,65 @@ sys32_execve (char *filename, unsigned int argv, unsigned int envp, } static inline int -putstat (struct stat32 *ubuf, struct stat *kbuf) +putstat (struct stat32 *ubuf, struct kstat *stat) { int err; + if (stat->size > MAX_NON_LFS) + return -EOVERFLOW; + if (clear_user(ubuf, sizeof(*ubuf))) - return 1; - - err = __put_user(kbuf->st_dev, &ubuf->st_dev); - err |= __put_user(kbuf->st_ino, &ubuf->st_ino); - err |= __put_user(kbuf->st_mode, &ubuf->st_mode); - err |= __put_user(kbuf->st_nlink, &ubuf->st_nlink); - err |= __put_user(kbuf->st_uid, &ubuf->st_uid); - err |= __put_user(kbuf->st_gid, &ubuf->st_gid); - err |= __put_user(kbuf->st_rdev, &ubuf->st_rdev); - err |= __put_user(kbuf->st_size, &ubuf->st_size); - err |= __put_user(kbuf->st_atime, &ubuf->st_atime); - err |= __put_user(kbuf->st_mtime, &ubuf->st_mtime); - err |= __put_user(kbuf->st_ctime, &ubuf->st_ctime); - err |= __put_user(kbuf->st_blksize, &ubuf->st_blksize); - err |= __put_user(kbuf->st_blocks, &ubuf->st_blocks); + return -EFAULT; + + err = __put_user(stat->dev, &ubuf->st_dev); + err |= __put_user(stat->ino, &ubuf->st_ino); + err |= __put_user(stat->mode, &ubuf->st_mode); + err |= __put_user(stat->nlink, &ubuf->st_nlink); + err |= __put_user(high2lowuid(stat->uid), &ubuf->st_uid); + err |= __put_user(high2lowgid(stat->gid), &ubuf->st_gid); + err |= __put_user(stat->rdev, &ubuf->st_rdev); + err |= __put_user(stat->size, &ubuf->st_size); + err |= __put_user(stat->atime, &ubuf->st_atime); + err |= __put_user(stat->mtime, &ubuf->st_mtime); + err |= __put_user(stat->ctime, &ubuf->st_ctime); + err |= __put_user(stat->blksize, &ubuf->st_blksize); + err |= __put_user(stat->blocks, &ubuf->st_blocks); return err; } -extern asmlinkage long sys_newstat (char * filename, struct stat * statbuf); - asmlinkage long sys32_newstat (char *filename, struct stat32 *statbuf) { - int ret; - struct stat s; - mm_segment_t old_fs = get_fs(); + struct kstat stat; + int ret = vfs_stat(filename, &stat); + + if (!ret) + ret = putstat(statbuf, &stat); - set_fs(KERNEL_DS); - ret = sys_newstat(filename, &s); - set_fs(old_fs); - if (putstat(statbuf, &s)) - return -EFAULT; return ret; } -extern asmlinkage long sys_newlstat(char * filename, struct stat * statbuf); - asmlinkage long sys32_newlstat (char *filename, struct stat32 *statbuf) { - mm_segment_t old_fs = get_fs(); - struct stat s; - int ret; + struct kstat stat; + int ret = vfs_lstat(filename, &stat); + + if (!ret) + ret = putstat(statbuf, &stat); - set_fs(KERNEL_DS); - ret = sys_newlstat(filename, &s); - set_fs(old_fs); - if (putstat(statbuf, &s)) - return -EFAULT; return ret; } -extern asmlinkage long sys_newfstat(unsigned int fd, struct stat * statbuf); - asmlinkage long sys32_newfstat (unsigned int fd, struct stat32 *statbuf) { - mm_segment_t old_fs = get_fs(); - struct stat s; - int ret; + struct kstat stat; + int ret = vfs_fstat(fd, &stat); + + if (!ret) + ret = putstat(statbuf, &stat); - set_fs(KERNEL_DS); - ret = sys_newfstat(fd, &s); - set_fs(old_fs); - if (putstat(statbuf, &s)) - return -EFAULT; return ret; } @@ -3529,74 +3517,59 @@ sys32_ftruncate64 (int fd, unsigned int len_lo, unsigned int len_hi) } static int -putstat64 (struct stat64 *ubuf, struct stat *kbuf) +putstat64 (struct stat64 *ubuf, struct kstat *kbuf) { int err; if (clear_user(ubuf, sizeof(*ubuf))) - return 1; - - err = __put_user(kbuf->st_dev, &ubuf->st_dev); - err |= __put_user(kbuf->st_ino, &ubuf->__st_ino); - err |= __put_user(kbuf->st_ino, &ubuf->st_ino_lo); - err |= __put_user(kbuf->st_ino >> 32, &ubuf->st_ino_hi); - err |= __put_user(kbuf->st_mode, &ubuf->st_mode); - err |= __put_user(kbuf->st_nlink, &ubuf->st_nlink); - err |= __put_user(kbuf->st_uid, &ubuf->st_uid); - err |= __put_user(kbuf->st_gid, &ubuf->st_gid); - err |= __put_user(kbuf->st_rdev, &ubuf->st_rdev); - err |= __put_user(kbuf->st_size, &ubuf->st_size_lo); - err |= __put_user((kbuf->st_size >> 32), &ubuf->st_size_hi); - err |= __put_user(kbuf->st_atime, &ubuf->st_atime); - err |= __put_user(kbuf->st_mtime, &ubuf->st_mtime); - err |= __put_user(kbuf->st_ctime, &ubuf->st_ctime); - err |= __put_user(kbuf->st_blksize, &ubuf->st_blksize); - err |= __put_user(kbuf->st_blocks, &ubuf->st_blocks); + return -EFAULT; + + err = __put_user(kbuf->dev, &ubuf->st_dev); + err |= __put_user(kbuf->ino, &ubuf->__st_ino); + err |= __put_user(kbuf->ino, &ubuf->st_ino_lo); + err |= __put_user(kbuf->ino >> 32, &ubuf->st_ino_hi); + err |= __put_user(kbuf->mode, &ubuf->st_mode); + err |= __put_user(kbuf->nlink, &ubuf->st_nlink); + err |= __put_user(kbuf->uid, &ubuf->st_uid); + err |= __put_user(kbuf->gid, &ubuf->st_gid); + err |= __put_user(kbuf->rdev, &ubuf->st_rdev); + err |= __put_user(kbuf->size, &ubuf->st_size_lo); + err |= __put_user((kbuf->size >> 32), &ubuf->st_size_hi); + err |= __put_user(kbuf->atime, &ubuf->st_atime); + err |= __put_user(kbuf->mtime, &ubuf->st_mtime); + err |= __put_user(kbuf->ctime, &ubuf->st_ctime); + err |= __put_user(kbuf->blksize, &ubuf->st_blksize); + err |= __put_user(kbuf->blocks, &ubuf->st_blocks); return err; } asmlinkage long sys32_stat64 (char *filename, struct stat64 *statbuf) { - mm_segment_t old_fs = get_fs(); - struct stat s; - long ret; - - set_fs(KERNEL_DS); - ret = sys_newstat(filename, &s); - set_fs(old_fs); - if (putstat64(statbuf, &s)) - return -EFAULT; + struct kstat s; + long ret = vfs_stat(filename, &s); + if (!ret) + ret = putstat64(statbuf, &s); return ret; } asmlinkage long sys32_lstat64 (char *filename, struct stat64 *statbuf) { - mm_segment_t old_fs = get_fs(); - struct stat s; - long ret; - - set_fs(KERNEL_DS); - ret = sys_newlstat(filename, &s); - set_fs(old_fs); - if (putstat64(statbuf, &s)) - return -EFAULT; + struct kstat s; + long ret = vfs_lstat(filename, &s); + if (!ret) + ret = putstat64(statbuf, &s); return ret; } asmlinkage long sys32_fstat64 (unsigned int fd, struct stat64 *statbuf) { - mm_segment_t old_fs = get_fs(); - struct stat s; - long ret; - - set_fs(KERNEL_DS); - ret = sys_newfstat(fd, &s); - set_fs(old_fs); - if (putstat64(statbuf, &s)) - return -EFAULT; + struct kstat s; + long ret = vfs_fstat(fd, &s); + if (!ret) + ret = putstat64(statbuf, &s); return ret; } |
