[prev in list] [next in list] [prev in thread] [next in thread]
List: ceph-devel
Subject: Re: [PATCH 08/11] rbd: bio_chain_clone() cleanups
From: Yehuda Sadeh <yehuda () inktank ! com>
Date: 2012-08-30 17:40:08
Message-ID: CAC-hyiGDLCgpS43d6wYbCq-bGBd0OndPVTVWaMN9EY=7muSUGg () mail ! gmail ! com
[Download RAW message or body]
Reviewed-by: Yehuda Sadeh <yehuda@inktank.com>
we still need to fix the bio_pair leak though
On Fri, Aug 24, 2012 at 9:35 AM, Alex Elder <elder@inktank.com> wrote:
> In bio_chain_clone(), at the end of the function the bi_next field
> of the tail of the new bio chain is nulled. This isn't necessary,
> because if "tail" is non-null, its value will be the last bio
> structure allocated at the top of the while loop in that function.
> And before that structure is added to the end of the new chain, its
> bi_next pointer is always made null.
>
> While touching that function, clean a few other things:
> - define each local variable on its own line
> - move the definition of "tmp" to an inner scope
> - move the modification of gfpmask closer to where it's used
> - rearrange the logic that sets the chain's tail pointer
>
> Signed-off-by: Alex Elder <elder@inktank.com>
> ---
> drivers/block/rbd.c | 21 ++++++++++-----------
> 1 file changed, 10 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
> index e94336d..bb8dad7 100644
> --- a/drivers/block/rbd.c
> +++ b/drivers/block/rbd.c
> @@ -741,7 +741,9 @@ static struct bio *bio_chain_clone(struct bio **old,
> struct bio **next,
> struct bio_pair **bp,
> int len, gfp_t gfpmask)
> {
> - struct bio *tmp, *old_chain = *old, *new_chain = NULL, *tail = NULL;
> + struct bio *old_chain = *old;
> + struct bio *new_chain = NULL;
> + struct bio *tail;
> int total = 0;
>
> if (*bp) {
> @@ -750,9 +752,12 @@ static struct bio *bio_chain_clone(struct bio
> **old, struct bio **next,
> }
>
> while (old_chain && (total < len)) {
> + struct bio *tmp;
> +
> tmp = bio_kmalloc(gfpmask, old_chain->bi_max_vecs);
> if (!tmp)
> goto err_out;
> + gfpmask &= ~__GFP_WAIT; /* can't wait after the first */
>
> if (total + old_chain->bi_size > len) {
> struct bio_pair *bp;
> @@ -780,15 +785,12 @@ static struct bio *bio_chain_clone(struct bio
> **old, struct bio **next,
> }
>
> tmp->bi_bdev = NULL;
> - gfpmask &= ~__GFP_WAIT;
> tmp->bi_next = NULL;
> -
> - if (!new_chain) {
> - new_chain = tail = tmp;
> - } else {
> + if (new_chain)
> tail->bi_next = tmp;
> - tail = tmp;
> - }
> + else
> + new_chain = tmp;
> + tail = tmp;
> old_chain = old_chain->bi_next;
>
> total += tmp->bi_size;
> @@ -796,9 +798,6 @@ static struct bio *bio_chain_clone(struct bio **old,
> struct bio **next,
>
> BUG_ON(total < len);
>
> - if (tail)
> - tail->bi_next = NULL;
> -
> *old = old_chain;
>
> return new_chain;
> --
> 1.7.9.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic