Merge tag 'locking-core-2023-05-05' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-block.git] / fs / coredump.c
index a25ecec9ca7c453fa9f744f92b4bf2ac632dd22e..ece7badf701bc2f917796aa565b478b21c5ce104 100644 (file)
@@ -644,7 +644,7 @@ void do_coredump(const kernel_siginfo_t *siginfo)
                        goto close_fail;
                }
        } else {
-               struct user_namespace *mnt_userns;
+               struct mnt_idmap *idmap;
                struct inode *inode;
                int open_flags = O_CREAT | O_RDWR | O_NOFOLLOW |
                                 O_LARGEFILE | O_EXCL;
@@ -722,8 +722,8 @@ void do_coredump(const kernel_siginfo_t *siginfo)
                 * a process dumps core while its cwd is e.g. on a vfat
                 * filesystem.
                 */
-               mnt_userns = file_mnt_user_ns(cprm.file);
-               if (!vfsuid_eq_kuid(i_uid_into_vfsuid(mnt_userns, inode),
+               idmap = file_mnt_idmap(cprm.file);
+               if (!vfsuid_eq_kuid(i_uid_into_vfsuid(idmap, inode),
                                    current_fsuid())) {
                        pr_info_ratelimited("Core dump to %s aborted: cannot preserve file owner\n",
                                            cn.corename);
@@ -736,7 +736,7 @@ void do_coredump(const kernel_siginfo_t *siginfo)
                }
                if (!(cprm.file->f_mode & FMODE_CAN_WRITE))
                        goto close_fail;
-               if (do_truncate(mnt_userns, cprm.file->f_path.dentry,
+               if (do_truncate(idmap, cprm.file->f_path.dentry,
                                0, 0, cprm.file))
                        goto close_fail;
        }
@@ -864,11 +864,7 @@ EXPORT_SYMBOL(dump_skip);
 #ifdef CONFIG_ELF_CORE
 static int dump_emit_page(struct coredump_params *cprm, struct page *page)
 {
-       struct bio_vec bvec = {
-               .bv_page        = page,
-               .bv_offset      = 0,
-               .bv_len         = PAGE_SIZE,
-       };
+       struct bio_vec bvec;
        struct iov_iter iter;
        struct file *file = cprm->file;
        loff_t pos;
@@ -884,7 +880,9 @@ static int dump_emit_page(struct coredump_params *cprm, struct page *page)
        if (dump_interrupted())
                return 0;
        pos = file->f_pos;
+       bvec_set_page(&bvec, page, PAGE_SIZE, 0);
        iov_iter_bvec(&iter, ITER_SOURCE, &bvec, 1, PAGE_SIZE);
+       iov_iter_set_copy_mc(&iter);
        n = __kernel_write_iter(cprm->file, &iter, &pos);
        if (n != PAGE_SIZE)
                return 0;
@@ -1111,14 +1109,14 @@ whole:
  * Helper function for iterating across a vma list.  It ensures that the caller
  * will visit `gate_vma' prior to terminating the search.
  */
-static struct vm_area_struct *coredump_next_vma(struct ma_state *mas,
+static struct vm_area_struct *coredump_next_vma(struct vma_iterator *vmi,
                                       struct vm_area_struct *vma,
                                       struct vm_area_struct *gate_vma)
 {
        if (gate_vma && (vma == gate_vma))
                return NULL;
 
-       vma = mas_next(mas, ULONG_MAX);
+       vma = vma_next(vmi);
        if (vma)
                return vma;
        return gate_vma;
@@ -1146,7 +1144,7 @@ static bool dump_vma_snapshot(struct coredump_params *cprm)
 {
        struct vm_area_struct *gate_vma, *vma = NULL;
        struct mm_struct *mm = current->mm;
-       MA_STATE(mas, &mm->mm_mt, 0, 0);
+       VMA_ITERATOR(vmi, mm, 0);
        int i = 0;
 
        /*
@@ -1167,7 +1165,7 @@ static bool dump_vma_snapshot(struct coredump_params *cprm)
                return false;
        }
 
-       while ((vma = coredump_next_vma(&mas, vma, gate_vma)) != NULL) {
+       while ((vma = coredump_next_vma(&vmi, vma, gate_vma)) != NULL) {
                struct core_vma_metadata *m = cprm->vma_meta + i;
 
                m->start = vma->vm_start;