Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp5135270yba; Wed, 10 Apr 2019 12:08:12 -0700 (PDT) X-Google-Smtp-Source: APXvYqwA6aOgTf/TkpMna8AHuOfC4gFylPQfr1WpZYKElGRNn2u6Gty3P8/oEP1MoFPkkp3iv6TL X-Received: by 2002:a65:5941:: with SMTP id g1mr43664471pgu.51.1554923292322; Wed, 10 Apr 2019 12:08:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554923292; cv=none; d=google.com; s=arc-20160816; b=mVgHJuqY5EGWnceYNeQZpFOTagq/wH/7ZTriVIIEiKZiXG62zOc1BfUeqtlEVY54My KsFtwrcaG0FDrWYstrwvudSuX9xWTm6BElxRcj2tMsvXBVCo6VzFJM3uuNIjeJ6RkNTx z28A63Hd9MlILlhSH0ZIwtlonfM5FNUdLLhJScZHaoUf0kL/F7nGzkzqEUROarOsTRxC E5LucICb62eKtcI+FfiPaACQ8gVeNTdGzS745mUif3aHQaIRDiIGEVZ2YNL1Q4w+vebF I7nBZ5zN3MfESVo7XVh7NYS9ET8rOoZupwGDIoQWUIlpFmNx3o+1MrzX9H1Dftkgl4DE 3hJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=bEw+KO2/ka8nKlM3JMAkOLDxT8xAxL50hihSpr0VWC4=; b=wnq+ik7T5l34je0dik4Avd8dfvgfeLw1pH/0IqkIwSq6Sc+jjuEccGuWB3gRQYAd/+ AiIwcMCJfZix8b/bGV2ShDcseQoz9N+MXnbN3KFhhS6TUEZS95i0j0AW3tU8SahQQ2YS VO+3VemQCNQ1lIHPjKCw9V9SndXGtle77RqolueqwlUydDm+Km8dO62eB5OH+VTPoqR8 DWOZ/yA2ZDmOIxTdxR/taf+Bgh9ZdbZuz+6bEX7tAomwZH/p5qBp3031yCC6n/8qDhq8 SeTuvCmCwy+Q+16RGx2VvqS/S32yGKiZ5omjIvRlAHhCE7YyOAVWSWRdoK9y5COB8QZe XP1Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=puxKlU07; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z72si32178417pgd.401.2019.04.10.12.07.56; Wed, 10 Apr 2019 12:08:12 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@lightnvm-io.20150623.gappssmtp.com header.s=20150623 header.b=puxKlU07; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730802AbfDJR5F (ORCPT + 99 others); Wed, 10 Apr 2019 13:57:05 -0400 Received: from mail-lj1-f195.google.com ([209.85.208.195]:42781 "EHLO mail-lj1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729307AbfDJR5E (ORCPT ); Wed, 10 Apr 2019 13:57:04 -0400 Received: by mail-lj1-f195.google.com with SMTP id v22so2948979lje.9 for ; Wed, 10 Apr 2019 10:57:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lightnvm-io.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=bEw+KO2/ka8nKlM3JMAkOLDxT8xAxL50hihSpr0VWC4=; b=puxKlU07gNV3QUgf1ZXEnEdM5Ip7pvi3eCYsldM+D5+C+YWicqYoef35yl8fXQO2u3 5o8zzdYr0esWOKglNpbGkaPO+EGg+qIcA24H9g1Lty2yg3jRVDwwqOwoX5rNGLaSrTQs snqijvwq+EJzz4n9zAOc8yxXGXm0pZh2M0oo+sHkgHZaTeoYrabFujtm8zXi5yBNKcDC R1l7xn//9rodLBtfyOvq53wgZm5VIfQVw+Zz8XUAXUxaydX1jdI9DOf5KLoCTFYWfiLl ebppf6XPN8Ka0eHujjH9NSkGAelCgzhE+GmvitmXIgDVn9chBMx+PpILMi9gHmrqolIh E5Qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=bEw+KO2/ka8nKlM3JMAkOLDxT8xAxL50hihSpr0VWC4=; b=pyc9MTYqDzqaWya/aOZ5AqOlJG0QlBBxDT4QUJH2DOj9c1bx5sdRr1pdtC89sj+HjC ANe0B/MYTs+AjtxIDlh6GxZLiLK33bj/plv4fnyKtoYSA9unKLNioRLibu+QqawyP/8B XU14yzgnH7yUVHnCJp3VjCYT0aBsO1gkgYUTUOqxHiKICd2DbaNsrKPdSEItMmrQa144 XBnJi8e6sbewaa5fbt8WM4Z95Uos8IbJSzhd4MS+Q3m90ZiGQxpf0nUycUYj5OuXK6iP m+bQPvgpChM76ebjPUU4PSuLwSKxnvTNFsanG6oBfODw1jihlPSTZ8dqrgQ1eKW6qVP3 Me/g== X-Gm-Message-State: APjAAAUAF3BtEb+HJKa4cXwGTbQeNLXrNBkMFe0+VxYiAzuIKPMMpbhm 68mbZx0ZpeCXf1ViwhO+73yc81svou8= X-Received: by 2002:a2e:8446:: with SMTP id u6mr23207712ljh.71.1554919022671; Wed, 10 Apr 2019 10:57:02 -0700 (PDT) Received: from skyninja.webspeed.dk (2-111-91-225-cable.dk.customer.tdc.net. [2.111.91.225]) by smtp.gmail.com with ESMTPSA id r20sm7357190ljj.22.2019.04.10.10.57.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Apr 2019 10:57:01 -0700 (PDT) From: =?UTF-8?q?Matias=20Bj=C3=B8rling?= To: axboe@fb.com Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, Hans Holmberg , =?UTF-8?q?Matias=20Bj=C3=B8rling?= Subject: [GIT PULL] lightnvm: pblk: fix crash in pblk_end_partial_read due to multipage bvecs Date: Wed, 10 Apr 2019 19:56:43 +0200 Message-Id: <20190410175643.11000-1-mb@lightnvm.io> X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Hans Holmberg The introduction of multipage bio vectors broke pblk's partial read logic due to it not being prepared for multipage bio vectors. Use bio vector iterators instead of direct bio vector indexing. Fixes: 07173c3ec276 ("block: enable multipage bvecs") Reported-by: Klaus Jensen Signed-off-by: Hans Holmberg Updated description. Signed-off-by: Matias Bjørling --- drivers/lightnvm/pblk-read.c | 50 ++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/drivers/lightnvm/pblk-read.c b/drivers/lightnvm/pblk-read.c index 3789185144da..0b7d5fb4548d 100644 --- a/drivers/lightnvm/pblk-read.c +++ b/drivers/lightnvm/pblk-read.c @@ -231,14 +231,14 @@ static void pblk_end_partial_read(struct nvm_rq *rqd) struct pblk_sec_meta *meta; struct bio *new_bio = rqd->bio; struct bio *bio = pr_ctx->orig_bio; - struct bio_vec src_bv, dst_bv; void *meta_list = rqd->meta_list; - int bio_init_idx = pr_ctx->bio_init_idx; unsigned long *read_bitmap = pr_ctx->bitmap; + struct bvec_iter orig_iter = BVEC_ITER_ALL_INIT; + struct bvec_iter new_iter = BVEC_ITER_ALL_INIT; int nr_secs = pr_ctx->orig_nr_secs; int nr_holes = nr_secs - bitmap_weight(read_bitmap, nr_secs); void *src_p, *dst_p; - int hole, i; + int bit, i; if (unlikely(nr_holes == 1)) { struct ppa_addr ppa; @@ -257,33 +257,39 @@ static void pblk_end_partial_read(struct nvm_rq *rqd) /* Fill the holes in the original bio */ i = 0; - hole = find_first_zero_bit(read_bitmap, nr_secs); - do { - struct pblk_line *line; + for (bit = 0; bit < nr_secs; bit++) { + if (!test_bit(bit, read_bitmap)) { + struct bio_vec dst_bv, src_bv; + struct pblk_line *line; - line = pblk_ppa_to_line(pblk, rqd->ppa_list[i]); - kref_put(&line->ref, pblk_line_put); + line = pblk_ppa_to_line(pblk, rqd->ppa_list[i]); + kref_put(&line->ref, pblk_line_put); - meta = pblk_get_meta(pblk, meta_list, hole); - meta->lba = cpu_to_le64(pr_ctx->lba_list_media[i]); + meta = pblk_get_meta(pblk, meta_list, bit); + meta->lba = cpu_to_le64(pr_ctx->lba_list_media[i]); - src_bv = new_bio->bi_io_vec[i++]; - dst_bv = bio->bi_io_vec[bio_init_idx + hole]; + dst_bv = bio_iter_iovec(bio, orig_iter); + src_bv = bio_iter_iovec(new_bio, new_iter); - src_p = kmap_atomic(src_bv.bv_page); - dst_p = kmap_atomic(dst_bv.bv_page); + src_p = kmap_atomic(src_bv.bv_page); + dst_p = kmap_atomic(dst_bv.bv_page); - memcpy(dst_p + dst_bv.bv_offset, - src_p + src_bv.bv_offset, - PBLK_EXPOSED_PAGE_SIZE); + memcpy(dst_p + dst_bv.bv_offset, + src_p + src_bv.bv_offset, + PBLK_EXPOSED_PAGE_SIZE); - kunmap_atomic(src_p); - kunmap_atomic(dst_p); + kunmap_atomic(src_p); + kunmap_atomic(dst_p); - mempool_free(src_bv.bv_page, &pblk->page_bio_pool); + flush_dcache_page(dst_bv.bv_page); + mempool_free(src_bv.bv_page, &pblk->page_bio_pool); - hole = find_next_zero_bit(read_bitmap, nr_secs, hole + 1); - } while (hole < nr_secs); + bio_advance_iter(new_bio, &new_iter, + PBLK_EXPOSED_PAGE_SIZE); + i++; + } + bio_advance_iter(bio, &orig_iter, PBLK_EXPOSED_PAGE_SIZE); + } bio_put(new_bio); kfree(pr_ctx); -- 2.19.1