Lines Matching refs:cprm
56 static bool dump_vma_snapshot(struct coredump_params *cprm);
57 static void free_vma_snapshot(struct coredump_params *cprm);
201 static int format_corename(struct core_name *cn, struct coredump_params *cprm,
293 __get_dumpable(cprm->mm_flags));
298 cprm->siginfo->si_signo);
333 err = cn_printf(cn, "%d", cprm->cpu);
535 struct coredump_params cprm = {
553 if (!__get_dumpable(cprm.mm_flags))
565 if (__get_dumpable(cprm.mm_flags) == SUID_DUMP_ROOT) {
577 ispipe = format_corename(&cn, &cprm, &argv, &argc);
591 if (cprm.limit == 1) {
596 * cprm.limit of 1 here as a special value, this is a
613 cprm.limit = RLIM_INFINITY;
637 umh_pipe_setup, NULL, &cprm);
654 if (cprm.limit < binfmt->min_coredump)
701 cprm.file = file_open_root(&root, cn.corename,
705 cprm.file = filp_open(cn.corename, open_flags, 0600);
707 if (IS_ERR(cprm.file))
710 inode = file_inode(cprm.file);
713 if (d_unhashed(cprm.file->f_path.dentry))
727 idmap = file_mnt_idmap(cprm.file);
739 if (!(cprm.file->f_mode & FMODE_CAN_WRITE))
741 if (do_truncate(idmap, cprm.file->f_path.dentry,
742 0, 0, cprm.file))
756 if (!cprm.file) {
760 if (!dump_vma_snapshot(&cprm))
763 file_start_write(cprm.file);
764 core_dumped = binfmt->core_dump(&cprm);
771 if (cprm.to_skip) {
772 cprm.to_skip--;
773 dump_emit(&cprm, "", 1);
775 file_end_write(cprm.file);
776 free_vma_snapshot(&cprm);
779 wait_for_dump_helpers(cprm.file);
781 if (cprm.file)
782 filp_close(cprm.file, NULL);
802 static int __dump_emit(struct coredump_params *cprm, const void *addr, int nr)
804 struct file *file = cprm->file;
807 if (cprm->written + nr > cprm->limit)
817 cprm->written += n;
818 cprm->pos += n;
823 static int __dump_skip(struct coredump_params *cprm, size_t nr)
826 struct file *file = cprm->file;
831 cprm->pos += nr;
835 if (!__dump_emit(cprm, zeroes, PAGE_SIZE))
839 return __dump_emit(cprm, zeroes, nr);
843 int dump_emit(struct coredump_params *cprm, const void *addr, int nr)
845 if (cprm->to_skip) {
846 if (!__dump_skip(cprm, cprm->to_skip))
848 cprm->to_skip = 0;
850 return __dump_emit(cprm, addr, nr);
854 void dump_skip_to(struct coredump_params *cprm, unsigned long pos)
856 cprm->to_skip = pos - cprm->pos;
860 void dump_skip(struct coredump_params *cprm, size_t nr)
862 cprm->to_skip += nr;
867 static int dump_emit_page(struct coredump_params *cprm, struct page *page)
871 struct file *file = cprm->file;
875 if (cprm->to_skip) {
876 if (!__dump_skip(cprm, cprm->to_skip))
878 cprm->to_skip = 0;
880 if (cprm->written + PAGE_SIZE > cprm->limit)
888 n = __kernel_write_iter(cprm->file, &iter, &pos);
892 cprm->written += PAGE_SIZE;
893 cprm->pos += PAGE_SIZE;
898 int dump_user_range(struct coredump_params *cprm, unsigned long start,
915 int stop = !dump_emit_page(cprm, page);
920 dump_skip(cprm, PAGE_SIZE);
927 int dump_align(struct coredump_params *cprm, int align)
929 unsigned mod = (cprm->pos + cprm->to_skip) & (align - 1);
933 cprm->to_skip += align - mod;
1127 static void free_vma_snapshot(struct coredump_params *cprm)
1129 if (cprm->vma_meta) {
1131 for (i = 0; i < cprm->vma_count; i++) {
1132 struct file *file = cprm->vma_meta[i].file;
1136 kvfree(cprm->vma_meta);
1137 cprm->vma_meta = NULL;
1145 static bool dump_vma_snapshot(struct coredump_params *cprm)
1160 cprm->vma_data_size = 0;
1162 cprm->vma_count = mm->map_count + (gate_vma ? 1 : 0);
1164 cprm->vma_meta = kvmalloc_array(cprm->vma_count, sizeof(*cprm->vma_meta), GFP_KERNEL);
1165 if (!cprm->vma_meta) {
1171 struct core_vma_metadata *m = cprm->vma_meta + i;
1176 m->dump_size = vma_dump_size(vma, cprm->mm_flags);
1186 for (i = 0; i < cprm->vma_count; i++) {
1187 struct core_vma_metadata *m = cprm->vma_meta + i;
1200 cprm->vma_data_size += m->dump_size;