diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-10-08 09:26:08 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-11-09 00:16:26 -0500 |
commit | 9b56d54380adb5fef71f687109bbd6f8413d694f (patch) | |
tree | 006cd31736372a9f7c9d4e6d7b99a8dd1748d49a /fs/coredump.c | |
parent | 2507a4fbd48a96bc4236e584252635f8539079df (diff) | |
download | lwn-9b56d54380adb5fef71f687109bbd6f8413d694f.tar.gz lwn-9b56d54380adb5fef71f687109bbd6f8413d694f.zip |
dump_skip(): dump_seek() replacement taking coredump_params
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/coredump.c')
-rw-r--r-- | fs/coredump.c | 43 |
1 files changed, 14 insertions, 29 deletions
diff --git a/fs/coredump.c b/fs/coredump.c index 2472ed9e682c..18baf2c009d4 100644 --- a/fs/coredump.c +++ b/fs/coredump.c @@ -685,14 +685,6 @@ fail: * 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 !dump_interrupted() && - access_ok(VERIFY_READ, addr, nr) && - file->f_op->write(file, addr, nr, &file->f_pos) == nr; -} -EXPORT_SYMBOL(dump_write); - int dump_emit(struct coredump_params *cprm, const void *addr, int nr) { struct file *file = cprm->file; @@ -714,32 +706,25 @@ int dump_emit(struct coredump_params *cprm, const void *addr, int nr) } EXPORT_SYMBOL(dump_emit); -int dump_seek(struct file *file, loff_t off) +int dump_skip(struct coredump_params *cprm, size_t nr) { - int ret = 1; - + static char zeroes[PAGE_SIZE]; + struct file *file = cprm->file; if (file->f_op->llseek && file->f_op->llseek != no_llseek) { + if (cprm->written + nr > cprm->limit) + return 0; if (dump_interrupted() || - file->f_op->llseek(file, off, SEEK_CUR) < 0) + file->f_op->llseek(file, nr, SEEK_CUR) < 0) return 0; + cprm->written += nr; + return 1; } 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; + while (nr > PAGE_SIZE) { + if (!dump_emit(cprm, zeroes, PAGE_SIZE)) + return 0; + nr -= PAGE_SIZE; } - free_page((unsigned long)buf); + return dump_emit(cprm, zeroes, nr); } - return ret; } -EXPORT_SYMBOL(dump_seek); +EXPORT_SYMBOL(dump_skip); |