Un-inline the core-dump helper functions
Tony Luck reports that the addition of the access_ok() check in commit
0eead9ab41
("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>
This commit is contained in:
Родитель
ae42d8d441
Коммит
3aa0ce825a
38
fs/exec.c
38
fs/exec.c
|
@ -2014,3 +2014,41 @@ fail_creds:
|
||||||
fail:
|
fail:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Core dumping helper functions. These are the only things you should
|
||||||
|
* do on a core-file: use only these functions to write out all the
|
||||||
|
* necessary info.
|
||||||
|
*/
|
||||||
|
int dump_write(struct file *file, const void *addr, int nr)
|
||||||
|
{
|
||||||
|
return access_ok(VERIFY_READ, addr, nr) && file->f_op->write(file, addr, nr, &file->f_pos) == nr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int dump_seek(struct file *file, loff_t off)
|
||||||
|
{
|
||||||
|
int ret = 1;
|
||||||
|
|
||||||
|
if (file->f_op->llseek && file->f_op->llseek != no_llseek) {
|
||||||
|
if (file->f_op->llseek(file, off, SEEK_CUR) < 0)
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
char *buf = (char *)get_zeroed_page(GFP_KERNEL);
|
||||||
|
|
||||||
|
if (!buf)
|
||||||
|
return 0;
|
||||||
|
while (off > 0) {
|
||||||
|
unsigned long n = off;
|
||||||
|
|
||||||
|
if (n > PAGE_SIZE)
|
||||||
|
n = PAGE_SIZE;
|
||||||
|
if (!dump_write(file, buf, n)) {
|
||||||
|
ret = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
off -= n;
|
||||||
|
}
|
||||||
|
free_page((unsigned long)buf);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
|
@ -9,37 +9,7 @@
|
||||||
* These are the only things you should do on a core-file: use only these
|
* These are the only things you should do on a core-file: use only these
|
||||||
* functions to write out all the necessary info.
|
* functions to write out all the necessary info.
|
||||||
*/
|
*/
|
||||||
static inline int dump_write(struct file *file, const void *addr, int nr)
|
extern int dump_write(struct file *file, const void *addr, int nr);
|
||||||
{
|
extern int dump_seek(struct file *file, loff_t off);
|
||||||
return access_ok(VERIFY_READ, addr, nr) && file->f_op->write(file, addr, nr, &file->f_pos) == nr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int dump_seek(struct file *file, loff_t off)
|
|
||||||
{
|
|
||||||
int ret = 1;
|
|
||||||
|
|
||||||
if (file->f_op->llseek && file->f_op->llseek != no_llseek) {
|
|
||||||
if (file->f_op->llseek(file, off, SEEK_CUR) < 0)
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
char *buf = (char *)get_zeroed_page(GFP_KERNEL);
|
|
||||||
|
|
||||||
if (!buf)
|
|
||||||
return 0;
|
|
||||||
while (off > 0) {
|
|
||||||
unsigned long n = off;
|
|
||||||
|
|
||||||
if (n > PAGE_SIZE)
|
|
||||||
n = PAGE_SIZE;
|
|
||||||
if (!dump_write(file, buf, n)) {
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
off -= n;
|
|
||||||
}
|
|
||||||
free_page((unsigned long)buf);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _LINUX_COREDUMP_H */
|
#endif /* _LINUX_COREDUMP_H */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче