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