Commit 73136fa5 authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] (3/5) beginning of getattr series.

irix_...() switched from sys_new*stat() to vfs_*stat() and cleaned up. 
Missing LFS check added
parent 9bf01f06
......@@ -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;
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;
break;
}
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;
error = vfs_lstat(filename, &stat);
irix_xstat64_xlate(statbuf);
if (!error) {
switch (version) {
case 2:
error = irix_xstat32_xlate(&stat, statbuf);
break;
case 3:
irix_xstat64_xlate(&stat, statbuf);
error = 0;
goto out;
}
break;
default:
error = -EINVAL;
goto out;
}
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 = 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;
goto out;
}
break;
default:
error = -EINVAL;
goto out;
}
out:
}
return error;
}
......
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