Put in a check in read subreq termination to detect more data being read
for a subrequest than was requested.

Signed-off-by: David Howells <[email protected]>
cc: Paulo Alcantara <[email protected]>
cc: [email protected]
cc: [email protected]
---
 fs/netfs/read_collect.c      | 8 ++++++++
 include/trace/events/netfs.h | 1 +
 2 files changed, 9 insertions(+)

diff --git a/fs/netfs/read_collect.c b/fs/netfs/read_collect.c
index 977b69ac8725..fc62eaef6107 100644
--- a/fs/netfs/read_collect.c
+++ b/fs/netfs/read_collect.c
@@ -542,6 +542,14 @@ void netfs_read_subreq_terminated(struct 
netfs_io_subrequest *subreq)
                break;
        }
 
+       if (subreq->transferred > subreq->len) {
+               subreq->transferred = 0;
+               __set_bit(NETFS_SREQ_FAILED, &subreq->flags);
+               __clear_bit(NETFS_SREQ_NEED_RETRY, &subreq->flags);
+               trace_netfs_sreq(subreq, netfs_sreq_trace_too_much);
+               subreq->error = -EIO;
+       }
+
        /* Deal with retry requests, short reads and errors.  If we retry
         * but don't make progress, we abandon the attempt.
         */
diff --git a/include/trace/events/netfs.h b/include/trace/events/netfs.h
index 59f330003d02..cc29582f6245 100644
--- a/include/trace/events/netfs.h
+++ b/include/trace/events/netfs.h
@@ -134,6 +134,7 @@
        EM(netfs_sreq_trace_submit,             "SUBMT")        \
        EM(netfs_sreq_trace_superfluous,        "SPRFL")        \
        EM(netfs_sreq_trace_terminated,         "TERM ")        \
+       EM(netfs_sreq_trace_too_much,           "!TOOM")        \
        EM(netfs_sreq_trace_wait_for,           "_WAIT")        \
        EM(netfs_sreq_trace_write,              "WRITE")        \
        EM(netfs_sreq_trace_write_skip,         "SKIP ")        \


Reply via email to