Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp1232185imm; Tue, 5 Jun 2018 11:04:34 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJ/7pBNW7qZew+YD/mhNPVIhJwc+LyGys++Q+EooN3uFKhcfH3/bAl1dAho+5o7rz/dFZZO X-Received: by 2002:a63:7f07:: with SMTP id a7-v6mr21809806pgd.173.1528221874321; Tue, 05 Jun 2018 11:04:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528221874; cv=none; d=google.com; s=arc-20160816; b=MHC0D79JMhWalyQOzZ1Oe3ZHMQA09RWIuGrt7XqchPaQhAMJXVmj646mP9rsrhwd0V TXCjjBXSzL4b9178hBeN4q8xLXVgbLConPaauTbCO63UHrf0rhb5XfMdbFw+1euUaVPv ye0yKHPxmbpU6LOdrErNv7kwTMxlBCMqeNPYssAui0P9SMdj5D4nvldS/vbeFb17IAM7 NJQJOx0sGv1MM6rZtAN6jJ0uYjScbJiDj5syk6r3GUPGw4B39bMpwsd8Lme/YOaucTVm 6cLR+S0PdEazXS6SjN+XPlzC7RNPYA2BHI5VSawOYaEGqPDPwfP0+D+wESFp9flvh8WW n+3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=Yc0/WtgeWv1F+cRWL3iox9r1JnP0X7unXAVwxksyoBk=; b=qiinVD2H3+Vx0eV3Djh5Ft3USDSKOU0Dzo1n392UtrRBD0Kycb6+XQZdWYdWiq84w0 XqB4ziIUIooO1zFqiWFdG40bwiQOCzNKLg0xieoxE7RvrVFv9J6+iZERCw5QxYiX/D6H 5+GLpN7ABhu86Anm5o3yQgfnfs2HzssthmfTpGqa3sM0aUlOExvyLVfFZE+9kvYeJK7u 2srkwyFEmKfYSkhYXf9pSdy9t50mNfFjTUPPg/yoMvqaJUFMRp/pWLNCIgapv5N45bmR 4HSP5i+PZVKNlD3xt8PPTycn6ZlA/b5AFubNw7KarmCG1nqMh1nBiKPEnbVw7VBcbh53 xzRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=FvjLdyKJ; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a89-v6si9228604pla.177.2018.06.05.11.04.18; Tue, 05 Jun 2018 11:04:34 -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=fail header.i=@gmail.com header.s=20161025 header.b=FvjLdyKJ; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752977AbeFESC5 (ORCPT + 99 others); Tue, 5 Jun 2018 14:02:57 -0400 Received: from mail-yw0-f195.google.com ([209.85.161.195]:45540 "EHLO mail-yw0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751895AbeFESB1 (ORCPT ); Tue, 5 Jun 2018 14:01:27 -0400 Received: by mail-yw0-f195.google.com with SMTP id v190-v6so1016854ywa.12; Tue, 05 Jun 2018 11:01:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=Yc0/WtgeWv1F+cRWL3iox9r1JnP0X7unXAVwxksyoBk=; b=FvjLdyKJ3JuzqOEI+Fh/4rq7yUeagMUOJZp21VWhXn4fxlmptmabQzCNnTb64nYSOG g7E7mYOmjOWmaNb2/a4XRFJUpALdsjk8JUsZ4YJEdSk+4jlxAFjTKtupNl6+PFDbjhf7 rQNfT0feP3R/zxsnHen8T/673c/o/b8n8TZr5u2Nt/r/hNckpsNsPTMcPeFhaHuKbASy K2swbbRcq5cdA9PkSMi+SvExa0+sRLnyKmXD8Ppaib55evsmox67vLSpdWN+Pwzv0QEj c60nJ9SLu8AvaRvUOPUX1JttjhbRWmu794wINsvxVDES0cSmxeYQZhuGycIpCVYBGVSK iHzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=Yc0/WtgeWv1F+cRWL3iox9r1JnP0X7unXAVwxksyoBk=; b=GwQUti2RgzO4NNoH6o6q8c+mQtOVPQHMg7xwWNx9DLy/BixZiDDpM7x+J0r5xvBzZS YZtMp6exw8dudvtwM8zRBCyjGjtjoHqc9TBxbP0j4LTlDV+jU3uCPuV9p0zJgAGp5HB2 yZsDOJAGRTHoXBJinPWkRH7eLB/ThnRJ84eUSW9QkbXf3+yirNH/u8zjJ5S+4kQfo5if m/bxIxwqPJ8OBxRB035HWWRB4dyrpmFKaBR7ui2LPw+Wfp3vVVBBEWgfkCqn86yrDerp s39oKzI7dd5DxWGk1AiU2aWhwMy49fX19AXxHWy/wEBYb+/XCORWbDHfKZQiRfoCDF7i uGmQ== X-Gm-Message-State: ALKqPweEI6Vv7NAGVL5HhEjALSOLFAOVWeiz3R//5ZUwdaIeXQ/UkQTF Oy4sE4QVOx7iLP+nb290cQE= X-Received: by 2002:a0d:edc4:: with SMTP id w187-v6mr13331408ywe.457.1528221686850; Tue, 05 Jun 2018 11:01:26 -0700 (PDT) Received: from localhost ([2620:10d:c091:200::1:f697]) by smtp.gmail.com with ESMTPSA id v130-v6sm14969487ywb.50.2018.06.05.11.01.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Jun 2018 11:01:25 -0700 (PDT) From: Tejun Heo To: axboe@kernel.dk Cc: michaelcallahan@fb.com, newella@fb.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, kernel-team@fb.com, Tejun Heo , Mike Christie , Minchan Kim , Dan Williams Subject: [PATCH 1/6] block: make bdev_ops->rw_page() take a REQ_OP instead of bool Date: Tue, 5 Jun 2018 11:01:15 -0700 Message-Id: <20180605180120.2726113-2-tj@kernel.org> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20180605180120.2726113-1-tj@kernel.org> References: <20180605180120.2726113-1-tj@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org c11f0c0b5bb9 ("block/mm: make bdev_ops->rw_page() take a bool for read/write") replaced @op with boolean @is_write, which limited the amount of information going into ->rw_page() and more importantly page_endio(), which removed the need to expose block internals to mm. Unfortunately, we want to track discards separately and @is_write isn't enough information. This patch updates bdev_ops->rw_page() to take REQ_OP instead but leaves page_endio() to take bool @is_write. This allows the block part of operations to have enough information while not leaking it to mm. Signed-off-by: Tejun Heo Cc: Mike Christie Cc: Minchan Kim Cc: Dan Williams --- drivers/block/brd.c | 14 +++++++------- drivers/block/zram/zram_drv.c | 16 ++++++++-------- drivers/nvdimm/btt.c | 12 ++++++------ drivers/nvdimm/pmem.c | 13 ++++++------- fs/block_dev.c | 6 ++++-- fs/mpage.c | 4 ++-- include/linux/blkdev.h | 2 +- 7 files changed, 34 insertions(+), 33 deletions(-) diff --git a/drivers/block/brd.c b/drivers/block/brd.c index bb97659..df8103d 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -254,20 +254,20 @@ static void copy_from_brd(void *dst, struct brd_device *brd, * Process a single bvec of a bio. */ static int brd_do_bvec(struct brd_device *brd, struct page *page, - unsigned int len, unsigned int off, bool is_write, + unsigned int len, unsigned int off, unsigned int op, sector_t sector) { void *mem; int err = 0; - if (is_write) { + if (op_is_write(op)) { err = copy_to_brd_setup(brd, sector, len); if (err) goto out; } mem = kmap_atomic(page); - if (!is_write) { + if (!op_is_write(op)) { copy_from_brd(mem + off, brd, sector, len); flush_dcache_page(page); } else { @@ -296,7 +296,7 @@ static blk_qc_t brd_make_request(struct request_queue *q, struct bio *bio) int err; err = brd_do_bvec(brd, bvec.bv_page, len, bvec.bv_offset, - op_is_write(bio_op(bio)), sector); + bio_op(bio), sector); if (err) goto io_error; sector += len >> SECTOR_SHIFT; @@ -310,15 +310,15 @@ static blk_qc_t brd_make_request(struct request_queue *q, struct bio *bio) } static int brd_rw_page(struct block_device *bdev, sector_t sector, - struct page *page, bool is_write) + struct page *page, unsigned int op) { struct brd_device *brd = bdev->bd_disk->private_data; int err; if (PageTransHuge(page)) return -ENOTSUPP; - err = brd_do_bvec(brd, page, PAGE_SIZE, 0, is_write, sector); - page_endio(page, is_write, err); + err = brd_do_bvec(brd, page, PAGE_SIZE, 0, op, sector); + page_endio(page, op_is_write(op), err); return err; } diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 0f3fadd..dd3da44 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1145,17 +1145,17 @@ static void zram_bio_discard(struct zram *zram, u32 index, * Returns 1 if IO request was successfully submitted. */ static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, - int offset, bool is_write, struct bio *bio) + int offset, unsigned int op, struct bio *bio) { unsigned long start_time = jiffies; - int rw_acct = is_write ? REQ_OP_WRITE : REQ_OP_READ; + int rw_acct = op_is_write(op) ? REQ_OP_WRITE : REQ_OP_READ; struct request_queue *q = zram->disk->queue; int ret; generic_start_io_acct(q, rw_acct, bvec->bv_len >> SECTOR_SHIFT, &zram->disk->part0); - if (!is_write) { + if (!op_is_write(op)) { atomic64_inc(&zram->stats.num_reads); ret = zram_bvec_read(zram, bvec, index, offset, bio); flush_dcache_page(bvec->bv_page); @@ -1167,7 +1167,7 @@ static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, generic_end_io_acct(q, rw_acct, &zram->disk->part0, start_time); if (unlikely(ret < 0)) { - if (!is_write) + if (!op_is_write(op)) atomic64_inc(&zram->stats.failed_reads); else atomic64_inc(&zram->stats.failed_writes); @@ -1205,7 +1205,7 @@ static void __zram_make_request(struct zram *zram, struct bio *bio) bv.bv_len = min_t(unsigned int, PAGE_SIZE - offset, unwritten); if (zram_bvec_rw(zram, &bv, index, offset, - op_is_write(bio_op(bio)), bio) < 0) + bio_op(bio), bio) < 0) goto out; bv.bv_offset += bv.bv_len; @@ -1257,7 +1257,7 @@ static void zram_slot_free_notify(struct block_device *bdev, } static int zram_rw_page(struct block_device *bdev, sector_t sector, - struct page *page, bool is_write) + struct page *page, unsigned int op) { int offset, ret; u32 index; @@ -1281,7 +1281,7 @@ static int zram_rw_page(struct block_device *bdev, sector_t sector, bv.bv_len = PAGE_SIZE; bv.bv_offset = 0; - ret = zram_bvec_rw(zram, &bv, index, offset, is_write, NULL); + ret = zram_bvec_rw(zram, &bv, index, offset, op, NULL); out: /* * If I/O fails, just return error(ie, non-zero) without @@ -1296,7 +1296,7 @@ static int zram_rw_page(struct block_device *bdev, sector_t sector, switch (ret) { case 0: - page_endio(page, is_write, 0); + page_endio(page, op_is_write(op), 0); break; case 1: ret = 0; diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c index 85de805..0360c01 100644 --- a/drivers/nvdimm/btt.c +++ b/drivers/nvdimm/btt.c @@ -1423,11 +1423,11 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip, static int btt_do_bvec(struct btt *btt, struct bio_integrity_payload *bip, struct page *page, unsigned int len, unsigned int off, - bool is_write, sector_t sector) + unsigned int op, sector_t sector) { int ret; - if (!is_write) { + if (!op_is_write(op)) { ret = btt_read_pg(btt, bip, page, off, sector, len); flush_dcache_page(page); } else { @@ -1464,7 +1464,7 @@ static blk_qc_t btt_make_request(struct request_queue *q, struct bio *bio) } err = btt_do_bvec(btt, bip, bvec.bv_page, len, bvec.bv_offset, - op_is_write(bio_op(bio)), iter.bi_sector); + bio_op(bio), iter.bi_sector); if (err) { dev_err(&btt->nd_btt->dev, "io error in %s sector %lld, len %d,\n", @@ -1483,16 +1483,16 @@ static blk_qc_t btt_make_request(struct request_queue *q, struct bio *bio) } static int btt_rw_page(struct block_device *bdev, sector_t sector, - struct page *page, bool is_write) + struct page *page, unsigned int op) { struct btt *btt = bdev->bd_disk->private_data; int rc; unsigned int len; len = hpage_nr_pages(page) * PAGE_SIZE; - rc = btt_do_bvec(btt, NULL, page, len, 0, is_write, sector); + rc = btt_do_bvec(btt, NULL, page, len, 0, op, sector); if (rc == 0) - page_endio(page, is_write, 0); + page_endio(page, op_is_write(op), 0); return rc; } diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index e023d6a..90942508 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -120,7 +120,7 @@ static blk_status_t read_pmem(struct page *page, unsigned int off, } static blk_status_t pmem_do_bvec(struct pmem_device *pmem, struct page *page, - unsigned int len, unsigned int off, bool is_write, + unsigned int len, unsigned int off, unsigned int op, sector_t sector) { blk_status_t rc = BLK_STS_OK; @@ -131,7 +131,7 @@ static blk_status_t pmem_do_bvec(struct pmem_device *pmem, struct page *page, if (unlikely(is_bad_pmem(&pmem->bb, sector, len))) bad_pmem = true; - if (!is_write) { + if (!op_is_write(op)) { if (unlikely(bad_pmem)) rc = BLK_STS_IOERR; else { @@ -185,8 +185,7 @@ static blk_qc_t pmem_make_request(struct request_queue *q, struct bio *bio) do_acct = nd_iostat_start(bio, &start); bio_for_each_segment(bvec, bio, iter) { rc = pmem_do_bvec(pmem, bvec.bv_page, bvec.bv_len, - bvec.bv_offset, op_is_write(bio_op(bio)), - iter.bi_sector); + bvec.bv_offset, bio_op(bio), iter.bi_sector); if (rc) { bio->bi_status = rc; break; @@ -203,13 +202,13 @@ static blk_qc_t pmem_make_request(struct request_queue *q, struct bio *bio) } static int pmem_rw_page(struct block_device *bdev, sector_t sector, - struct page *page, bool is_write) + struct page *page, unsigned int op) { struct pmem_device *pmem = bdev->bd_queue->queuedata; blk_status_t rc; rc = pmem_do_bvec(pmem, page, hpage_nr_pages(page) * PAGE_SIZE, - 0, is_write, sector); + 0, op, sector); /* * The ->rw_page interface is subtle and tricky. The core @@ -218,7 +217,7 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector, * caused by double completion. */ if (rc == 0) - page_endio(page, is_write, 0); + page_endio(page, op_is_write(op), 0); return blk_status_to_errno(rc); } diff --git a/fs/block_dev.c b/fs/block_dev.c index bef6934..82ed5e4 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -662,7 +662,8 @@ int bdev_read_page(struct block_device *bdev, sector_t sector, result = blk_queue_enter(bdev->bd_queue, 0); if (result) return result; - result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, false); + result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, + REQ_OP_READ); blk_queue_exit(bdev->bd_queue); return result; } @@ -700,7 +701,8 @@ int bdev_write_page(struct block_device *bdev, sector_t sector, return result; set_page_writeback(page); - result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, true); + result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, + REQ_OP_WRITE); if (result) { end_page_writeback(page); } else { diff --git a/fs/mpage.c b/fs/mpage.c index b7e7f57..b73638d 100644 --- a/fs/mpage.c +++ b/fs/mpage.c @@ -51,8 +51,8 @@ static void mpage_end_io(struct bio *bio) bio_for_each_segment_all(bv, bio, i) { struct page *page = bv->bv_page; - page_endio(page, op_is_write(bio_op(bio)), - blk_status_to_errno(bio->bi_status)); + page_endio(page, bio_op(bio), + blk_status_to_errno(bio->bi_status)); } bio_put(bio); diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index bca3a92..b038366 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1955,7 +1955,7 @@ static inline bool integrity_req_gap_front_merge(struct request *req, struct block_device_operations { int (*open) (struct block_device *, fmode_t); void (*release) (struct gendisk *, fmode_t); - int (*rw_page)(struct block_device *, sector_t, struct page *, bool); + int (*rw_page)(struct block_device *, sector_t, struct page *, unsigned int); int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); unsigned int (*check_events) (struct gendisk *disk, -- 2.9.5