diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2016-03-05 18:14:03 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-03-05 18:14:03 -0500 |
commit | 6583fe22d1bce3631bc660e5927449690fadafe6 (patch) | |
tree | bc22901a1411a5fa229e37a665ebc76f83a0e6e8 /fs/namei.c | |
parent | 05ef1c50e7c2f796460737a7a7c2d315dd166544 (diff) |
do_last(): reorder and simplify a bit
bugger off on negatives a bit earlier, simplify the tests
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/fs/namei.c b/fs/namei.c index 9c590e0f66e9..5bd9e0786855 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -3118,6 +3118,7 @@ static int do_last(struct nameidata *nd, return error; BUG_ON(nd->inode != dir->d_inode); + BUG_ON(nd->flags & LOOKUP_RCU); } else { /* create side of things */ /* @@ -3172,12 +3173,6 @@ retry_lookup: } /* - * 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 * possible mount and symlink following (this might be optimized away if * necessary...) @@ -3187,6 +3182,16 @@ retry_lookup: 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))) { path_to_nameidata(&path, nd); return -EEXIST; @@ -3196,12 +3201,7 @@ retry_lookup: if (unlikely(error < 0)) return error; - BUG_ON(nd->flags & LOOKUP_RCU); 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); finish_lookup: if (nd->depth) |