diff options
-rw-r--r-- | fs/namei.c | 19 |
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 | } |
538 | out_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; |