From 66a73d4dae00c52ad3d70a5ca7a8f6b730ba32c8 Mon Sep 17 00:00:00 2001 From: Lai Jiangshan Date: Thu, 2 Apr 2009 15:17:08 +0800 Subject: [PATCH] --- yaml --- r: 143111 b: refs/heads/master c: 93cfb3c9fd83d877a8f1ffad9ff862b617b32828 h: refs/heads/master i: 143109: 0076d71a20ef3fc3aa14d24fa1ef55920af03469 143107: ec8c2464511a24ba577aff6b112aef3b2aa2a8f1 143103: 407516816a571f20e363eb02b9e9f457bee74af8 v: v3 --- [refs] | 2 +- trunk/kernel/trace/trace.c | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 0087576e77e0..63d96d58efe7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c7625a555f55d7ae49236cde551786c88f5a5ce1 +refs/heads/master: 93cfb3c9fd83d877a8f1ffad9ff862b617b32828 diff --git a/trunk/kernel/trace/trace.c b/trunk/kernel/trace/trace.c index 94629760dabf..1ce5dc6372b8 100644 --- a/trunk/kernel/trace/trace.c +++ b/trunk/kernel/trace/trace.c @@ -3428,7 +3428,19 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, int size, i; size_t ret; - for (i = 0; i < PIPE_BUFFERS && len; i++, len -= size) { + if (*ppos & (PAGE_SIZE - 1)) { + WARN_ONCE(1, "Ftrace: previous read must page-align\n"); + return -EINVAL; + } + + if (len & (PAGE_SIZE - 1)) { + WARN_ONCE(1, "Ftrace: splice_read should page-align\n"); + if (len < PAGE_SIZE) + return -EINVAL; + len &= PAGE_MASK; + } + + for (i = 0; i < PIPE_BUFFERS && len; i++, len -= PAGE_SIZE) { struct page *page; int r; @@ -3467,7 +3479,7 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, spd.partial[i].offset = 0; spd.partial[i].private = (unsigned long)ref; spd.nr_pages++; - *ppos += size; + *ppos += PAGE_SIZE; } spd.nr_pages = i;