aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2011-02-15 01:26:22 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2011-02-15 02:26:54 -0500
commit24643087e748bf192f1182766716e522dc1c972f (patch)
treef67283376c36f6745f1f26c9f67b953ff0b4de55 /fs
parent844a391799c25d9ba85cbce33e4697db06083ec6 (diff)
in do_lookup() split RCU and non-RCU cases of need_revalidate
and use unlikely() instead of gotos, for fsck sake... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r--fs/namei.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 9ce6d272f4f2..7609bacc7046 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1259,9 +1259,15 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,
1259 return -ECHILD; 1259 return -ECHILD;
1260 1260
1261 nd->seq = seq; 1261 nd->seq = seq;
1262 if (dentry->d_flags & DCACHE_OP_REVALIDATE) 1262 if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE)) {
1263 goto need_revalidate; 1263 dentry = do_revalidate(dentry, nd);
1264done2: 1264 if (!dentry)
1265 goto need_lookup;
1266 if (IS_ERR(dentry))
1267 goto fail;
1268 if (!(nd->flags & LOOKUP_RCU))
1269 goto done;
1270 }
1265 path->mnt = mnt; 1271 path->mnt = mnt;
1266 path->dentry = dentry; 1272 path->dentry = dentry;
1267 if (likely(__follow_mount_rcu(nd, path, inode, false))) 1273 if (likely(__follow_mount_rcu(nd, path, inode, false)))
@@ -1274,8 +1280,13 @@ done2:
1274 if (!dentry) 1280 if (!dentry)
1275 goto need_lookup; 1281 goto need_lookup;
1276found: 1282found:
1277 if (dentry->d_flags & DCACHE_OP_REVALIDATE) 1283 if (unlikely(dentry->d_flags & DCACHE_OP_REVALIDATE)) {
1278 goto need_revalidate; 1284 dentry = do_revalidate(dentry, nd);
1285 if (!dentry)
1286 goto need_lookup;
1287 if (IS_ERR(dentry))
1288 goto fail;
1289 }
1279done: 1290done:
1280 path->mnt = mnt; 1291 path->mnt = mnt;
1281 path->dentry = dentry; 1292 path->dentry = dentry;
@@ -1317,16 +1328,6 @@ need_lookup:
1317 mutex_unlock(&dir->i_mutex); 1328 mutex_unlock(&dir->i_mutex);
1318 goto found; 1329 goto found;
1319 1330
1320need_revalidate:
1321 dentry = do_revalidate(dentry, nd);
1322 if (!dentry)
1323 goto need_lookup;
1324 if (IS_ERR(dentry))
1325 goto fail;
1326 if (nd->flags & LOOKUP_RCU)
1327 goto done2;
1328 goto done;
1329
1330fail: 1331fail:
1331 return PTR_ERR(dentry); 1332 return PTR_ERR(dentry);
1332} 1333}