aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/namei.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 01e67dddcc3d..3b26a240ade9 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -519,7 +519,14 @@ static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, s
519 */ 519 */
520 result = d_lookup(parent, name); 520 result = d_lookup(parent, name);
521 if (!result) { 521 if (!result) {
522 struct dentry * dentry = d_alloc(parent, name); 522 struct dentry *dentry;
523
524 /* Don't create child dentry for a dead directory. */
525 result = ERR_PTR(-ENOENT);
526 if (IS_DEADDIR(dir))
527 goto out_unlock;
528
529 dentry = d_alloc(parent, name);
523 result = ERR_PTR(-ENOMEM); 530 result = ERR_PTR(-ENOMEM);
524 if (dentry) { 531 if (dentry) {
525 result = dir->i_op->lookup(dir, dentry, nd); 532 result = dir->i_op->lookup(dir, dentry, nd);
@@ -528,6 +535,7 @@ static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, s
528 else 535 else
529 result = dentry; 536 result = dentry;
530 } 537 }
538out_unlock:
531 mutex_unlock(&dir->i_mutex); 539 mutex_unlock(&dir->i_mutex);
532 return result; 540 return result;
533 } 541 }
@@ -1317,7 +1325,14 @@ static struct dentry *__lookup_hash(struct qstr *name,
1317 1325
1318 dentry = cached_lookup(base, name, nd); 1326 dentry = cached_lookup(base, name, nd);
1319 if (!dentry) { 1327 if (!dentry) {
1320 struct dentry *new = d_alloc(base, name); 1328 struct dentry *new;
1329
1330 /* Don't create child dentry for a dead directory. */
1331 dentry = ERR_PTR(-ENOENT);
1332 if (IS_DEADDIR(inode))
1333 goto out;
1334
1335 new = d_alloc(base, name);
1321 dentry = ERR_PTR(-ENOMEM); 1336 dentry = ERR_PTR(-ENOMEM);
1322 if (!new) 1337 if (!new)
1323 goto out; 1338 goto out;