Split copy_mc_to_iter() by type.

Signed-off-by: David Howells <[email protected]>
---

 lib/iov_iter.c |   54 +++++++++++++++++++++++++++++++++---------------------
 1 file changed, 33 insertions(+), 21 deletions(-)

diff --git a/lib/iov_iter.c b/lib/iov_iter.c
index 0865e0b6eee9..7c1d92f7d020 100644
--- a/lib/iov_iter.c
+++ b/lib/iov_iter.c
@@ -758,7 +758,7 @@ static unsigned long copy_mc_to_page(struct page *page, 
size_t offset,
        return ret;
 }
 
-static size_t copy_mc_pipe_to_iter(const void *addr, size_t bytes,
+static size_t pipe_copy_mc_to_iter(const void *addr, size_t bytes,
                                struct iov_iter *i)
 {
        struct pipe_inode_info *pipe = i->pipe;
@@ -815,18 +815,23 @@ static size_t copy_mc_pipe_to_iter(const void *addr, 
size_t bytes,
  *   Compare to copy_to_iter() where only ITER_IOVEC attempts might return
  *   a short copy.
  */
-static size_t xxx_copy_mc_to_iter(const void *addr, size_t bytes, struct 
iov_iter *i)
+static size_t iovec_copy_mc_to_iter(const void *addr, size_t bytes, struct 
iov_iter *i)
 {
        const char *from = addr;
-       unsigned long rem, curr_addr, s_addr = (unsigned long) addr;
 
-       if (unlikely(iov_iter_is_pipe(i)))
-               return copy_mc_pipe_to_iter(addr, bytes, i);
-       if (iter_is_iovec(i))
-               might_fault();
-       iterate_and_advance(i, bytes, v,
+       might_fault();
+       iterate_and_advance_iovec(i, bytes, v,
                copyout_mc(v.iov_base, (from += v.iov_len) - v.iov_len,
-                          v.iov_len),
+                          v.iov_len));
+       return bytes;
+}
+
+static size_t bvec_copy_mc_to_iter(const void *addr, size_t bytes, struct 
iov_iter *i)
+{
+       const char *from = addr;
+       unsigned long rem, curr_addr, s_addr = (unsigned long) addr;
+
+       iterate_and_advance_bvec(i, bytes, v,
                ({
                rem = copy_mc_to_page(v.bv_page, v.bv_offset,
                                      (from += v.bv_len) - v.bv_len, v.bv_len);
@@ -835,18 +840,25 @@ static size_t xxx_copy_mc_to_iter(const void *addr, 
size_t bytes, struct iov_ite
                        bytes = curr_addr - s_addr - rem;
                        return bytes;
                }
-               }),
-               ({
-               rem = copy_mc_to_kernel(v.iov_base, (from += v.iov_len)
-                                       - v.iov_len, v.iov_len);
+               }))
+       return bytes;
+}
+
+static size_t kvec_copy_mc_to_iter(const void *addr, size_t bytes, struct 
iov_iter *i)
+{
+       const char *from = addr;
+       unsigned long rem, curr_addr, s_addr = (unsigned long) addr;
+
+       iterate_and_advance_kvec(i, bytes, v, ({
+               rem = copy_mc_to_kernel(v.iov_base,
+                                       (from += v.iov_len) - v.iov_len,
+                                       v.iov_len);
                if (rem) {
                        curr_addr = (unsigned long) from;
                        bytes = curr_addr - s_addr - rem;
                        return bytes;
                }
-               })
-       )
-
+               }));
        return bytes;
 }
 #endif /* CONFIG_ARCH_HAS_COPY_MC */
@@ -1939,7 +1951,7 @@ static const struct iov_iter_ops iovec_iter_ops = {
        .copy_from_iter_flushcache      = xxx_copy_from_iter_flushcache,
 #endif
 #ifdef CONFIG_ARCH_HAS_COPY_MC
-       .copy_mc_to_iter                = xxx_copy_mc_to_iter,
+       .copy_mc_to_iter                = iovec_copy_mc_to_iter,
 #endif
        .csum_and_copy_to_iter          = xxx_csum_and_copy_to_iter,
        .csum_and_copy_from_iter        = xxx_csum_and_copy_from_iter,
@@ -1973,7 +1985,7 @@ static const struct iov_iter_ops kvec_iter_ops = {
        .copy_from_iter_flushcache      = xxx_copy_from_iter_flushcache,
 #endif
 #ifdef CONFIG_ARCH_HAS_COPY_MC
-       .copy_mc_to_iter                = xxx_copy_mc_to_iter,
+       .copy_mc_to_iter                = kvec_copy_mc_to_iter,
 #endif
        .csum_and_copy_to_iter          = xxx_csum_and_copy_to_iter,
        .csum_and_copy_from_iter        = xxx_csum_and_copy_from_iter,
@@ -2007,7 +2019,7 @@ static const struct iov_iter_ops bvec_iter_ops = {
        .copy_from_iter_flushcache      = xxx_copy_from_iter_flushcache,
 #endif
 #ifdef CONFIG_ARCH_HAS_COPY_MC
-       .copy_mc_to_iter                = xxx_copy_mc_to_iter,
+       .copy_mc_to_iter                = bvec_copy_mc_to_iter,
 #endif
        .csum_and_copy_to_iter          = xxx_csum_and_copy_to_iter,
        .csum_and_copy_from_iter        = xxx_csum_and_copy_from_iter,
@@ -2041,7 +2053,7 @@ static const struct iov_iter_ops pipe_iter_ops = {
        .copy_from_iter_flushcache      = xxx_copy_from_iter_flushcache,
 #endif
 #ifdef CONFIG_ARCH_HAS_COPY_MC
-       .copy_mc_to_iter                = xxx_copy_mc_to_iter,
+       .copy_mc_to_iter                = pipe_copy_mc_to_iter,
 #endif
        .csum_and_copy_to_iter          = xxx_csum_and_copy_to_iter,
        .csum_and_copy_from_iter        = xxx_csum_and_copy_from_iter,
@@ -2075,7 +2087,7 @@ static const struct iov_iter_ops discard_iter_ops = {
        .copy_from_iter_flushcache      = xxx_copy_from_iter_flushcache,
 #endif
 #ifdef CONFIG_ARCH_HAS_COPY_MC
-       .copy_mc_to_iter                = xxx_copy_mc_to_iter,
+       .copy_mc_to_iter                = discard_copy_to_iter,
 #endif
        .csum_and_copy_to_iter          = xxx_csum_and_copy_to_iter,
        .csum_and_copy_from_iter        = xxx_csum_and_copy_from_iter,


Reply via email to