Merge tag 'devicetree-fixes-for-5.12-1' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / fs / coredump.c
index a2f6ecc..1c0fdc1 100644 (file)
@@ -703,6 +703,7 @@ void do_coredump(const kernel_siginfo_t *siginfo)
                        goto close_fail;
                }
        } else {
+               struct user_namespace *mnt_userns;
                struct inode *inode;
                int open_flags = O_CREAT | O_RDWR | O_NOFOLLOW |
                                 O_LARGEFILE | O_EXCL;
@@ -780,13 +781,15 @@ void do_coredump(const kernel_siginfo_t *siginfo)
                 * a process dumps core while its cwd is e.g. on a vfat
                 * filesystem.
                 */
-               if (!uid_eq(inode->i_uid, current_fsuid()))
+               mnt_userns = file_mnt_user_ns(cprm.file);
+               if (!uid_eq(i_uid_into_mnt(mnt_userns, inode), current_fsuid()))
                        goto close_fail;
                if ((inode->i_mode & 0677) != 0600)
                        goto close_fail;
                if (!(cprm.file->f_mode & FMODE_CAN_WRITE))
                        goto close_fail;
-               if (do_truncate(cprm.file->f_path.dentry, 0, 0, cprm.file))
+               if (do_truncate(mnt_userns, cprm.file->f_path.dentry,
+                               0, 0, cprm.file))
                        goto close_fail;
        }
 
@@ -894,10 +897,10 @@ int dump_user_range(struct coredump_params *cprm, unsigned long start,
                 */
                page = get_dump_page(addr);
                if (page) {
-                       void *kaddr = kmap(page);
+                       void *kaddr = kmap_local_page(page);
 
                        stop = !dump_emit(cprm, kaddr, PAGE_SIZE);
-                       kunmap(page);
+                       kunmap_local(kaddr);
                        put_page(page);
                } else {
                        stop = !dump_skip(cprm, PAGE_SIZE);
@@ -931,7 +934,8 @@ void dump_truncate(struct coredump_params *cprm)
        if (file->f_op->llseek && file->f_op->llseek != no_llseek) {
                offset = file->f_op->llseek(file, 0, SEEK_CUR);
                if (i_size_read(file->f_mapping->host) < offset)
-                       do_truncate(file->f_path.dentry, offset, 0, file);
+                       do_truncate(file_mnt_user_ns(file), file->f_path.dentry,
+                                   offset, 0, file);
        }
 }
 EXPORT_SYMBOL(dump_truncate);