diff options
-rw-r--r-- | fs/ecryptfs/kthread.c | 13 | ||||
-rw-r--r-- | fs/proc/root.c | 7 | ||||
-rw-r--r-- | kernel/sched/core.c | 3 |
3 files changed, 20 insertions, 3 deletions
diff --git a/fs/ecryptfs/kthread.c b/fs/ecryptfs/kthread.c index 866bb18efefe..e818f5ac7a26 100644 --- a/fs/ecryptfs/kthread.c +++ b/fs/ecryptfs/kthread.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | #include <linux/wait.h> | 26 | #include <linux/wait.h> |
27 | #include <linux/mount.h> | 27 | #include <linux/mount.h> |
28 | #include <linux/file.h> | ||
28 | #include "ecryptfs_kernel.h" | 29 | #include "ecryptfs_kernel.h" |
29 | 30 | ||
30 | struct ecryptfs_open_req { | 31 | struct ecryptfs_open_req { |
@@ -147,7 +148,7 @@ int ecryptfs_privileged_open(struct file **lower_file, | |||
147 | flags |= IS_RDONLY(d_inode(lower_dentry)) ? O_RDONLY : O_RDWR; | 148 | flags |= IS_RDONLY(d_inode(lower_dentry)) ? O_RDONLY : O_RDWR; |
148 | (*lower_file) = dentry_open(&req.path, flags, cred); | 149 | (*lower_file) = dentry_open(&req.path, flags, cred); |
149 | if (!IS_ERR(*lower_file)) | 150 | if (!IS_ERR(*lower_file)) |
150 | goto out; | 151 | goto have_file; |
151 | if ((flags & O_ACCMODE) == O_RDONLY) { | 152 | if ((flags & O_ACCMODE) == O_RDONLY) { |
152 | rc = PTR_ERR((*lower_file)); | 153 | rc = PTR_ERR((*lower_file)); |
153 | goto out; | 154 | goto out; |
@@ -165,8 +166,16 @@ int ecryptfs_privileged_open(struct file **lower_file, | |||
165 | mutex_unlock(&ecryptfs_kthread_ctl.mux); | 166 | mutex_unlock(&ecryptfs_kthread_ctl.mux); |
166 | wake_up(&ecryptfs_kthread_ctl.wait); | 167 | wake_up(&ecryptfs_kthread_ctl.wait); |
167 | wait_for_completion(&req.done); | 168 | wait_for_completion(&req.done); |
168 | if (IS_ERR(*lower_file)) | 169 | if (IS_ERR(*lower_file)) { |
169 | rc = PTR_ERR(*lower_file); | 170 | rc = PTR_ERR(*lower_file); |
171 | goto out; | ||
172 | } | ||
173 | have_file: | ||
174 | if ((*lower_file)->f_op->mmap == NULL) { | ||
175 | fput(*lower_file); | ||
176 | *lower_file = NULL; | ||
177 | rc = -EMEDIUMTYPE; | ||
178 | } | ||
170 | out: | 179 | out: |
171 | return rc; | 180 | return rc; |
172 | } | 181 | } |
diff --git a/fs/proc/root.c b/fs/proc/root.c index 55bc7d6c8aac..06702783bf40 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c | |||
@@ -121,6 +121,13 @@ static struct dentry *proc_mount(struct file_system_type *fs_type, | |||
121 | if (IS_ERR(sb)) | 121 | if (IS_ERR(sb)) |
122 | return ERR_CAST(sb); | 122 | return ERR_CAST(sb); |
123 | 123 | ||
124 | /* | ||
125 | * procfs isn't actually a stacking filesystem; however, there is | ||
126 | * too much magic going on inside it to permit stacking things on | ||
127 | * top of it | ||
128 | */ | ||
129 | sb->s_stack_depth = FILESYSTEM_MAX_STACK_DEPTH; | ||
130 | |||
124 | if (!proc_parse_options(options, ns)) { | 131 | if (!proc_parse_options(options, ns)) { |
125 | deactivate_locked_super(sb); | 132 | deactivate_locked_super(sb); |
126 | return ERR_PTR(-EINVAL); | 133 | return ERR_PTR(-EINVAL); |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 385c947482e1..017d5394f5dc 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -3170,7 +3170,8 @@ static noinline void __schedule_bug(struct task_struct *prev) | |||
3170 | static inline void schedule_debug(struct task_struct *prev) | 3170 | static inline void schedule_debug(struct task_struct *prev) |
3171 | { | 3171 | { |
3172 | #ifdef CONFIG_SCHED_STACK_END_CHECK | 3172 | #ifdef CONFIG_SCHED_STACK_END_CHECK |
3173 | BUG_ON(task_stack_end_corrupted(prev)); | 3173 | if (task_stack_end_corrupted(prev)) |
3174 | panic("corrupted stack end detected inside scheduler\n"); | ||
3174 | #endif | 3175 | #endif |
3175 | 3176 | ||
3176 | if (unlikely(in_atomic_preempt_off())) { | 3177 | if (unlikely(in_atomic_preempt_off())) { |