stat.c (8d3c202be23c5a915f7053ebd4e96f44700c6a62) | stat.c (2d8f30380ab8c706f4e0a8f1aaa22b5886e9ac8a) |
---|---|
1/* 2 * linux/fs/stat.c 3 * 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 */ 6 7#include <linux/module.h> 8#include <linux/mm.h> --- 43 unchanged lines hidden (view full) --- 52 generic_fillattr(inode, stat); 53 return 0; 54} 55 56EXPORT_SYMBOL(vfs_getattr); 57 58int vfs_stat_fd(int dfd, char __user *name, struct kstat *stat) 59{ | 1/* 2 * linux/fs/stat.c 3 * 4 * Copyright (C) 1991, 1992 Linus Torvalds 5 */ 6 7#include <linux/module.h> 8#include <linux/mm.h> --- 43 unchanged lines hidden (view full) --- 52 generic_fillattr(inode, stat); 53 return 0; 54} 55 56EXPORT_SYMBOL(vfs_getattr); 57 58int vfs_stat_fd(int dfd, char __user *name, struct kstat *stat) 59{ |
60 struct nameidata nd; | 60 struct path path; |
61 int error; 62 | 61 int error; 62 |
63 error = __user_walk_fd(dfd, name, LOOKUP_FOLLOW, &nd); | 63 error = user_path_at(dfd, name, LOOKUP_FOLLOW, &path); |
64 if (!error) { | 64 if (!error) { |
65 error = vfs_getattr(nd.path.mnt, nd.path.dentry, stat); 66 path_put(&nd.path); | 65 error = vfs_getattr(path.mnt, path.dentry, stat); 66 path_put(&path); |
67 } 68 return error; 69} 70 71int vfs_stat(char __user *name, struct kstat *stat) 72{ 73 return vfs_stat_fd(AT_FDCWD, name, stat); 74} 75 76EXPORT_SYMBOL(vfs_stat); 77 78int vfs_lstat_fd(int dfd, char __user *name, struct kstat *stat) 79{ | 67 } 68 return error; 69} 70 71int vfs_stat(char __user *name, struct kstat *stat) 72{ 73 return vfs_stat_fd(AT_FDCWD, name, stat); 74} 75 76EXPORT_SYMBOL(vfs_stat); 77 78int vfs_lstat_fd(int dfd, char __user *name, struct kstat *stat) 79{ |
80 struct nameidata nd; | 80 struct path path; |
81 int error; 82 | 81 int error; 82 |
83 error = __user_walk_fd(dfd, name, 0, &nd); | 83 error = user_path_at(dfd, name, 0, &path); |
84 if (!error) { | 84 if (!error) { |
85 error = vfs_getattr(nd.path.mnt, nd.path.dentry, stat); 86 path_put(&nd.path); | 85 error = vfs_getattr(path.mnt, path.dentry, stat); 86 path_put(&path); |
87 } 88 return error; 89} 90 91int vfs_lstat(char __user *name, struct kstat *stat) 92{ 93 return vfs_lstat_fd(AT_FDCWD, name, stat); 94} --- 191 unchanged lines hidden (view full) --- 286 int error = vfs_fstat(fd, &stat); 287 288 if (!error) 289 error = cp_new_stat(&stat, statbuf); 290 291 return error; 292} 293 | 87 } 88 return error; 89} 90 91int vfs_lstat(char __user *name, struct kstat *stat) 92{ 93 return vfs_lstat_fd(AT_FDCWD, name, stat); 94} --- 191 unchanged lines hidden (view full) --- 286 int error = vfs_fstat(fd, &stat); 287 288 if (!error) 289 error = cp_new_stat(&stat, statbuf); 290 291 return error; 292} 293 |
294asmlinkage long sys_readlinkat(int dfd, const char __user *path, | 294asmlinkage long sys_readlinkat(int dfd, const char __user *pathname, |
295 char __user *buf, int bufsiz) 296{ | 295 char __user *buf, int bufsiz) 296{ |
297 struct nameidata nd; | 297 struct path path; |
298 int error; 299 300 if (bufsiz <= 0) 301 return -EINVAL; 302 | 298 int error; 299 300 if (bufsiz <= 0) 301 return -EINVAL; 302 |
303 error = __user_walk_fd(dfd, path, 0, &nd); | 303 error = user_path_at(dfd, pathname, 0, &path); |
304 if (!error) { | 304 if (!error) { |
305 struct inode *inode = nd.path.dentry->d_inode; | 305 struct inode *inode = path.dentry->d_inode; |
306 307 error = -EINVAL; 308 if (inode->i_op && inode->i_op->readlink) { | 306 307 error = -EINVAL; 308 if (inode->i_op && inode->i_op->readlink) { |
309 error = security_inode_readlink(nd.path.dentry); | 309 error = security_inode_readlink(path.dentry); |
310 if (!error) { | 310 if (!error) { |
311 touch_atime(nd.path.mnt, nd.path.dentry); 312 error = inode->i_op->readlink(nd.path.dentry, | 311 touch_atime(path.mnt, path.dentry); 312 error = inode->i_op->readlink(path.dentry, |
313 buf, bufsiz); 314 } 315 } | 313 buf, bufsiz); 314 } 315 } |
316 path_put(&nd.path); | 316 path_put(&path); |
317 } 318 return error; 319} 320 321asmlinkage long sys_readlink(const char __user *path, char __user *buf, 322 int bufsiz) 323{ 324 return sys_readlinkat(AT_FDCWD, path, buf, bufsiz); --- 147 unchanged lines hidden --- | 317 } 318 return error; 319} 320 321asmlinkage long sys_readlink(const char __user *path, char __user *buf, 322 int bufsiz) 323{ 324 return sys_readlinkat(AT_FDCWD, path, buf, bufsiz); --- 147 unchanged lines hidden --- |