OSDN Git Service

csum_and_copy_to_iter(): handle ITER_DISCARD
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 16 Sep 2022 00:20:59 +0000 (20:20 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 25 Nov 2022 18:01:20 +0000 (13:01 -0500)
Not hard to implement - we are not copying anything here, so
csum_and_memcpy() is not usable, but calculating a checksum
of source directly is trivial...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
lib/iov_iter.c

index e9a8fc9..020e009 100644 (file)
@@ -1549,8 +1549,12 @@ size_t csum_and_copy_to_iter(const void *addr, size_t bytes, void *_csstate,
        __wsum sum, next;
 
        if (unlikely(iov_iter_is_discard(i))) {
-               WARN_ON(1);     /* for now */
-               return 0;
+               // can't use csum_memcpy() for that one - data is not copied
+               csstate->csum = csum_block_add(csstate->csum,
+                                              csum_partial(addr, bytes, 0),
+                                              csstate->off);
+               csstate->off += bytes;
+               return bytes;
        }
 
        sum = csum_shift(csstate->csum, csstate->off);