]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] (3/5) beginning of getattr series.
authorAlexander Viro <viro@math.psu.edu>
Wed, 6 Feb 2002 02:46:34 +0000 (18:46 -0800)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Wed, 6 Feb 2002 02:46:34 +0000 (18:46 -0800)
irix_...() switched from sys_new*stat() to vfs_*stat() and cleaned up.
Missing LFS check added

arch/mips/kernel/sysirix.c

index fbd4a2dcc105c35881defdd3ae87dd3966a922f8..9f820f87e25f2402a920cda9bdb89c4768ad3500 100644 (file)
@@ -1178,7 +1178,7 @@ linux_to_irix_dev_t (dev_t t)
        return MAJOR (t) << 18 | MINOR (t);
 }
 
-static inline int irix_xstat32_xlate(struct stat *kb, void *ubuf)
+static inline int irix_xstat32_xlate(struct kstat *stat, void *ubuf)
 {
        struct xstat32 {
                u32 st_dev, st_pad1[3], st_ino, st_mode, st_nlink, st_uid, st_gid;
@@ -1191,28 +1191,32 @@ static inline int irix_xstat32_xlate(struct stat *kb, void *ubuf)
                u32 st_pad4[8];
        } ub;
 
-       ub.st_dev     = linux_to_irix_dev_t (kb->st_dev);
-       ub.st_ino     = kb->st_ino;
-       ub.st_mode    = kb->st_mode;
-       ub.st_nlink   = kb->st_nlink;
-       ub.st_uid     = kb->st_uid;
-       ub.st_gid     = kb->st_gid;
-       ub.st_rdev    = linux_to_irix_dev_t (kb->st_rdev);
-       ub.st_size    = kb->st_size;
-       ub.st_atime0  = kb->st_atime;
+       ub.st_dev     = linux_to_irix_dev_t(stat->dev);
+       ub.st_ino     = stat->ino;
+       ub.st_mode    = stat->mode;
+       ub.st_nlink   = stat->nlink;
+       SET_STAT_UID(ub, stat->uid);
+       SET_STAT_GID(ub, stat->gid);
+       ub.st_rdev    = linux_to_irix_dev_t(stat->rdev);
+#if BITS_PER_LONG == 32
+       if (stat->size > MAX_NON_LFS)
+               return -EOVERFLOW;
+#endif 
+       ub.st_size    = stat->size;
+       ub.st_atime0  = stat->atime;
        ub.st_atime1  = 0;
-       ub.st_mtime0  = kb->st_mtime;
+       ub.st_mtime0  = stat->mtime;
        ub.st_mtime1  = 0;
-       ub.st_ctime0  = kb->st_ctime;
+       ub.st_ctime0  = stat->ctime;
        ub.st_ctime1  = 0;
-       ub.st_blksize = kb->st_blksize;
-       ub.st_blocks  = kb->st_blocks;
+       ub.st_blksize = stat->blksize;
+       ub.st_blocks  = stat->blocks;
        strcpy (ub.st_fstype, "efs");
 
        return copy_to_user(ubuf, &ub, sizeof(ub)) ? -EFAULT : 0;
 }
 
-static inline void irix_xstat64_xlate(struct stat *sb)
+static inline void irix_xstat64_xlate(struct kstat *stat, void *ubuf)
 {
        struct xstat64 {
                u32 st_dev; s32 st_pad1[3];
@@ -1229,177 +1233,112 @@ static inline void irix_xstat64_xlate(struct stat *sb)
                s32 st_pad4[8];
        } ks;
 
-       ks.st_dev = linux_to_irix_dev_t (sb->st_dev);
+       ks.st_dev = linux_to_irix_dev_t(stat->dev);
        ks.st_pad1[0] = ks.st_pad1[1] = ks.st_pad1[2] = 0;
-       ks.st_ino = (unsigned long long) sb->st_ino;
-       ks.st_mode = (u32) sb->st_mode;
-       ks.st_nlink = (u32) sb->st_nlink;
-       ks.st_uid = (s32) sb->st_uid;
-       ks.st_gid = (s32) sb->st_gid;
-       ks.st_rdev = linux_to_irix_dev_t (sb->st_rdev);
+       ks.st_ino = (unsigned long long) stat->ino;
+       ks.st_mode = (u32) stat->mode;
+       ks.st_nlink = (u32) stat->nlink;
+       ks.st_uid = (s32) stat->uid;
+       ks.st_gid = (s32) stat->gid;
+       ks.st_rdev = linux_to_irix_dev_t (stat->rdev);
        ks.st_pad2[0] = ks.st_pad2[1] = 0;
-       ks.st_size = (long long) sb->st_size;
+       ks.st_size = (long long) stat->size;
        ks.st_pad3 = 0;
 
        /* XXX hackety hack... */
-       ks.st_atime.tv_sec = (s32) sb->st_atime; ks.st_atime.tv_nsec = 0;
-       ks.st_mtime.tv_sec = (s32) sb->st_atime; ks.st_mtime.tv_nsec = 0;
-       ks.st_ctime.tv_sec = (s32) sb->st_atime; ks.st_ctime.tv_nsec = 0;
+       ks.st_atime.tv_sec = (s32) stat->atime; ks.st_atime.tv_nsec = 0;
+       ks.st_mtime.tv_sec = (s32) stat->atime; ks.st_mtime.tv_nsec = 0;
+       ks.st_ctime.tv_sec = (s32) stat->atime; ks.st_ctime.tv_nsec = 0;
 
-       ks.st_blksize = (s32) sb->st_blksize;
-       ks.st_blocks = (long long) sb->st_blocks;
+       ks.st_blksize = (s32) stat->blksize;
+       ks.st_blocks = (long long) stat->blocks;
        memset(ks.st_fstype, 0, 16);
        ks.st_pad4[0] = ks.st_pad4[1] = ks.st_pad4[2] = ks.st_pad4[3] = 0;
        ks.st_pad4[4] = ks.st_pad4[5] = ks.st_pad4[6] = ks.st_pad4[7] = 0;
 
        /* Now write it all back. */
-       copy_to_user(sb, &ks, sizeof(struct xstat64));
+       copy_to_user(ubuf, &ks, sizeof(struct xstat64));
 }
 
-extern asmlinkage int sys_newstat(char * filename, struct stat * statbuf);
-
 asmlinkage int irix_xstat(int version, char *filename, struct stat *statbuf)
 {
        int retval;
+       struct kstat stat;
 
 #ifdef DEBUG_XSTAT
        printk("[%s:%d] Wheee.. irix_xstat(%d,%s,%p) ",
               current->comm, current->pid, version, filename, statbuf);
 #endif
-       switch(version) {
-       case 2: {
-               struct stat kb;
-               mm_segment_t old_fs;
-
-               old_fs = get_fs(); set_fs(get_ds());
-               retval = sys_newstat(filename, &kb);
-               set_fs(old_fs);
-#ifdef DEBUG_XSTAT
-               printk("retval[%d]\n", retval);
-#endif
-               if(retval)
-                       goto out;
-               retval = irix_xstat32_xlate(&kb, statbuf);
-               goto out;
-       }
-
-       case 3: {
-               retval = sys_newstat(filename, statbuf);
-#ifdef DEBUG_XSTAT
-               printk("retval[%d]\n", retval);
-#endif
-               if(retval)
-                       goto out;
-
-               irix_xstat64_xlate(statbuf);
-               retval = 0;
-               break;
-       }
 
-       default:
-               retval = -EINVAL;
-               break;
+       retval = vfs_stat(filename, &stat);
+       if (!retval) {
+               switch(version) {
+                       case 2:
+                               retval = irix_xstat32_xlate(&stat, statbuf);
+                               break;
+                       case 3:
+                               irix_xstat64_xlate(&stat, statbuf);
+                               retval = 0; /* Really? */
+                               break;
+                       default:
+                               retval = -EINVAL;
+               }
        }
-
-out:
        return retval;
 }
 
-extern asmlinkage int sys_newlstat(char * filename, struct stat * statbuf);
-
 asmlinkage int irix_lxstat(int version, char *filename, struct stat *statbuf)
 {
        int error;
+       struct kstat stat;
 
 #ifdef DEBUG_XSTAT
        printk("[%s:%d] Wheee.. irix_lxstat(%d,%s,%p) ",
               current->comm, current->pid, version, filename, statbuf);
 #endif
-       switch(version) {
-       case 2: {
-               struct stat kb;
-               mm_segment_t old_fs;
-
-               old_fs = get_fs(); set_fs(get_ds());
-               error = sys_newlstat(filename, &kb);
-               set_fs(old_fs);
-#ifdef DEBUG_XSTAT
-               printk("error[%d]\n", error);
-#endif
-               if(error)
-                       goto out;
-               error = irix_xstat32_xlate(&kb, statbuf);
-               goto out;
-       }
-
-       case 3: {
-               error = sys_newlstat(filename, statbuf);
-#ifdef DEBUG_XSTAT
-               printk("error[%d]\n", error);
-#endif
-               if(error)
-                       goto out;
-
-               irix_xstat64_xlate(statbuf);
-               error = 0;
-               goto out;
-       }
 
-       default:
-               error = -EINVAL;
-               goto out;
+       error = vfs_lstat(filename, &stat);
+
+       if (!error) {
+               switch (version) {
+                       case 2:
+                               error = irix_xstat32_xlate(&stat, statbuf);
+                               break;
+                       case 3:
+                               irix_xstat64_xlate(&stat, statbuf);
+                               error = 0;
+                               break;
+                       default:
+                               error = -EINVAL;
+               }
        }
-
-out:
        return error;
 }
 
-extern asmlinkage int sys_newfstat(unsigned int fd, struct stat * statbuf);
-
 asmlinkage int irix_fxstat(int version, int fd, struct stat *statbuf)
 {
        int error;
+       struct kstat stat;
 
 #ifdef DEBUG_XSTAT
        printk("[%s:%d] Wheee.. irix_fxstat(%d,%d,%p) ",
               current->comm, current->pid, version, fd, statbuf);
 #endif
-       switch(version) {
-       case 2: {
-               struct stat kb;
-               mm_segment_t old_fs;
-
-               old_fs = get_fs(); set_fs(get_ds());
-               error = sys_newfstat(fd, &kb);
-               set_fs(old_fs);
-#ifdef DEBUG_XSTAT
-               printk("error[%d]\n", error);
-#endif
-               if(error)
-                       goto out;
-               error = irix_xstat32_xlate(&kb, statbuf);
-               goto out;
-       }
-
-       case 3: {
-               error = sys_newfstat(fd, statbuf);
-#ifdef DEBUG_XSTAT
-               printk("error[%d]\n", error);
-#endif
-               if(error)
-                       goto out;
 
-               irix_xstat64_xlate(statbuf);
-               error = 0;
-               goto out;
-       }
-
-       default:
-               error = -EINVAL;
-               goto out;
+       error = vfs_fstat(fd, &stat);
+       if (!error) {
+               switch (version) {
+                       case 2:
+                               error = irix_xstat32_xlate(&stat, statbuf);
+                               break;
+                       case 3:
+                               irix_xstat64_xlate(&stat, statbuf);
+                               error = 0;
+                               break;
+                       default:
+                               error = -EINVAL;
+               }
        }
-
-out:
        return error;
 }