浏览代码

untangling do_lookup() - expand the area under ->i_mutex

keep holding ->i_mutex over revalidation parts

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Al Viro 13 年之前
父节点
当前提交
37c17e1f37
共有 1 个文件被更改,包括 4 次插入2 次删除
  1. 4 2
      fs/namei.c

+ 4 - 2
fs/namei.c

@@ -1173,6 +1173,7 @@ 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);
@@ -1193,11 +1194,11 @@ retry:
 			need_reval = 0;
 			status = 1;
 		}
-		mutex_unlock(&dir->i_mutex);
 		if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval)
 			status = d_revalidate(dentry, nd);
 		if (unlikely(status <= 0)) {
 			if (status < 0) {
+				mutex_unlock(&dir->i_mutex);
 				dput(dentry);
 				return status;
 			}
@@ -1205,9 +1206,10 @@ retry:
 				dput(dentry);
 				dentry = NULL;
 				need_reval = 1;
-				goto retry;
+				goto l;
 			}
 		}
+		mutex_unlock(&dir->i_mutex);
 		goto done;
 	}
 	if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval)