diff options
author | J. R. Okajima <hooanon05@yahoo.co.jp> | 2011-01-13 22:56:04 -0500 |
---|---|---|
committer | Nick Piggin <npiggin@kernel.dk> | 2011-01-13 22:56:04 -0500 |
commit | f20877d94a74557b7c28b4ed8920d834c31e0ea5 (patch) | |
tree | 88ea4019a1a8a0a3b8c2f24479ec44b353928f3f /fs/namei.c | |
parent | 657e94b673a805b427903c5628e95348235fad06 (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.c | 10 |
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: |