All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kanchan Joshi <joshi.k@samsung.com>
To: axboe@kernel.dk, viro@zeniv.linux.org.uk, bcrl@kvack.org
Cc: hch@infradead.org, Damien.LeMoal@wdc.com, asml.silence@gmail.com,
	linux-fsdevel@vger.kernel.org, mb@lightnvm.io,
	linux-kernel@vger.kernel.org, linux-aio@kvack.org,
	io-uring@vger.kernel.org, linux-block@vger.kernel.org,
	Selvakumar S <selvakuma.s1@samsung.com>,
	Kanchan Joshi <joshi.k@samsung.com>,
	Nitesh Shetty <nj.shetty@samsung.com>,
	Arnav Dawn <a.dawn@samsung.com>,
	Javier Gonzalez <javier.gonz@samsung.com>
Subject: [PATCH v3 2/4] block: add zone append handling for direct I/O path
Date: Mon,  6 Jul 2020 00:17:48 +0530	[thread overview]
Message-ID: <1593974870-18919-3-git-send-email-joshi.k@samsung.com> (raw)
In-Reply-To: <1593974870-18919-1-git-send-email-joshi.k@samsung.com>

From: Selvakumar S <selvakuma.s1@samsung.com>

For zoned block device, subscribe to zone-append by setting
FMODE_ZONE_APPEND during open. Make direct IO submission path use
IOCB_ZONE_APPEND to send bio with append op. Make direct IO completion
return zone-relative offset, in sector unit, to upper layer using
kiocb->ki_complete interface.
Return failure if write is larger than max_append_limit and therefore
requires formation of multiple bios.

Signed-off-by: Selvakumar S <selvakuma.s1@samsung.com>
Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
Signed-off-by: Nitesh Shetty <nj.shetty@samsung.com>
Signed-off-by: Arnav Dawn <a.dawn@samsung.com>
Signed-off-by: Javier Gonzalez <javier.gonz@samsung.com>
---
 fs/block_dev.c | 49 ++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 40 insertions(+), 9 deletions(-)

diff --git a/fs/block_dev.c b/fs/block_dev.c
index 47860e5..941fb22 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -178,10 +178,19 @@ static struct inode *bdev_file_inode(struct file *file)
 	return file->f_mapping->host;
 }
 
-static unsigned int dio_bio_write_op(struct kiocb *iocb)
+static unsigned int dio_bio_op(bool is_read, struct kiocb *iocb)
 {
-	unsigned int op = REQ_OP_WRITE | REQ_SYNC | REQ_IDLE;
+	unsigned int op;
 
+	if (is_read)
+		return REQ_OP_READ;
+
+	if (iocb->ki_flags & IOCB_ZONE_APPEND)
+		op = REQ_OP_ZONE_APPEND;
+	else
+		op = REQ_OP_WRITE;
+
+	op |= REQ_SYNC | REQ_IDLE;
 	/* avoid the need for a I/O completion work item */
 	if (iocb->ki_flags & IOCB_DSYNC)
 		op |= REQ_FUA;
@@ -207,6 +216,7 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter,
 	struct bio_vec inline_vecs[DIO_INLINE_BIO_VECS], *vecs;
 	loff_t pos = iocb->ki_pos;
 	bool should_dirty = false;
+	bool is_read = (iov_iter_rw(iter) == READ);
 	struct bio bio;
 	ssize_t ret;
 	blk_qc_t qc;
@@ -231,18 +241,17 @@ __blkdev_direct_IO_simple(struct kiocb *iocb, struct iov_iter *iter,
 	bio.bi_private = current;
 	bio.bi_end_io = blkdev_bio_end_io_simple;
 	bio.bi_ioprio = iocb->ki_ioprio;
+	bio.bi_opf = dio_bio_op(is_read, iocb);
 
 	ret = bio_iov_iter_get_pages(&bio, iter);
 	if (unlikely(ret))
 		goto out;
 	ret = bio.bi_iter.bi_size;
 
-	if (iov_iter_rw(iter) == READ) {
-		bio.bi_opf = REQ_OP_READ;
+	if (is_read) {
 		if (iter_is_iovec(iter))
 			should_dirty = true;
 	} else {
-		bio.bi_opf = dio_bio_write_op(iocb);
 		task_io_account_write(ret);
 	}
 	if (iocb->ki_flags & IOCB_HIPRI)
@@ -295,6 +304,16 @@ static int blkdev_iopoll(struct kiocb *kiocb, bool wait)
 	return blk_poll(q, READ_ONCE(kiocb->ki_cookie), wait);
 }
 
+static inline long blkdev_bio_res2(struct kiocb *iocb, struct bio *bio)
+{
+	/* calculate zone relative offset for zone append */
+	if (op_is_write(bio_op(bio)) && iocb->ki_flags & IOCB_ZONE_APPEND) {
+		sector_t zone_sec = blk_queue_zone_sectors(bio->bi_disk->queue);
+		return bio->bi_iter.bi_sector & (zone_sec - 1);
+	}
+	return 0;
+}
+
 static void blkdev_bio_end_io(struct bio *bio)
 {
 	struct blkdev_dio *dio = bio->bi_private;
@@ -307,15 +326,17 @@ static void blkdev_bio_end_io(struct bio *bio)
 		if (!dio->is_sync) {
 			struct kiocb *iocb = dio->iocb;
 			ssize_t ret;
+			long res2;
 
 			if (likely(!dio->bio.bi_status)) {
 				ret = dio->size;
 				iocb->ki_pos += ret;
+				res2 = blkdev_bio_res2(iocb, bio);
 			} else {
 				ret = blk_status_to_errno(dio->bio.bi_status);
 			}
 
-			dio->iocb->ki_complete(iocb, ret, 0);
+			dio->iocb->ki_complete(iocb, ret, res2);
 			if (dio->multi_bio)
 				bio_put(&dio->bio);
 		} else {
@@ -382,6 +403,7 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages)
 		bio->bi_private = dio;
 		bio->bi_end_io = blkdev_bio_end_io;
 		bio->bi_ioprio = iocb->ki_ioprio;
+		bio->bi_opf = dio_bio_op(is_read, iocb);
 
 		ret = bio_iov_iter_get_pages(bio, iter);
 		if (unlikely(ret)) {
@@ -391,11 +413,9 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages)
 		}
 
 		if (is_read) {
-			bio->bi_opf = REQ_OP_READ;
 			if (dio->should_dirty)
 				bio_set_pages_dirty(bio);
 		} else {
-			bio->bi_opf = dio_bio_write_op(iocb);
 			task_io_account_write(bio->bi_iter.bi_size);
 		}
 
@@ -419,6 +439,12 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages)
 		}
 
 		if (!dio->multi_bio) {
+			/* zone-append cannot work with multi bio*/
+			if (!is_read && iocb->ki_flags & IOCB_ZONE_APPEND) {
+				bio->bi_status = BLK_STS_IOERR;
+				bio_endio(bio);
+				break;
+			}
 			/*
 			 * AIO needs an extra reference to ensure the dio
 			 * structure which is embedded into the first bio
@@ -1841,6 +1867,7 @@ EXPORT_SYMBOL(blkdev_get_by_dev);
 static int blkdev_open(struct inode * inode, struct file * filp)
 {
 	struct block_device *bdev;
+	int ret;
 
 	/*
 	 * Preserve backwards compatibility and allow large file access
@@ -1866,7 +1893,11 @@ static int blkdev_open(struct inode * inode, struct file * filp)
 	filp->f_mapping = bdev->bd_inode->i_mapping;
 	filp->f_wb_err = filemap_sample_wb_err(filp->f_mapping);
 
-	return blkdev_get(bdev, filp->f_mode, filp);
+	ret = blkdev_get(bdev, filp->f_mode, filp);
+	if (blk_queue_is_zoned(bdev->bd_disk->queue))
+		filp->f_mode |= FMODE_ZONE_APPEND;
+
+	return ret;
 }
 
 static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
-- 
2.7.4


  parent reply	other threads:[~2020-07-05 18:52 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <CGME20200705185204epcas5p3adeb4fc3473c5fc0472a7396783c5267@epcas5p3.samsung.com>
2020-07-05 18:47 ` [PATCH v3 0/4] zone-append support in io-uring and aio Kanchan Joshi
     [not found]   ` <CGME20200705185211epcas5p4059d05d2fcedb91829300a7a7d03fda3@epcas5p4.samsung.com>
2020-07-05 18:47     ` [PATCH v3 1/4] fs: introduce FMODE_ZONE_APPEND and IOCB_ZONE_APPEND Kanchan Joshi
     [not found]   ` <CGME20200705185217epcas5p1cc12d4b892f057a1fe06d73a00869daa@epcas5p1.samsung.com>
2020-07-05 18:47     ` Kanchan Joshi [this message]
     [not found]   ` <CGME20200705185221epcas5p28b6d060df829b751109265222285da0e@epcas5p2.samsung.com>
2020-07-05 18:47     ` [PATCH v3 3/4] block: enable zone-append for iov_iter of bvec type Kanchan Joshi
     [not found]   ` <CGME20200705185227epcas5p16fba3cb92561794b960184c89fdf2bb7@epcas5p1.samsung.com>
2020-07-05 18:47     ` [PATCH v3 4/4] io_uring: add support for zone-append Kanchan Joshi
2020-07-05 21:00       ` Jens Axboe
2020-07-05 21:09         ` Matthew Wilcox
2020-07-05 21:12           ` Jens Axboe
2020-07-06 14:10             ` Matthew Wilcox
2020-07-06 14:27               ` Jens Axboe
2020-07-06 14:32                 ` Matthew Wilcox
2020-07-06 14:33                   ` Jens Axboe
2020-07-07 15:11                   ` Kanchan Joshi
2020-07-07 15:52                     ` Matthew Wilcox
2020-07-07 16:00                       ` Christoph Hellwig
2020-07-07 20:23                       ` Kanchan Joshi
2020-07-07 20:40                         ` Jens Axboe
2020-07-07 22:18                           ` Matthew Wilcox
2020-07-07 22:37                             ` Jens Axboe
2020-07-08 12:58                               ` Kanchan Joshi
2020-07-08 14:22                                 ` Matthew Wilcox
2020-07-08 16:41                                   ` Kanchan Joshi
2020-07-08 14:54                                 ` Jens Axboe
2020-07-08 14:58                                   ` Matthew Wilcox
2020-07-08 14:59                                     ` Jens Axboe
2020-07-08 15:02                                       ` Matthew Wilcox
2020-07-08 15:06                                         ` Jens Axboe
2020-07-08 16:08                                           ` Javier González
2020-07-08 16:33                                             ` Matthew Wilcox
2020-07-08 16:38                                               ` Jens Axboe
2020-07-08 17:13                                                 ` Kanchan Joshi
2020-07-08 16:43                                               ` Javier González
2020-07-06 13:58         ` Kanchan Joshi
2020-07-09 10:15         ` Christoph Hellwig
2020-07-09 13:58           ` Jens Axboe
2020-07-09 14:00             ` Christoph Hellwig
2020-07-09 14:05               ` Jens Axboe
2020-07-09 18:36                 ` Kanchan Joshi
2020-07-09 18:50                   ` Pavel Begunkov
2020-07-09 18:53                     ` Pavel Begunkov
2020-07-09 18:50                   ` Jens Axboe
2020-07-09 19:05                     ` Kanchan Joshi
2020-07-10 13:10                       ` Christoph Hellwig
2020-07-10 13:48                         ` Matthew Wilcox
2020-07-10 13:49                           ` Christoph Hellwig
2020-07-10 13:51                             ` Matthew Wilcox
2020-07-10 14:11                               ` Kanchan Joshi
2020-07-20 16:49                                 ` Kanchan Joshi
2020-07-20 17:14                                   ` Matthew Wilcox
2020-07-20 20:17                                     ` Kanchan Joshi
2020-07-21  0:59                                       ` Damien Le Moal
2020-07-21  1:15                                         ` Matthew Wilcox
2020-07-21  1:29                                           ` Jens Axboe
2020-07-21  2:19                                           ` Damien Le Moal
2020-07-10 14:09                         ` Jens Axboe
2020-07-20 16:46                           ` Kanchan Joshi
2020-07-10 13:09                     ` Christoph Hellwig
2020-07-10 13:29                       ` Kanchan Joshi
2020-07-10 13:43                         ` Christoph Hellwig
2020-07-20 17:02                           ` Kanchan Joshi
2020-07-10 13:57                         ` Kanchan Joshi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1593974870-18919-3-git-send-email-joshi.k@samsung.com \
    --to=joshi.k@samsung.com \
    --cc=Damien.LeMoal@wdc.com \
    --cc=a.dawn@samsung.com \
    --cc=asml.silence@gmail.com \
    --cc=axboe@kernel.dk \
    --cc=bcrl@kvack.org \
    --cc=hch@infradead.org \
    --cc=io-uring@vger.kernel.org \
    --cc=javier.gonz@samsung.com \
    --cc=linux-aio@kvack.org \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mb@lightnvm.io \
    --cc=nj.shetty@samsung.com \
    --cc=selvakuma.s1@samsung.com \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.