aboutsummaryrefslogtreecommitdiffstats
path: root/fs/kernfs/dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/kernfs/dir.c')
-rw-r--r--fs/kernfs/dir.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c
index f58d2f16eaf7..89f8462f337e 100644
--- a/fs/kernfs/dir.c
+++ b/fs/kernfs/dir.c
@@ -629,7 +629,7 @@ static struct dentry *kernfs_iop_lookup(struct inode *dir,
629 kn = kernfs_find_ns(parent, dentry->d_name.name, ns); 629 kn = kernfs_find_ns(parent, dentry->d_name.name, ns);
630 630
631 /* no such entry */ 631 /* no such entry */
632 if (!kn) { 632 if (!kn || !kernfs_active(kn)) {
633 ret = NULL; 633 ret = NULL;
634 goto out_unlock; 634 goto out_unlock;
635 } 635 }
@@ -1112,8 +1112,8 @@ static struct kernfs_node *kernfs_dir_pos(const void *ns,
1112 break; 1112 break;
1113 } 1113 }
1114 } 1114 }
1115 /* Skip over entries in the wrong namespace */ 1115 /* Skip over entries which are dying/dead or in the wrong namespace */
1116 while (pos && pos->ns != ns) { 1116 while (pos && (!kernfs_active(pos) || pos->ns != ns)) {
1117 struct rb_node *node = rb_next(&pos->rb); 1117 struct rb_node *node = rb_next(&pos->rb);
1118 if (!node) 1118 if (!node)
1119 pos = NULL; 1119 pos = NULL;
@@ -1127,14 +1127,15 @@ static struct kernfs_node *kernfs_dir_next_pos(const void *ns,
1127 struct kernfs_node *parent, ino_t ino, struct kernfs_node *pos) 1127 struct kernfs_node *parent, ino_t ino, struct kernfs_node *pos)
1128{ 1128{
1129 pos = kernfs_dir_pos(ns, parent, ino, pos); 1129 pos = kernfs_dir_pos(ns, parent, ino, pos);
1130 if (pos) 1130 if (pos) {
1131 do { 1131 do {
1132 struct rb_node *node = rb_next(&pos->rb); 1132 struct rb_node *node = rb_next(&pos->rb);
1133 if (!node) 1133 if (!node)
1134 pos = NULL; 1134 pos = NULL;
1135 else 1135 else
1136 pos = rb_to_kn(node); 1136 pos = rb_to_kn(node);
1137 } while (pos && pos->ns != ns); 1137 } while (pos && (!kernfs_active(pos) || pos->ns != ns));
1138 }
1138 return pos; 1139 return pos;
1139} 1140}
1140 1141