All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sarthak Kukreti <sarthakkukreti@chromium.org>
To: dm-devel@redhat.com, linux-block@vger.kernel.org,
	linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-fsdevel@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Jason Wang <jasowang@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Alasdair Kergon <agk@redhat.com>,
	Mike Snitzer <snitzer@kernel.org>,
	Christoph Hellwig <hch@infradead.org>,
	Brian Foster <bfoster@redhat.com>, Theodore Ts'o <tytso@mit.edu>,
	Andreas Dilger <adilger.kernel@dilger.ca>,
	Bart Van Assche <bvanassche@google.com>,
	"Darrick J. Wong" <djwong@kernel.org>
Subject: [PATCH v6 5/5] loop: Add support for provision requests
Date: Fri,  5 May 2023 23:29:09 -0700	[thread overview]
Message-ID: <20230506062909.74601-6-sarthakkukreti@chromium.org> (raw)
In-Reply-To: <20230506062909.74601-1-sarthakkukreti@chromium.org>

Add support for provision requests to loopback devices.
Loop devices will configure provision support based on
whether the underlying block device/file can support
the provision request and upon receiving a provision bio,
will map it to the backing device/storage. For loop devices
over files, a REQ_OP_PROVISION request will translate to
an fallocate mode 0 call on the backing file.

Signed-off-by: Sarthak Kukreti <sarthakkukreti@chromium.org>
---
 drivers/block/loop.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index bc31bb7072a2..13c4b4f8b9c1 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -327,6 +327,24 @@ static int lo_fallocate(struct loop_device *lo, struct request *rq, loff_t pos,
 	return ret;
 }
 
+static int lo_req_provision(struct loop_device *lo, struct request *rq, loff_t pos)
+{
+	struct file *file = lo->lo_backing_file;
+	struct request_queue *q = lo->lo_queue;
+	int ret;
+
+	if (!q->limits.max_provision_sectors) {
+		ret = -EOPNOTSUPP;
+		goto out;
+	}
+
+	ret = file->f_op->fallocate(file, 0, pos, blk_rq_bytes(rq));
+	if (unlikely(ret && ret != -EINVAL && ret != -EOPNOTSUPP))
+		ret = -EIO;
+ out:
+	return ret;
+}
+
 static int lo_req_flush(struct loop_device *lo, struct request *rq)
 {
 	int ret = vfs_fsync(lo->lo_backing_file, 0);
@@ -488,6 +506,8 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq)
 				FALLOC_FL_PUNCH_HOLE);
 	case REQ_OP_DISCARD:
 		return lo_fallocate(lo, rq, pos, FALLOC_FL_PUNCH_HOLE);
+	case REQ_OP_PROVISION:
+		return lo_req_provision(lo, rq, pos);
 	case REQ_OP_WRITE:
 		if (cmd->use_aio)
 			return lo_rw_aio(lo, cmd, pos, ITER_SOURCE);
@@ -754,6 +774,25 @@ static void loop_sysfs_exit(struct loop_device *lo)
 				   &loop_attribute_group);
 }
 
+static void loop_config_provision(struct loop_device *lo)
+{
+	struct file *file = lo->lo_backing_file;
+	struct inode *inode = file->f_mapping->host;
+
+	/*
+	 * If the backing device is a block device, mirror its provisioning
+	 * capability.
+	 */
+	if (S_ISBLK(inode->i_mode)) {
+		blk_queue_max_provision_sectors(lo->lo_queue,
+			bdev_max_provision_sectors(I_BDEV(inode)));
+	} else if (file->f_op->fallocate) {
+		blk_queue_max_provision_sectors(lo->lo_queue, UINT_MAX >> 9);
+	} else {
+		blk_queue_max_provision_sectors(lo->lo_queue, 0);
+	}
+}
+
 static void loop_config_discard(struct loop_device *lo)
 {
 	struct file *file = lo->lo_backing_file;
@@ -1092,6 +1131,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
 	blk_queue_io_min(lo->lo_queue, bsize);
 
 	loop_config_discard(lo);
+	loop_config_provision(lo);
 	loop_update_rotational(lo);
 	loop_update_dio(lo);
 	loop_sysfs_init(lo);
@@ -1304,6 +1344,7 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
 	}
 
 	loop_config_discard(lo);
+	loop_config_provision(lo);
 
 	/* update dio if lo_offset or transfer is changed */
 	__loop_update_dio(lo, lo->use_dio);
@@ -1830,6 +1871,7 @@ static blk_status_t loop_queue_rq(struct blk_mq_hw_ctx *hctx,
 	case REQ_OP_FLUSH:
 	case REQ_OP_DISCARD:
 	case REQ_OP_WRITE_ZEROES:
+	case REQ_OP_PROVISION:
 		cmd->use_aio = false;
 		break;
 	default:
-- 
2.40.1.521.gf1e218fcd8-goog


WARNING: multiple messages have this Message-ID (diff)
From: Sarthak Kukreti <sarthakkukreti@chromium.org>
To: dm-devel@redhat.com, linux-block@vger.kernel.org,
	linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-fsdevel@vger.kernel.org
Cc: Jens Axboe <axboe@kernel.dk>, Theodore Ts'o <tytso@mit.edu>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"Darrick J. Wong" <djwong@kernel.org>,
	Jason Wang <jasowang@redhat.com>,
	Bart Van Assche <bvanassche@google.com>,
	Mike Snitzer <snitzer@kernel.org>,
	Christoph Hellwig <hch@infradead.org>,
	Andreas Dilger <adilger.kernel@dilger.ca>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Brian Foster <bfoster@redhat.com>,
	Alasdair Kergon <agk@redhat.com>
Subject: [dm-devel] [PATCH v6 5/5] loop: Add support for provision requests
Date: Fri,  5 May 2023 23:29:09 -0700	[thread overview]
Message-ID: <20230506062909.74601-6-sarthakkukreti@chromium.org> (raw)
In-Reply-To: <20230506062909.74601-1-sarthakkukreti@chromium.org>

Add support for provision requests to loopback devices.
Loop devices will configure provision support based on
whether the underlying block device/file can support
the provision request and upon receiving a provision bio,
will map it to the backing device/storage. For loop devices
over files, a REQ_OP_PROVISION request will translate to
an fallocate mode 0 call on the backing file.

Signed-off-by: Sarthak Kukreti <sarthakkukreti@chromium.org>
---
 drivers/block/loop.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index bc31bb7072a2..13c4b4f8b9c1 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -327,6 +327,24 @@ static int lo_fallocate(struct loop_device *lo, struct request *rq, loff_t pos,
 	return ret;
 }
 
+static int lo_req_provision(struct loop_device *lo, struct request *rq, loff_t pos)
+{
+	struct file *file = lo->lo_backing_file;
+	struct request_queue *q = lo->lo_queue;
+	int ret;
+
+	if (!q->limits.max_provision_sectors) {
+		ret = -EOPNOTSUPP;
+		goto out;
+	}
+
+	ret = file->f_op->fallocate(file, 0, pos, blk_rq_bytes(rq));
+	if (unlikely(ret && ret != -EINVAL && ret != -EOPNOTSUPP))
+		ret = -EIO;
+ out:
+	return ret;
+}
+
 static int lo_req_flush(struct loop_device *lo, struct request *rq)
 {
 	int ret = vfs_fsync(lo->lo_backing_file, 0);
@@ -488,6 +506,8 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq)
 				FALLOC_FL_PUNCH_HOLE);
 	case REQ_OP_DISCARD:
 		return lo_fallocate(lo, rq, pos, FALLOC_FL_PUNCH_HOLE);
+	case REQ_OP_PROVISION:
+		return lo_req_provision(lo, rq, pos);
 	case REQ_OP_WRITE:
 		if (cmd->use_aio)
 			return lo_rw_aio(lo, cmd, pos, ITER_SOURCE);
@@ -754,6 +774,25 @@ static void loop_sysfs_exit(struct loop_device *lo)
 				   &loop_attribute_group);
 }
 
+static void loop_config_provision(struct loop_device *lo)
+{
+	struct file *file = lo->lo_backing_file;
+	struct inode *inode = file->f_mapping->host;
+
+	/*
+	 * If the backing device is a block device, mirror its provisioning
+	 * capability.
+	 */
+	if (S_ISBLK(inode->i_mode)) {
+		blk_queue_max_provision_sectors(lo->lo_queue,
+			bdev_max_provision_sectors(I_BDEV(inode)));
+	} else if (file->f_op->fallocate) {
+		blk_queue_max_provision_sectors(lo->lo_queue, UINT_MAX >> 9);
+	} else {
+		blk_queue_max_provision_sectors(lo->lo_queue, 0);
+	}
+}
+
 static void loop_config_discard(struct loop_device *lo)
 {
 	struct file *file = lo->lo_backing_file;
@@ -1092,6 +1131,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
 	blk_queue_io_min(lo->lo_queue, bsize);
 
 	loop_config_discard(lo);
+	loop_config_provision(lo);
 	loop_update_rotational(lo);
 	loop_update_dio(lo);
 	loop_sysfs_init(lo);
@@ -1304,6 +1344,7 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
 	}
 
 	loop_config_discard(lo);
+	loop_config_provision(lo);
 
 	/* update dio if lo_offset or transfer is changed */
 	__loop_update_dio(lo, lo->use_dio);
@@ -1830,6 +1871,7 @@ static blk_status_t loop_queue_rq(struct blk_mq_hw_ctx *hctx,
 	case REQ_OP_FLUSH:
 	case REQ_OP_DISCARD:
 	case REQ_OP_WRITE_ZEROES:
+	case REQ_OP_PROVISION:
 		cmd->use_aio = false;
 		break;
 	default:
-- 
2.40.1.521.gf1e218fcd8-goog

--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


  parent reply	other threads:[~2023-05-06  6:30 UTC|newest]

Thread overview: 117+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20221229071647.437095-1-sarthakkukreti@chromium.org>
2023-04-14  0:02 ` [PATCH v3 0/3] Introduce provisioning primitives for thinly provisioned storage Sarthak Kukreti
2023-04-14  0:02   ` [dm-devel] " Sarthak Kukreti
2023-04-14  0:02   ` [PATCH v3 1/3] block: Introduce provisioning primitives Sarthak Kukreti
2023-04-14  0:02     ` [dm-devel] " Sarthak Kukreti
2023-04-17 17:35     ` Brian Foster
2023-04-17 17:35       ` Brian Foster
2023-04-18 22:13       ` Sarthak Kukreti
2023-04-18 22:13         ` [dm-devel] " Sarthak Kukreti
2023-04-14  0:02   ` [PATCH v3 2/3] dm: Add support for block provisioning Sarthak Kukreti
2023-04-14  0:02     ` [dm-devel] " Sarthak Kukreti
2023-04-14 13:32     ` Joe Thornber
2023-04-14 18:14       ` Mike Snitzer
2023-04-14 18:14         ` [dm-devel] " Mike Snitzer
2023-04-14 21:58     ` Mike Snitzer
2023-04-14 21:58       ` Mike Snitzer
2023-04-18 22:13       ` Sarthak Kukreti
2023-04-18 22:13         ` [dm-devel] " Sarthak Kukreti
2023-04-14  0:02   ` [PATCH v3 3/3] loop: Add support for provision requests Sarthak Kukreti
2023-04-14  0:02     ` [dm-devel] " Sarthak Kukreti
2023-04-18 22:12   ` [PATCH v4 0/4] Introduce provisioning primitives for thinly provisioned storage Sarthak Kukreti
2023-04-18 22:12     ` [dm-devel] " Sarthak Kukreti
2023-04-18 22:12     ` [PATCH v4 1/4] block: Introduce provisioning primitives Sarthak Kukreti
2023-04-18 22:12       ` [dm-devel] " Sarthak Kukreti
2023-04-18 22:43       ` Bart Van Assche
2023-04-18 22:43         ` [dm-devel] " Bart Van Assche
2023-04-20 17:41         ` Sarthak Kukreti
2023-04-20 17:41           ` [dm-devel] " Sarthak Kukreti
2023-04-19 15:36       ` Darrick J. Wong
2023-04-19 15:36         ` Darrick J. Wong
2023-04-19 16:17         ` Mike Snitzer
2023-04-19 16:17           ` [dm-devel] " Mike Snitzer
2023-04-19 17:26           ` Darrick J. Wong
2023-04-19 17:26             ` [dm-devel] " Darrick J. Wong
2023-04-19 23:21             ` Dave Chinner
2023-04-19 23:21               ` [dm-devel] " Dave Chinner
2023-04-20  0:53               ` Sarthak Kukreti
2023-04-20  0:53                 ` [dm-devel] " Sarthak Kukreti
2023-04-18 22:12     ` [PATCH v4 2/4] dm: Add block provisioning support Sarthak Kukreti
2023-04-18 22:12       ` [dm-devel] " Sarthak Kukreti
2023-04-18 22:12     ` [PATCH v4 3/4] dm-thin: Add REQ_OP_PROVISION support Sarthak Kukreti
2023-04-18 22:12       ` [dm-devel] " Sarthak Kukreti
2023-04-18 22:12     ` [PATCH v4 4/4] loop: Add support for provision requests Sarthak Kukreti
2023-04-18 22:12       ` [dm-devel] " Sarthak Kukreti
2023-04-20  0:48   ` [PATCH v5 0/5] Introduce block provisioning primitives Sarthak Kukreti
2023-04-20  0:48     ` [dm-devel] " Sarthak Kukreti
2023-04-20  0:48     ` [PATCH v5 1/5] block: Don't invalidate pagecache for invalid falloc modes Sarthak Kukreti
2023-04-20  0:48       ` [dm-devel] " Sarthak Kukreti
2023-04-20  1:22       ` Darrick J. Wong
2023-04-20  1:22         ` [dm-devel] " Darrick J. Wong
2023-04-20  1:48         ` Sarthak Kukreti
2023-04-20  1:48           ` [dm-devel] " Sarthak Kukreti
2023-04-20  1:47       ` [PATCH v5-fix " Sarthak Kukreti
2023-04-20  1:47         ` [dm-devel] " Sarthak Kukreti
2023-04-20 16:20         ` Mike Snitzer
2023-04-20 16:20           ` [dm-devel] " Mike Snitzer
2023-04-20 17:28           ` Sarthak Kukreti
2023-04-20 17:28             ` [dm-devel] " Sarthak Kukreti
2023-04-20 18:17             ` Sarthak Kukreti
2023-04-20 18:17               ` [dm-devel] " Sarthak Kukreti
2023-04-20 18:15           ` Sarthak Kukreti
2023-04-20 18:15             ` [dm-devel] " Sarthak Kukreti
2023-04-24 15:54       ` [PATCH v5 " kernel test robot
2023-04-24 15:54         ` [dm-devel] " kernel test robot
2023-05-04  8:50       ` kernel test robot
2023-05-04  8:50         ` [dm-devel] " kernel test robot
2023-04-20  0:48     ` [PATCH v5 2/5] block: Introduce provisioning primitives Sarthak Kukreti
2023-04-20  0:48       ` [dm-devel] " Sarthak Kukreti
2023-04-20  0:48     ` [PATCH v5 3/5] dm: Add block provisioning support Sarthak Kukreti
2023-04-20  0:48       ` [dm-devel] " Sarthak Kukreti
2023-04-20  0:48     ` [PATCH v5 4/5] dm-thin: Add REQ_OP_PROVISION support Sarthak Kukreti
2023-04-20  0:48       ` [dm-devel] " Sarthak Kukreti
2023-05-01 19:15       ` Mike Snitzer
2023-05-01 19:15         ` [dm-devel] " Mike Snitzer
2023-05-06  6:32         ` Sarthak Kukreti
2023-05-06  6:32           ` [dm-devel] " Sarthak Kukreti
2023-04-20  0:48     ` [PATCH v5 5/5] loop: Add support for provision requests Sarthak Kukreti
2023-04-20  0:48       ` [dm-devel] " Sarthak Kukreti
2023-05-06  6:29     ` [PATCH v6 0/5] Introduce block provisioning primitives Sarthak Kukreti
2023-05-06  6:29       ` [dm-devel] " Sarthak Kukreti
2023-05-06  6:29       ` [PATCH v6 1/5] block: Don't invalidate pagecache for invalid falloc modes Sarthak Kukreti
2023-05-06  6:29         ` [dm-devel] " Sarthak Kukreti
2023-05-09 16:51         ` Mike Snitzer
2023-05-09 16:51           ` [dm-devel] " Mike Snitzer
2023-05-12 18:31         ` Darrick J. Wong
2023-05-12 18:31           ` Darrick J. Wong
2023-05-06  6:29       ` [PATCH v6 2/5] block: Introduce provisioning primitives Sarthak Kukreti
2023-05-06  6:29         ` [dm-devel] " Sarthak Kukreti
2023-05-09 16:52         ` Mike Snitzer
2023-05-09 16:52           ` Mike Snitzer
2023-05-12 18:37         ` Darrick J. Wong
2023-05-12 18:37           ` [dm-devel] " Darrick J. Wong
2023-05-15 21:55           ` Sarthak Kukreti
2023-05-15 21:55             ` [dm-devel] " Sarthak Kukreti
2023-05-06  6:29       ` [PATCH v6 3/5] dm: Add block provisioning support Sarthak Kukreti
2023-05-06  6:29         ` [dm-devel] " Sarthak Kukreti
2023-05-09 16:52         ` Mike Snitzer
2023-05-09 16:52           ` [dm-devel] " Mike Snitzer
2023-05-06  6:29       ` [PATCH v6 4/5] dm-thin: Add REQ_OP_PROVISION support Sarthak Kukreti
2023-05-06  6:29         ` [dm-devel] " Sarthak Kukreti
2023-05-09 16:58         ` Mike Snitzer
2023-05-09 16:58           ` Mike Snitzer
2023-05-11 20:03           ` Sarthak Kukreti
2023-05-11 20:03             ` [dm-devel] " Sarthak Kukreti
2023-05-12 14:34             ` Mike Snitzer
2023-05-12 14:34               ` Mike Snitzer
2023-05-12 17:32         ` [dm-devel] " Mike Snitzer
2023-05-12 17:32           ` Mike Snitzer
2023-05-15 21:19           ` Sarthak Kukreti
2023-05-15 21:19             ` [dm-devel] " Sarthak Kukreti
2023-05-06  6:29       ` Sarthak Kukreti [this message]
2023-05-06  6:29         ` [dm-devel] [PATCH v6 5/5] loop: Add support for provision requests Sarthak Kukreti
2023-05-15 12:40         ` Brian Foster
2023-05-15 12:40           ` Brian Foster
2023-05-15 21:31           ` Sarthak Kukreti
2023-05-15 21:31             ` [dm-devel] " Sarthak Kukreti
2023-05-12 18:28       ` [dm-devel] [PATCH v6 0/5] Introduce block provisioning primitives Darrick J. Wong
2023-05-12 18:28         ` Darrick J. Wong

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=20230506062909.74601-6-sarthakkukreti@chromium.org \
    --to=sarthakkukreti@chromium.org \
    --cc=adilger.kernel@dilger.ca \
    --cc=agk@redhat.com \
    --cc=axboe@kernel.dk \
    --cc=bfoster@redhat.com \
    --cc=bvanassche@google.com \
    --cc=djwong@kernel.org \
    --cc=dm-devel@redhat.com \
    --cc=hch@infradead.org \
    --cc=jasowang@redhat.com \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=snitzer@kernel.org \
    --cc=stefanha@redhat.com \
    --cc=tytso@mit.edu \
    /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.