aboutsummaryrefslogtreecommitdiffstats
path: root/fs/namei.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-03-30 14:08:28 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2012-03-31 16:03:16 -0400
commit37c17e1f377696c797e75c1e915e838b3e0c6120 (patch)
tree97af490a11ae06776978b4ed171ba7ceff36128f /fs/namei.c
parent3f6c7c71a2af6eb306e16562c6ee1bfdb48015fb (diff)
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>
Diffstat (limited to 'fs/namei.c')
-rw-r--r--fs/namei.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 157f3debbf98..48fc0fb8c9d1 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1173,6 +1173,7 @@ retry:
1173 BUG_ON(nd->inode != dir); 1173 BUG_ON(nd->inode != dir);
1174 1174
1175 mutex_lock(&dir->i_mutex); 1175 mutex_lock(&dir->i_mutex);
1176l:
1176 dentry = d_lookup(parent, name); 1177 dentry = d_lookup(parent, name);
1177 if (likely(!dentry)) { 1178 if (likely(!dentry)) {
1178 dentry = d_alloc_and_lookup(parent, name, nd); 1179 dentry = d_alloc_and_lookup(parent, name, nd);
@@ -1193,11 +1194,11 @@ retry:
1193 need_reval = 0; 1194 need_reval = 0;
1194 status = 1; 1195 status = 1;
1195 } 1196 }
1196 mutex_unlock(&dir->i_mutex);
1197 if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval) 1197 if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval)
1198 status = d_revalidate(dentry, nd); 1198 status = d_revalidate(dentry, nd);
1199 if (unlikely(status <= 0)) { 1199 if (unlikely(status <= 0)) {
1200 if (status < 0) { 1200 if (status < 0) {
1201 mutex_unlock(&dir->i_mutex);
1201 dput(dentry); 1202 dput(dentry);
1202 return status; 1203 return status;
1203 } 1204 }
@@ -1205,9 +1206,10 @@ retry:
1205 dput(dentry); 1206 dput(dentry);
1206 dentry = NULL; 1207 dentry = NULL;
1207 need_reval = 1; 1208 need_reval = 1;
1208 goto retry; 1209 goto l;
1209 } 1210 }
1210 } 1211 }
1212 mutex_unlock(&dir->i_mutex);
1211 goto done; 1213 goto done;
1212 } 1214 }
1213 if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval) 1215 if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE) && need_reval)