diff options
-rw-r--r-- | fs/dcache.c | 7 | ||||
-rw-r--r-- | fs/namespace.c | 2 | ||||
-rw-r--r-- | kernel/fork.c | 2 |
3 files changed, 8 insertions, 3 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index 6055d61811d3..cb4a10690868 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -3061,8 +3061,13 @@ char *d_path(const struct path *path, char *buf, int buflen) | |||
3061 | * thus don't need to be hashed. They also don't need a name until a | 3061 | * thus don't need to be hashed. They also don't need a name until a |
3062 | * user wants to identify the object in /proc/pid/fd/. The little hack | 3062 | * user wants to identify the object in /proc/pid/fd/. The little hack |
3063 | * below allows us to generate a name for these objects on demand: | 3063 | * below allows us to generate a name for these objects on demand: |
3064 | * | ||
3065 | * Some pseudo inodes are mountable. When they are mounted | ||
3066 | * path->dentry == path->mnt->mnt_root. In that case don't call d_dname | ||
3067 | * and instead have d_path return the mounted path. | ||
3064 | */ | 3068 | */ |
3065 | if (path->dentry->d_op && path->dentry->d_op->d_dname) | 3069 | if (path->dentry->d_op && path->dentry->d_op->d_dname && |
3070 | (!IS_ROOT(path->dentry) || path->dentry != path->mnt->mnt_root)) | ||
3066 | return path->dentry->d_op->d_dname(path->dentry, buf, buflen); | 3071 | return path->dentry->d_op->d_dname(path->dentry, buf, buflen); |
3067 | 3072 | ||
3068 | rcu_read_lock(); | 3073 | rcu_read_lock(); |
diff --git a/fs/namespace.c b/fs/namespace.c index ac2ce8a766e1..be32ebccdeb1 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
@@ -2886,7 +2886,7 @@ bool fs_fully_visible(struct file_system_type *type) | |||
2886 | struct inode *inode = child->mnt_mountpoint->d_inode; | 2886 | struct inode *inode = child->mnt_mountpoint->d_inode; |
2887 | if (!S_ISDIR(inode->i_mode)) | 2887 | if (!S_ISDIR(inode->i_mode)) |
2888 | goto next; | 2888 | goto next; |
2889 | if (inode->i_nlink != 2) | 2889 | if (inode->i_nlink > 2) |
2890 | goto next; | 2890 | goto next; |
2891 | } | 2891 | } |
2892 | visible = true; | 2892 | visible = true; |
diff --git a/kernel/fork.c b/kernel/fork.c index 5721f0e3f2da..dfa736c98d17 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -1172,7 +1172,7 @@ static struct task_struct *copy_process(unsigned long clone_flags, | |||
1172 | * do not allow it to share a thread group or signal handlers or | 1172 | * do not allow it to share a thread group or signal handlers or |
1173 | * parent with the forking task. | 1173 | * parent with the forking task. |
1174 | */ | 1174 | */ |
1175 | if (clone_flags & (CLONE_SIGHAND | CLONE_PARENT)) { | 1175 | if (clone_flags & CLONE_SIGHAND) { |
1176 | if ((clone_flags & (CLONE_NEWUSER | CLONE_NEWPID)) || | 1176 | if ((clone_flags & (CLONE_NEWUSER | CLONE_NEWPID)) || |
1177 | (task_active_pid_ns(current) != | 1177 | (task_active_pid_ns(current) != |
1178 | current->nsproxy->pid_ns_for_children)) | 1178 | current->nsproxy->pid_ns_for_children)) |