提交 7c1c01ec 编写于 作者: A Al Viro

lift fput() on late failures into path_openat()

Acked-by: NLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 4d27f326
...@@ -3407,8 +3407,6 @@ static int do_last(struct nameidata *nd, ...@@ -3407,8 +3407,6 @@ static int do_last(struct nameidata *nd,
if (!error && will_truncate) if (!error && will_truncate)
error = handle_truncate(file); error = handle_truncate(file);
out: out:
if (unlikely(error) && (*opened & FILE_OPENED))
fput(file);
if (unlikely(error > 0)) { if (unlikely(error > 0)) {
WARN_ON(1); WARN_ON(1);
error = -EINVAL; error = -EINVAL;
...@@ -3484,8 +3482,6 @@ static int do_tmpfile(struct nameidata *nd, unsigned flags, ...@@ -3484,8 +3482,6 @@ static int do_tmpfile(struct nameidata *nd, unsigned flags,
if (error) if (error)
goto out2; goto out2;
error = open_check_o_direct(file); error = open_check_o_direct(file);
if (error)
fput(file);
out2: out2:
mnt_drop_write(path.mnt); mnt_drop_write(path.mnt);
out: out:
...@@ -3545,20 +3541,20 @@ static struct file *path_openat(struct nameidata *nd, ...@@ -3545,20 +3541,20 @@ static struct file *path_openat(struct nameidata *nd,
} }
terminate_walk(nd); terminate_walk(nd);
out2: out2:
if (!(opened & FILE_OPENED)) { if (likely(!error)) {
BUG_ON(!error); if (likely(opened & FILE_OPENED))
fput(file); return file;
WARN_ON(1);
error = -EINVAL;
} }
if (unlikely(error)) { fput(file);
if (error == -EOPENSTALE) { if (error == -EOPENSTALE) {
if (flags & LOOKUP_RCU) if (flags & LOOKUP_RCU)
error = -ECHILD; error = -ECHILD;
else else
error = -ESTALE; error = -ESTALE;
} }
file = ERR_PTR(error); return ERR_PTR(error);
}
return file;
} }
struct file *do_filp_open(int dfd, struct filename *pathname, struct file *do_filp_open(int dfd, struct filename *pathname,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册