Commit 0112fc22 authored by Oleg Drokin's avatar Oleg Drokin Committed by Al Viro

Separate out common fstatat code into vfs_fstatat

This is a version incorporating Christoph's suggestion.

Separate out common *fstatat functionality into a single function
instead of duplicating it all over the code.
Signed-off-by: default avatarOleg Drokin <green@linuxhacker.ru>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent fd56d242
...@@ -177,21 +177,12 @@ asmlinkage long sys_oabi_fstatat64(int dfd, ...@@ -177,21 +177,12 @@ asmlinkage long sys_oabi_fstatat64(int dfd,
int flag) int flag)
{ {
struct kstat stat; struct kstat stat;
int error = -EINVAL; int error;
if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0) error = vfs_fstatat(dfd, filename, &stat, flag);
goto out; if (error)
if (flag & AT_SYMLINK_NOFOLLOW)
error = vfs_lstat_fd(dfd, filename, &stat);
else
error = vfs_stat_fd(dfd, filename, &stat);
if (!error)
error = cp_oldabi_stat64(&stat, statbuf);
out:
return error; return error;
return cp_oldabi_stat64(&stat, statbuf);
} }
struct oabi_flock64 { struct oabi_flock64 {
......
...@@ -702,20 +702,12 @@ asmlinkage long sys32_fstatat64(unsigned int dfd, char __user *filename, ...@@ -702,20 +702,12 @@ asmlinkage long sys32_fstatat64(unsigned int dfd, char __user *filename,
struct stat64_emu31 __user* statbuf, int flag) struct stat64_emu31 __user* statbuf, int flag)
{ {
struct kstat stat; struct kstat stat;
int error = -EINVAL; int error;
if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
goto out;
if (flag & AT_SYMLINK_NOFOLLOW)
error = vfs_lstat_fd(dfd, filename, &stat);
else
error = vfs_stat_fd(dfd, filename, &stat);
if (!error) error = vfs_fstatat(dfd, filename, &stat, flag);
error = cp_stat64(statbuf, &stat); if (error)
out:
return error; return error;
return cp_stat64(statbuf, &stat);
} }
/* /*
......
...@@ -206,21 +206,12 @@ asmlinkage long compat_sys_fstatat64(unsigned int dfd, char __user *filename, ...@@ -206,21 +206,12 @@ asmlinkage long compat_sys_fstatat64(unsigned int dfd, char __user *filename,
struct compat_stat64 __user * statbuf, int flag) struct compat_stat64 __user * statbuf, int flag)
{ {
struct kstat stat; struct kstat stat;
int error = -EINVAL; int error;
if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
goto out;
if (flag & AT_SYMLINK_NOFOLLOW)
error = vfs_lstat_fd(dfd, filename, &stat);
else
error = vfs_stat_fd(dfd, filename, &stat);
if (!error)
error = cp_compat_stat64(&stat, statbuf);
out: error = vfs_fstatat(dfd, filename, &stat, flag);
if (error)
return error; return error;
return cp_compat_stat64(&stat, statbuf);
} }
asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2) asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2)
......
...@@ -129,21 +129,12 @@ asmlinkage long sys32_fstatat(unsigned int dfd, char __user *filename, ...@@ -129,21 +129,12 @@ asmlinkage long sys32_fstatat(unsigned int dfd, char __user *filename,
struct stat64 __user *statbuf, int flag) struct stat64 __user *statbuf, int flag)
{ {
struct kstat stat; struct kstat stat;
int error = -EINVAL; int error;
if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0) error = vfs_fstatat(dfd, filename, &stat, flag);
goto out; if (error)
if (flag & AT_SYMLINK_NOFOLLOW)
error = vfs_lstat_fd(dfd, filename, &stat);
else
error = vfs_stat_fd(dfd, filename, &stat);
if (!error)
error = cp_stat64(statbuf, &stat);
out:
return error; return error;
return cp_stat64(statbuf, &stat);
} }
/* /*
......
...@@ -204,21 +204,12 @@ asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user *filename, ...@@ -204,21 +204,12 @@ asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user *filename,
struct compat_stat __user *statbuf, int flag) struct compat_stat __user *statbuf, int flag)
{ {
struct kstat stat; struct kstat stat;
int error = -EINVAL; int error;
if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
goto out;
if (flag & AT_SYMLINK_NOFOLLOW)
error = vfs_lstat_fd(dfd, filename, &stat);
else
error = vfs_stat_fd(dfd, filename, &stat);
if (!error)
error = cp_compat_stat(&stat, statbuf);
out: error = vfs_fstatat(dfd, filename, &stat, flag);
if (error)
return error; return error;
return cp_compat_stat(&stat, statbuf);
} }
#endif #endif
......
...@@ -109,6 +109,24 @@ int vfs_fstat(unsigned int fd, struct kstat *stat) ...@@ -109,6 +109,24 @@ int vfs_fstat(unsigned int fd, struct kstat *stat)
EXPORT_SYMBOL(vfs_fstat); EXPORT_SYMBOL(vfs_fstat);
int vfs_fstatat(int dfd, char __user *filename, struct kstat *stat, int flag)
{
int error = -EINVAL;
if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
goto out;
if (flag & AT_SYMLINK_NOFOLLOW)
error = vfs_lstat_fd(dfd, filename, stat);
else
error = vfs_stat_fd(dfd, filename, stat);
out:
return error;
}
EXPORT_SYMBOL(vfs_fstatat);
#ifdef __ARCH_WANT_OLD_STAT #ifdef __ARCH_WANT_OLD_STAT
/* /*
...@@ -264,21 +282,12 @@ SYSCALL_DEFINE4(newfstatat, int, dfd, char __user *, filename, ...@@ -264,21 +282,12 @@ SYSCALL_DEFINE4(newfstatat, int, dfd, char __user *, filename,
struct stat __user *, statbuf, int, flag) struct stat __user *, statbuf, int, flag)
{ {
struct kstat stat; struct kstat stat;
int error = -EINVAL; int error;
if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
goto out;
if (flag & AT_SYMLINK_NOFOLLOW)
error = vfs_lstat_fd(dfd, filename, &stat);
else
error = vfs_stat_fd(dfd, filename, &stat);
if (!error)
error = cp_new_stat(&stat, statbuf);
out: error = vfs_fstatat(dfd, filename, &stat, flag);
if (error)
return error; return error;
return cp_new_stat(&stat, statbuf);
} }
#endif #endif
...@@ -404,21 +413,12 @@ SYSCALL_DEFINE4(fstatat64, int, dfd, char __user *, filename, ...@@ -404,21 +413,12 @@ SYSCALL_DEFINE4(fstatat64, int, dfd, char __user *, filename,
struct stat64 __user *, statbuf, int, flag) struct stat64 __user *, statbuf, int, flag)
{ {
struct kstat stat; struct kstat stat;
int error = -EINVAL; int error;
if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
goto out;
if (flag & AT_SYMLINK_NOFOLLOW)
error = vfs_lstat_fd(dfd, filename, &stat);
else
error = vfs_stat_fd(dfd, filename, &stat);
if (!error)
error = cp_new_stat64(&stat, statbuf);
out: error = vfs_fstatat(dfd, filename, &stat, flag);
if (error)
return error; return error;
return cp_new_stat64(&stat, statbuf);
} }
#endif /* __ARCH_WANT_STAT64 */ #endif /* __ARCH_WANT_STAT64 */
......
...@@ -2302,6 +2302,7 @@ extern int vfs_lstat(char __user *, struct kstat *); ...@@ -2302,6 +2302,7 @@ extern int vfs_lstat(char __user *, struct kstat *);
extern int vfs_stat_fd(int dfd, char __user *, struct kstat *); extern int vfs_stat_fd(int dfd, char __user *, struct kstat *);
extern int vfs_lstat_fd(int dfd, char __user *, struct kstat *); extern int vfs_lstat_fd(int dfd, char __user *, struct kstat *);
extern int vfs_fstat(unsigned int, struct kstat *); extern int vfs_fstat(unsigned int, struct kstat *);
extern int vfs_fstatat(int , char __user *, struct kstat *, int);
extern int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, extern int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,
unsigned long arg); unsigned long arg);
......
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