lkml.org 
[lkml]   [2020]   [Sep]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 152/186] block: allow for_each_bvec to support zero len bvec
    Date
    From: Ming Lei <ming.lei@redhat.com>

    commit 7e24969022cbd61ddc586f14824fc205661bb124 upstream.

    Block layer usually doesn't support or allow zero-length bvec. Since
    commit 1bdc76aea115 ("iov_iter: use bvec iterator to implement
    iterate_bvec()"), iterate_bvec() switches to bvec iterator. However,
    Al mentioned that 'Zero-length segments are not disallowed' in iov_iter.

    Fixes for_each_bvec() so that it can move on after seeing one zero
    length bvec.

    Fixes: 1bdc76aea115 ("iov_iter: use bvec iterator to implement iterate_bvec()")
    Reported-by: syzbot <syzbot+61acc40a49a3e46e25ea@syzkaller.appspotmail.com>
    Signed-off-by: Ming Lei <ming.lei@redhat.com>
    Tested-by: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: <stable@vger.kernel.org>
    Link: https://www.mail-archive.com/linux-kernel@vger.kernel.org/msg2262077.html
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    include/linux/bvec.h | 9 ++++++++-
    1 file changed, 8 insertions(+), 1 deletion(-)

    --- a/include/linux/bvec.h
    +++ b/include/linux/bvec.h
    @@ -117,11 +117,18 @@ static inline bool bvec_iter_advance(con
    return true;
    }

    +static inline void bvec_iter_skip_zero_bvec(struct bvec_iter *iter)
    +{
    + iter->bi_bvec_done = 0;
    + iter->bi_idx++;
    +}
    +
    #define for_each_bvec(bvl, bio_vec, iter, start) \
    for (iter = (start); \
    (iter).bi_size && \
    ((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \
    - bvec_iter_advance((bio_vec), &(iter), (bvl).bv_len))
    + (bvl).bv_len ? (void)bvec_iter_advance((bio_vec), &(iter), \
    + (bvl).bv_len) : bvec_iter_skip_zero_bvec(&(iter)))

    /* for iterating one bio from start to end */
    #define BVEC_ITER_ALL_INIT (struct bvec_iter) \

    \
     
     \ /
      Last update: 2020-09-08 21:22    [W:4.133 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site