Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Un-inline the core-dump helper functions

Tony Luck reports that the addition of the access_ok() check in commit
0eead9ab41da ("Don't dump task struct in a.out core-dumps") broke the
ia64 compile due to missing the necessary header file includes.

Rather than add yet another include (<asm/unistd.h>) to make everything
happy, just uninline the silly core dump helper functions and move the
bodies to fs/exec.c where they make a lot more sense.

dump_seek() in particular was too big to be an inline function anyway,
and none of them are in any way performance-critical. And we really
don't need to mess up our include file headers more than they already
are.

Reported-and-tested-by: Tony Luck <tony.luck@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

+40 -32
+38
fs/exec.c
··· 2014 2014 fail: 2015 2015 return; 2016 2016 } 2017 + 2018 + /* 2019 + * Core dumping helper functions. These are the only things you should 2020 + * do on a core-file: use only these functions to write out all the 2021 + * necessary info. 2022 + */ 2023 + int dump_write(struct file *file, const void *addr, int nr) 2024 + { 2025 + return access_ok(VERIFY_READ, addr, nr) && file->f_op->write(file, addr, nr, &file->f_pos) == nr; 2026 + } 2027 + 2028 + int dump_seek(struct file *file, loff_t off) 2029 + { 2030 + int ret = 1; 2031 + 2032 + if (file->f_op->llseek && file->f_op->llseek != no_llseek) { 2033 + if (file->f_op->llseek(file, off, SEEK_CUR) < 0) 2034 + return 0; 2035 + } else { 2036 + char *buf = (char *)get_zeroed_page(GFP_KERNEL); 2037 + 2038 + if (!buf) 2039 + return 0; 2040 + while (off > 0) { 2041 + unsigned long n = off; 2042 + 2043 + if (n > PAGE_SIZE) 2044 + n = PAGE_SIZE; 2045 + if (!dump_write(file, buf, n)) { 2046 + ret = 0; 2047 + break; 2048 + } 2049 + off -= n; 2050 + } 2051 + free_page((unsigned long)buf); 2052 + } 2053 + return ret; 2054 + }
+2 -32
include/linux/coredump.h
··· 9 9 * These are the only things you should do on a core-file: use only these 10 10 * functions to write out all the necessary info. 11 11 */ 12 - static inline int dump_write(struct file *file, const void *addr, int nr) 13 - { 14 - return access_ok(VERIFY_READ, addr, nr) && file->f_op->write(file, addr, nr, &file->f_pos) == nr; 15 - } 16 - 17 - static inline int dump_seek(struct file *file, loff_t off) 18 - { 19 - int ret = 1; 20 - 21 - if (file->f_op->llseek && file->f_op->llseek != no_llseek) { 22 - if (file->f_op->llseek(file, off, SEEK_CUR) < 0) 23 - return 0; 24 - } else { 25 - char *buf = (char *)get_zeroed_page(GFP_KERNEL); 26 - 27 - if (!buf) 28 - return 0; 29 - while (off > 0) { 30 - unsigned long n = off; 31 - 32 - if (n > PAGE_SIZE) 33 - n = PAGE_SIZE; 34 - if (!dump_write(file, buf, n)) { 35 - ret = 0; 36 - break; 37 - } 38 - off -= n; 39 - } 40 - free_page((unsigned long)buf); 41 - } 42 - return ret; 43 - } 12 + extern int dump_write(struct file *file, const void *addr, int nr); 13 + extern int dump_seek(struct file *file, loff_t off); 44 14 45 15 #endif /* _LINUX_COREDUMP_H */