Commit 6583fe22 authored by Al Viro's avatar Al Viro

do_last(): reorder and simplify a bit

bugger off on negatives a bit earlier, simplify the tests
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 05ef1c50
...@@ -3118,6 +3118,7 @@ static int do_last(struct nameidata *nd, ...@@ -3118,6 +3118,7 @@ static int do_last(struct nameidata *nd,
return error; return error;
BUG_ON(nd->inode != dir->d_inode); BUG_ON(nd->inode != dir->d_inode);
BUG_ON(nd->flags & LOOKUP_RCU);
} else { } else {
/* create side of things */ /* create side of things */
/* /*
...@@ -3171,12 +3172,6 @@ static int do_last(struct nameidata *nd, ...@@ -3171,12 +3172,6 @@ static int do_last(struct nameidata *nd,
goto finish_open_created; goto finish_open_created;
} }
/*
* create/update audit record if it already exists.
*/
if (d_is_positive(path.dentry))
audit_inode(nd->name, path.dentry, 0);
/* /*
* If atomic_open() acquired write access it is dropped now due to * If atomic_open() acquired write access it is dropped now due to
* possible mount and symlink following (this might be optimized away if * possible mount and symlink following (this might be optimized away if
...@@ -3187,6 +3182,16 @@ static int do_last(struct nameidata *nd, ...@@ -3187,6 +3182,16 @@ static int do_last(struct nameidata *nd,
got_write = false; got_write = false;
} }
if (unlikely(d_is_negative(path.dentry))) {
path_to_nameidata(&path, nd);
return -ENOENT;
}
/*
* create/update audit record if it already exists.
*/
audit_inode(nd->name, path.dentry, 0);
if (unlikely((open_flag & (O_EXCL | O_CREAT)) == (O_EXCL | O_CREAT))) { if (unlikely((open_flag & (O_EXCL | O_CREAT)) == (O_EXCL | O_CREAT))) {
path_to_nameidata(&path, nd); path_to_nameidata(&path, nd);
return -EEXIST; return -EEXIST;
...@@ -3196,12 +3201,7 @@ static int do_last(struct nameidata *nd, ...@@ -3196,12 +3201,7 @@ static int do_last(struct nameidata *nd,
if (unlikely(error < 0)) if (unlikely(error < 0))
return error; return error;
BUG_ON(nd->flags & LOOKUP_RCU);
seq = 0; /* out of RCU mode, so the value doesn't matter */ seq = 0; /* out of RCU mode, so the value doesn't matter */
if (unlikely(d_is_negative(path.dentry))) {
path_to_nameidata(&path, nd);
return -ENOENT;
}
inode = d_backing_inode(path.dentry); inode = d_backing_inode(path.dentry);
finish_lookup: finish_lookup:
if (nd->depth) if (nd->depth)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment