lkml.org 
[lkml]   [2017]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.18 14/19] fix unbalanced page refcounting in bio_map_user_iov
    Date
    3.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Vitaly Mayatskikh <v.mayatskih@gmail.com>

    commit 95d78c28b5a85bacbc29b8dba7c04babb9b0d467 upstream.

    bio_map_user_iov and bio_unmap_user do unbalanced pages refcounting if
    IO vector has small consecutive buffers belonging to the same page.
    bio_add_pc_page merges them into one, but the page reference is never
    dropped.

    Signed-off-by: Vitaly Mayatskikh <v.mayatskih@gmail.com>
    Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    block/bio.c | 8 ++++++++
    1 file changed, 8 insertions(+)

    --- a/block/bio.c
    +++ b/block/bio.c
    @@ -1338,6 +1338,7 @@ static struct bio *__bio_map_user_iov(st
    offset = uaddr & ~PAGE_MASK;
    for (j = cur_page; j < page_limit; j++) {
    unsigned int bytes = PAGE_SIZE - offset;
    + unsigned short prev_bi_vcnt = bio->bi_vcnt;

    if (len <= 0)
    break;
    @@ -1352,6 +1353,13 @@ static struct bio *__bio_map_user_iov(st
    bytes)
    break;

    + /*
    + * check if vector was merged with previous
    + * drop page reference if needed
    + */
    + if (bio->bi_vcnt == prev_bi_vcnt)
    + put_page(pages[j]);
    +
    len -= bytes;
    offset = 0;
    }

    \
     
     \ /
      Last update: 2017-10-16 18:51    [W:4.075 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site