lkml.org 
[lkml]   [2009]   [Apr]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 09/17] bio: collapse __bio_map_user_iov(), __bio_unmap_user() and __bio_map_kern()
    Date
    Impact: cleanup

    Collapse double underbar prefixed internal functions which have only
    single user into their respective call sites. This prepares for
    reimplementation.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    ---
    fs/bio.c | 129 +++++++++++++++++++++++--------------------------------------
    1 files changed, 49 insertions(+), 80 deletions(-)

    diff --git a/fs/bio.c b/fs/bio.c
    index f13aef0..4540afc 100644
    --- a/fs/bio.c
    +++ b/fs/bio.c
    @@ -1044,10 +1044,20 @@ struct bio *bio_copy_user(struct request_queue *q, struct rq_map_data *md,
    return bio_copy_user_iov(q, md, &iov, 1, rw, gfp);
    }

    -static struct bio *__bio_map_user_iov(struct request_queue *q,
    - struct block_device *bdev,
    - struct iovec *iov, int count, int rw,
    - gfp_t gfp)
    +/**
    + * bio_map_user_iov - map user iovec table into bio
    + * @q: the struct request_queue for the bio
    + * @bdev: destination block device
    + * @iov: the iovec.
    + * @count: number of elements in the iovec
    + * @rw: READ or WRITE
    + * @gfp: memory allocation flags
    + *
    + * Map the user space address into a bio suitable for io to a block
    + * device. Returns an error pointer in case of error.
    + */
    +struct bio *bio_map_user_iov(struct request_queue *q, struct block_device *bdev,
    + struct iovec *iov, int count, int rw, gfp_t gfp)
    {
    int i, j;
    size_t tot_len = 0;
    @@ -1141,6 +1151,15 @@ static struct bio *__bio_map_user_iov(struct request_queue *q,

    bio->bi_bdev = bdev;
    bio->bi_flags |= (1 << BIO_USER_MAPPED);
    +
    + /*
    + * subtle -- if __bio_map_user() ended up bouncing a bio,
    + * it would normally disappear when its bi_end_io is run.
    + * however, we need it for the unmap, so grab an extra
    + * reference to it
    + */
    + bio_get(bio);
    +
    return bio;

    out_unmap:
    @@ -1180,38 +1199,15 @@ struct bio *bio_map_user(struct request_queue *q, struct block_device *bdev,
    }

    /**
    - * bio_map_user_iov - map user iovec table into bio
    - * @q: the struct request_queue for the bio
    - * @bdev: destination block device
    - * @iov: the iovec.
    - * @count: number of elements in the iovec
    - * @rw: READ or WRITE
    - * @gfp: memory allocation flags
    + * bio_unmap_user - unmap a bio
    + * @bio: the bio being unmapped
    *
    - * Map the user space address into a bio suitable for io to a block
    - * device. Returns an error pointer in case of error.
    + * Unmap a bio previously mapped by bio_map_user(). Must be called with
    + * a process context.
    + *
    + * bio_unmap_user() may sleep.
    */
    -struct bio *bio_map_user_iov(struct request_queue *q, struct block_device *bdev,
    - struct iovec *iov, int count, int rw, gfp_t gfp)
    -{
    - struct bio *bio;
    -
    - bio = __bio_map_user_iov(q, bdev, iov, count, rw, gfp);
    - if (IS_ERR(bio))
    - return bio;
    -
    - /*
    - * subtle -- if __bio_map_user() ended up bouncing a bio,
    - * it would normally disappear when its bi_end_io is run.
    - * however, we need it for the unmap, so grab an extra
    - * reference to it
    - */
    - bio_get(bio);
    -
    - return bio;
    -}
    -
    -static void __bio_unmap_user(struct bio *bio)
    +void bio_unmap_user(struct bio *bio)
    {
    struct bio_vec *bvec;
    int i;
    @@ -1226,21 +1222,8 @@ static void __bio_unmap_user(struct bio *bio)
    page_cache_release(bvec->bv_page);
    }

    + /* see comment on the success return path of bio_map_user_iov() */
    bio_put(bio);
    -}
    -
    -/**
    - * bio_unmap_user - unmap a bio
    - * @bio: the bio being unmapped
    - *
    - * Unmap a bio previously mapped by bio_map_user(). Must be called with
    - * a process context.
    - *
    - * bio_unmap_user() may sleep.
    - */
    -void bio_unmap_user(struct bio *bio)
    -{
    - __bio_unmap_user(bio);
    bio_put(bio);
    }

    @@ -1249,9 +1232,18 @@ static void bio_map_kern_endio(struct bio *bio, int err)
    bio_put(bio);
    }

    -
    -static struct bio *__bio_map_kern(struct request_queue *q, void *data,
    - unsigned int len, gfp_t gfp)
    +/**
    + * bio_map_kern - map kernel address into bio
    + * @q: the struct request_queue for the bio
    + * @data: pointer to buffer to map
    + * @len: length in bytes
    + * @gfp: allocation flags for bio allocation
    + *
    + * Map the kernel address into a bio suitable for io to a block
    + * device. Returns an error pointer in case of error.
    + */
    +struct bio *bio_map_kern(struct request_queue *q, void *data, unsigned int len,
    + gfp_t gfp)
    {
    unsigned long kaddr = (unsigned long)data;
    unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
    @@ -1283,39 +1275,16 @@ static struct bio *__bio_map_kern(struct request_queue *q, void *data,
    offset = 0;
    }

    + /* doesn't support partial mappings */
    + if (unlikely(bio->bi_size != len)) {
    + bio_put(bio);
    + return ERR_PTR(-EINVAL);
    + }
    +
    bio->bi_end_io = bio_map_kern_endio;
    return bio;
    }

    -/**
    - * bio_map_kern - map kernel address into bio
    - * @q: the struct request_queue for the bio
    - * @data: pointer to buffer to map
    - * @len: length in bytes
    - * @gfp: allocation flags for bio allocation
    - *
    - * Map the kernel address into a bio suitable for io to a block
    - * device. Returns an error pointer in case of error.
    - */
    -struct bio *bio_map_kern(struct request_queue *q, void *data, unsigned int len,
    - gfp_t gfp)
    -{
    - struct bio *bio;
    -
    - bio = __bio_map_kern(q, data, len, gfp);
    - if (IS_ERR(bio))
    - return bio;
    -
    - if (bio->bi_size == len)
    - return bio;
    -
    - /*
    - * Don't support partial mappings.
    - */
    - bio_put(bio);
    - return ERR_PTR(-EINVAL);
    -}
    -
    static void bio_copy_kern_endio(struct bio *bio, int err)
    {
    struct bio_copy_info *bci = bio->bi_private;
    --
    1.6.0.2


    \
     
     \ /
      Last update: 2009-04-01 15:53    [W:0.038 / U:150.000 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site