aboutsummaryrefslogtreecommitdiffstats
path: root/fs/namei.c
diff options
context:
space:
mode:
authorJ. R. Okajima <hooanon05@yahoo.co.jp>2011-01-13 22:56:04 -0500
committerNick Piggin <npiggin@kernel.dk>2011-01-13 22:56:04 -0500
commitf20877d94a74557b7c28b4ed8920d834c31e0ea5 (patch)
tree88ea4019a1a8a0a3b8c2f24479ec44b353928f3f /fs/namei.c
parent657e94b673a805b427903c5628e95348235fad06 (diff)
fs: fix do_last error case when need_reval_dot
When open(2) without O_DIRECTORY opens an existing dir, it should return EISDIR. In do_last(), the variable 'error' is initialized EISDIR, but it is changed by d_revalidate() which returns any positive to represent 'the target dir is valid.' Should we keep and return the initialized 'error' in this case. Signed-off-by: Nick Piggin <npiggin@kernel.dk>
Diffstat (limited to 'fs/namei.c')
-rw-r--r--fs/namei.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 14c73edca9ce..bc24894c5f14 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2122,11 +2122,13 @@ static struct file *do_last(struct nameidata *nd, struct path *path,
2122 dir = nd->path.dentry; 2122 dir = nd->path.dentry;
2123 case LAST_DOT: 2123 case LAST_DOT:
2124 if (need_reval_dot(dir)) { 2124 if (need_reval_dot(dir)) {
2125 error = d_revalidate(nd->path.dentry, nd); 2125 int status = d_revalidate(nd->path.dentry, nd);
2126 if (!error) 2126 if (!status)
2127 error = -ESTALE; 2127 status = -ESTALE;
2128 if (error < 0) 2128 if (status < 0) {
2129 error = status;
2129 goto exit; 2130 goto exit;
2131 }
2130 } 2132 }
2131 /* fallthrough */ 2133 /* fallthrough */
2132 case LAST_ROOT: 2134 case LAST_ROOT: