git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ecryptfs: Eliminate useless code
[safe/jmp/linux-2.6]
/
fs
/
namei.c
diff --git
a/fs/namei.c
b/fs/namei.c
index
b55440b
..
94a5e60
100644
(file)
--- a/
fs/namei.c
+++ b/
fs/namei.c
@@
-561,6
+561,7
@@
static __always_inline int __do_follow_link(struct path *path, struct nameidata
dget(dentry);
}
mntget(path->mnt);
dget(dentry);
}
mntget(path->mnt);
+ nd->last_type = LAST_BIND;
cookie = dentry->d_inode->i_op->follow_link(dentry, nd);
error = PTR_ERR(cookie);
if (!IS_ERR(cookie)) {
cookie = dentry->d_inode->i_op->follow_link(dentry, nd);
error = PTR_ERR(cookie);
if (!IS_ERR(cookie)) {
@@
-1603,11
+1604,12
@@
struct file *do_filp_open(int dfd, const char *pathname,
struct file *filp;
struct nameidata nd;
int error;
struct file *filp;
struct nameidata nd;
int error;
- struct path path
, save
;
+ struct path path;
struct dentry *dir;
int count = 0;
int will_truncate;
int flag = open_to_namei_flags(open_flag);
struct dentry *dir;
int count = 0;
int will_truncate;
int flag = open_to_namei_flags(open_flag);
+ int force_reval = 0;
/*
* O_SYNC is implemented as __O_SYNC|O_DSYNC. As many places only
/*
* O_SYNC is implemented as __O_SYNC|O_DSYNC. As many places only
@@
-1619,7
+1621,7
@@
struct file *do_filp_open(int dfd, const char *pathname,
open_flag |= O_DSYNC;
if (!acc_mode)
open_flag |= O_DSYNC;
if (!acc_mode)
- acc_mode = MAY_OPEN | ACC_MODE(flag);
+ acc_mode = MAY_OPEN | ACC_MODE(
open_
flag);
/* O_TRUNC implies we need access checks for write permissions */
if (flag & O_TRUNC)
/* O_TRUNC implies we need access checks for write permissions */
if (flag & O_TRUNC)
@@
-1659,9
+1661,12
@@
struct file *do_filp_open(int dfd, const char *pathname,
/*
* Create - we need to know the parent.
*/
/*
* Create - we need to know the parent.
*/
+reval:
error = path_init(dfd, pathname, LOOKUP_PARENT, &nd);
if (error)
return ERR_PTR(error);
error = path_init(dfd, pathname, LOOKUP_PARENT, &nd);
if (error)
return ERR_PTR(error);
+ if (force_reval)
+ nd.flags |= LOOKUP_REVAL;
error = path_walk(pathname, &nd);
if (error) {
if (nd.root.mnt)
error = path_walk(pathname, &nd);
if (error) {
if (nd.root.mnt)
@@
-1853,17
+1858,7
@@
do_link:
error = security_inode_follow_link(path.dentry, &nd);
if (error)
goto exit_dput;
error = security_inode_follow_link(path.dentry, &nd);
if (error)
goto exit_dput;
- save = nd.path;
- path_get(&save);
error = __do_follow_link(&path, &nd);
error = __do_follow_link(&path, &nd);
- if (error == -ESTALE) {
- /* nd.path had been dropped */
- nd.path = save;
- path_get(&nd.path);
- nd.flags |= LOOKUP_REVAL;
- error = __do_follow_link(&path, &nd);
- }
- path_put(&save);
path_put(&path);
if (error) {
/* Does someone understand code flow here? Or it is only
path_put(&path);
if (error) {
/* Does someone understand code flow here? Or it is only
@@
-1873,6
+1868,10
@@
do_link:
release_open_intent(&nd);
if (nd.root.mnt)
path_put(&nd.root);
release_open_intent(&nd);
if (nd.root.mnt)
path_put(&nd.root);
+ if (error == -ESTALE && !force_reval) {
+ force_reval = 1;
+ goto reval;
+ }
return ERR_PTR(error);
}
nd.flags &= ~LOOKUP_PARENT;
return ERR_PTR(error);
}
nd.flags &= ~LOOKUP_PARENT;