Kaynağa Gözat

untangling do_lookup() - eliminate a loop.

d_lookup() *will* fail after successful d_invalidate(), if we are
holding i_mutex all along.  IOW, we don't need to jump back to
l: - we know what path will be taken there and can do that (i.e.
d_alloc_and_lookup()) directly.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Al Viro 13 yıl önce
ebeveyn
işleme
acc9cb3cd4
1 değiştirilmiş dosya ile 8 ekleme ve 4 silme
  1. 8 4
      fs/namei.c

+ 8 - 4
fs/namei.c

@@ -1173,7 +1173,6 @@ retry:
 		BUG_ON(nd->inode != dir);
 
 		mutex_lock(&dir->i_mutex);
-l:
 		dentry = d_lookup(parent, name);
 		if (likely(!dentry)) {
 			dentry = d_alloc_and_lookup(parent, name, nd);
@@ -1204,9 +1203,14 @@ l:
 			}
 			if (!d_invalidate(dentry)) {
 				dput(dentry);
-				dentry = NULL;
-				need_reval = 1;
-				goto l;
+				dentry = d_alloc_and_lookup(parent, name, nd);
+				if (IS_ERR(dentry)) {
+					mutex_unlock(&dir->i_mutex);
+					return PTR_ERR(dentry);
+				}
+				/* known good */
+				need_reval = 0;
+				status = 1;
 			}
 		}
 		mutex_unlock(&dir->i_mutex);