diff options
| author | Oleg Drokin <green@linuxhacker.ru> | 2009-04-08 20:05:42 +0400 | 
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2009-04-20 23:02:51 -0400 | 
| commit | 0112fc2229847feb6c4eb011e6833d8f1742a375 (patch) | |
| tree | c5bda0b4f5a5f942478faf2fb5961df7fbd15546 | |
| parent | fd56d242b3b80b6f2ca174272b20029aae61df75 (diff) | |
| download | olio-linux-3.10-0112fc2229847feb6c4eb011e6833d8f1742a375.tar.xz olio-linux-3.10-0112fc2229847feb6c4eb011e6833d8f1742a375.zip  | |
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: Oleg Drokin <green@linuxhacker.ru>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| -rw-r--r-- | arch/arm/kernel/sys_oabi-compat.c | 19 | ||||
| -rw-r--r-- | arch/s390/kernel/compat_linux.c | 18 | ||||
| -rw-r--r-- | arch/sparc/kernel/sys_sparc32.c | 19 | ||||
| -rw-r--r-- | arch/x86/ia32/sys_ia32.c | 19 | ||||
| -rw-r--r-- | fs/compat.c | 19 | ||||
| -rw-r--r-- | fs/stat.c | 56 | ||||
| -rw-r--r-- | include/linux/fs.h | 1 | 
7 files changed, 54 insertions, 97 deletions
diff --git a/arch/arm/kernel/sys_oabi-compat.c b/arch/arm/kernel/sys_oabi-compat.c index e04173c7e62..d59a0cd537f 100644 --- a/arch/arm/kernel/sys_oabi-compat.c +++ b/arch/arm/kernel/sys_oabi-compat.c @@ -177,21 +177,12 @@ asmlinkage long sys_oabi_fstatat64(int dfd,  				   int flag)  {  	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_oldabi_stat64(&stat, statbuf); - -out: -	return error; +	error = vfs_fstatat(dfd, filename, &stat, flag); +	if (error) +		return error; +	return cp_oldabi_stat64(&stat, statbuf);  }  struct oabi_flock64 { diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 6cc87d8c868..002c70d3cb7 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c @@ -702,20 +702,12 @@ asmlinkage long sys32_fstatat64(unsigned int dfd, char __user *filename,  				struct stat64_emu31 __user* statbuf, int flag)  {  	struct kstat stat; -	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); +	int error; -	if (!error) -		error = cp_stat64(statbuf, &stat); -out: -	return error; +	error = vfs_fstatat(dfd, filename, &stat, flag); +	if (error) +		return error; +	return cp_stat64(statbuf, &stat);  }  /* diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c index e800503879e..f5000a460c0 100644 --- a/arch/sparc/kernel/sys_sparc32.c +++ b/arch/sparc/kernel/sys_sparc32.c @@ -206,21 +206,12 @@ asmlinkage long compat_sys_fstatat64(unsigned int dfd, char __user *filename,  		struct compat_stat64 __user * statbuf, int flag)  {  	struct kstat stat; -	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); - -	if (!error) -		error = cp_compat_stat64(&stat, statbuf); +	int error; -out: -	return error; +	error = vfs_fstatat(dfd, filename, &stat, flag); +	if (error) +		return error; +	return cp_compat_stat64(&stat, statbuf);  }  asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2) diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c index efac92fd1ef..085a8c35f14 100644 --- a/arch/x86/ia32/sys_ia32.c +++ b/arch/x86/ia32/sys_ia32.c @@ -129,21 +129,12 @@ asmlinkage long sys32_fstatat(unsigned int dfd, char __user *filename,  			      struct stat64 __user *statbuf, int flag)  {  	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_stat64(statbuf, &stat); - -out: -	return error; +	error = vfs_fstatat(dfd, filename, &stat, flag); +	if (error) +		return error; +	return cp_stat64(statbuf, &stat);  }  /* diff --git a/fs/compat.c b/fs/compat.c index 3f84d5f1588..dda72e26709 100644 --- a/fs/compat.c +++ b/fs/compat.c @@ -204,21 +204,12 @@ asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user *filename,  		struct compat_stat __user *statbuf, int flag)  {  	struct kstat stat; -	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); - -	if (!error) -		error = cp_compat_stat(&stat, statbuf); +	int error; -out: -	return error; +	error = vfs_fstatat(dfd, filename, &stat, flag); +	if (error) +		return error; +	return cp_compat_stat(&stat, statbuf);  }  #endif diff --git a/fs/stat.c b/fs/stat.c index 2db740a0cfb..54711662b85 100644 --- a/fs/stat.c +++ b/fs/stat.c @@ -109,6 +109,24 @@ int vfs_fstat(unsigned int fd, struct kstat *stat)  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  /* @@ -264,21 +282,12 @@ SYSCALL_DEFINE4(newfstatat, int, dfd, char __user *, filename,  		struct stat __user *, statbuf, int, flag)  {  	struct kstat stat; -	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); - -	if (!error) -		error = cp_new_stat(&stat, statbuf); +	int error; -out: -	return error; +	error = vfs_fstatat(dfd, filename, &stat, flag); +	if (error) +		return error; +	return cp_new_stat(&stat, statbuf);  }  #endif @@ -404,21 +413,12 @@ SYSCALL_DEFINE4(fstatat64, int, dfd, char __user *, filename,  		struct stat64 __user *, statbuf, int, flag)  {  	struct kstat stat; -	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); - -	if (!error) -		error = cp_new_stat64(&stat, statbuf); +	int error; -out: -	return error; +	error = vfs_fstatat(dfd, filename, &stat, flag); +	if (error) +		return error; +	return cp_new_stat64(&stat, statbuf);  }  #endif /* __ARCH_WANT_STAT64 */ diff --git a/include/linux/fs.h b/include/linux/fs.h index e766be0d432..257f4d37ad2 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -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_lstat_fd(int dfd, char __user *, 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,  		    unsigned long arg);  |