summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2016-03-05 18:14:03 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2016-03-05 18:14:03 -0500
commit6583fe22d1bce3631bc660e5927449690fadafe6 (patch)
treebc22901a1411a5fa229e37a665ebc76f83a0e6e8
parent05ef1c50e7c2f796460737a7a7c2d315dd166544 (diff)
downloadlwn-6583fe22d1bce3631bc660e5927449690fadafe6.tar.gz
lwn-6583fe22d1bce3631bc660e5927449690fadafe6.zip
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>
-rw-r--r--fs/namei.c22
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)