lkml.org 
[lkml]   [2020]   [Nov]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 27/29] iov_iter: Split dup_iter()
    From
    Date
    Split dup_iter() by type.

    Signed-off-by: David Howells <dhowells@redhat.com>
    ---

    lib/iov_iter.c | 49 +++++++++++++++++++++++++++++--------------------
    1 file changed, 29 insertions(+), 20 deletions(-)

    diff --git a/lib/iov_iter.c b/lib/iov_iter.c
    index d8ef6c81c55f..ca0e94596eda 100644
    --- a/lib/iov_iter.c
    +++ b/lib/iov_iter.c
    @@ -2078,26 +2078,35 @@ static int discard_npages(const struct iov_iter *i, int maxpages)
    return 0;
    }

    -static const void *xxx_dup_iter(struct iov_iter *new, struct iov_iter *old, gfp_t flags)
    +static const void *iovec_kvec_dup_iter(struct iov_iter *new, struct iov_iter *old, gfp_t flags)
    {
    *new = *old;
    - if (unlikely(iov_iter_is_pipe(new))) {
    - WARN_ON(1);
    - return NULL;
    - }
    - if (unlikely(iov_iter_is_discard(new)))
    - return NULL;
    - if (iov_iter_is_bvec(new))
    - return new->bvec = kmemdup(new->bvec,
    - new->nr_segs * sizeof(struct bio_vec),
    - flags);
    - else
    - /* iovec and kvec have identical layout */
    - return new->iov = kmemdup(new->iov,
    - new->nr_segs * sizeof(struct iovec),
    + /* iovec and kvec have identical layout */
    + return new->iov = kmemdup(new->iov,
    + new->nr_segs * sizeof(struct iovec),
    + flags);
    +}
    +
    +static const void *bvec_dup_iter(struct iov_iter *new, struct iov_iter *old, gfp_t flags)
    +{
    + *new = *old;
    + return new->bvec = kmemdup(new->bvec,
    + new->nr_segs * sizeof(struct bio_vec),
    flags);
    }

    +static const void *discard_dup_iter(struct iov_iter *new, struct iov_iter *old, gfp_t flags)
    +{
    + *new = *old;
    + return NULL;
    +}
    +
    +static const void *no_dup_iter(struct iov_iter *new, struct iov_iter *old, gfp_t flags)
    +{
    + WARN_ON(1);
    + return NULL;
    +}
    +
    static int copy_compat_iovec_from_user(struct iovec *iov,
    const struct iovec __user *uvec, unsigned long nr_segs)
    {
    @@ -2324,7 +2333,7 @@ static const struct iov_iter_ops iovec_iter_ops = {
    .get_pages = iovec_get_pages,
    .get_pages_alloc = iovec_get_pages_alloc,
    .npages = iovec_npages,
    - .dup_iter = xxx_dup_iter,
    + .dup_iter = iovec_kvec_dup_iter,
    .for_each_range = xxx_for_each_range,
    };

    @@ -2358,7 +2367,7 @@ static const struct iov_iter_ops kvec_iter_ops = {
    .get_pages = no_get_pages,
    .get_pages_alloc = no_get_pages_alloc,
    .npages = kvec_npages,
    - .dup_iter = xxx_dup_iter,
    + .dup_iter = iovec_kvec_dup_iter,
    .for_each_range = xxx_for_each_range,
    };

    @@ -2392,7 +2401,7 @@ static const struct iov_iter_ops bvec_iter_ops = {
    .get_pages = bvec_get_pages,
    .get_pages_alloc = bvec_get_pages_alloc,
    .npages = bvec_npages,
    - .dup_iter = xxx_dup_iter,
    + .dup_iter = bvec_dup_iter,
    .for_each_range = xxx_for_each_range,
    };

    @@ -2426,7 +2435,7 @@ static const struct iov_iter_ops pipe_iter_ops = {
    .get_pages = pipe_get_pages,
    .get_pages_alloc = pipe_get_pages_alloc,
    .npages = pipe_npages,
    - .dup_iter = xxx_dup_iter,
    + .dup_iter = no_dup_iter,
    .for_each_range = xxx_for_each_range,
    };

    @@ -2460,6 +2469,6 @@ static const struct iov_iter_ops discard_iter_ops = {
    .get_pages = no_get_pages,
    .get_pages_alloc = no_get_pages_alloc,
    .npages = discard_npages,
    - .dup_iter = xxx_dup_iter,
    + .dup_iter = discard_dup_iter,
    .for_each_range = xxx_for_each_range,
    };

    \
     
     \ /
      Last update: 2020-11-21 15:21    [W:9.305 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site