|
@@ -629,7 +629,7 @@ static struct dentry *kernfs_iop_lookup(struct inode *dir,
|
|
kn = kernfs_find_ns(parent, dentry->d_name.name, ns);
|
|
kn = kernfs_find_ns(parent, dentry->d_name.name, ns);
|
|
|
|
|
|
/* no such entry */
|
|
/* no such entry */
|
|
- if (!kn) {
|
|
|
|
|
|
+ if (!kn || !kernfs_active(kn)) {
|
|
ret = NULL;
|
|
ret = NULL;
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
}
|
|
}
|
|
@@ -1112,8 +1112,8 @@ static struct kernfs_node *kernfs_dir_pos(const void *ns,
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- /* Skip over entries in the wrong namespace */
|
|
|
|
- while (pos && pos->ns != ns) {
|
|
|
|
|
|
+ /* Skip over entries which are dying/dead or in the wrong namespace */
|
|
|
|
+ while (pos && (!kernfs_active(pos) || pos->ns != ns)) {
|
|
struct rb_node *node = rb_next(&pos->rb);
|
|
struct rb_node *node = rb_next(&pos->rb);
|
|
if (!node)
|
|
if (!node)
|
|
pos = NULL;
|
|
pos = NULL;
|
|
@@ -1127,14 +1127,15 @@ static struct kernfs_node *kernfs_dir_next_pos(const void *ns,
|
|
struct kernfs_node *parent, ino_t ino, struct kernfs_node *pos)
|
|
struct kernfs_node *parent, ino_t ino, struct kernfs_node *pos)
|
|
{
|
|
{
|
|
pos = kernfs_dir_pos(ns, parent, ino, pos);
|
|
pos = kernfs_dir_pos(ns, parent, ino, pos);
|
|
- if (pos)
|
|
|
|
|
|
+ if (pos) {
|
|
do {
|
|
do {
|
|
struct rb_node *node = rb_next(&pos->rb);
|
|
struct rb_node *node = rb_next(&pos->rb);
|
|
if (!node)
|
|
if (!node)
|
|
pos = NULL;
|
|
pos = NULL;
|
|
else
|
|
else
|
|
pos = rb_to_kn(node);
|
|
pos = rb_to_kn(node);
|
|
- } while (pos && pos->ns != ns);
|
|
|
|
|
|
+ } while (pos && (!kernfs_active(pos) || pos->ns != ns));
|
|
|
|
+ }
|
|
return pos;
|
|
return pos;
|
|
}
|
|
}
|
|
|
|
|