diff mbox series

pktcdvd: don't set max_hw_sectors on the underlying device

Message ID 20240229144408.1047967-1-hch@lst.de (mailing list archive)
State New, archived
Headers show
Series pktcdvd: don't set max_hw_sectors on the underlying device | expand

Commit Message

Christoph Hellwig Feb. 29, 2024, 2:44 p.m. UTC
pktcdvd sets max_hw_sectors on the queue of the underlying device that
it doesn't own (and doesn't reset it ever) since the driver was merged.
This can create all kinds of problems as the underlying driver doesn't
even know about it changing the limit.

As the state purpose is to not create I/Os larger than a single frame,
and pktcdvd never builds bios larger than that, just set REQ_NOMERGE
on the bios it submits so that largers I/Os never get built.

Note: I don't have packet writing hardware, so this is compile tested
only.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/block/pktcdvd.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

Comments

Jens Axboe March 1, 2024, 4:09 p.m. UTC | #1
On Thu, 29 Feb 2024 06:44:08 -0800, Christoph Hellwig wrote:
> pktcdvd sets max_hw_sectors on the queue of the underlying device that
> it doesn't own (and doesn't reset it ever) since the driver was merged.
> This can create all kinds of problems as the underlying driver doesn't
> even know about it changing the limit.
> 
> As the state purpose is to not create I/Os larger than a single frame,
> and pktcdvd never builds bios larger than that, just set REQ_NOMERGE
> on the bios it submits so that largers I/Os never get built.
> 
> [...]

Applied, thanks!

[1/1] pktcdvd: don't set max_hw_sectors on the underlying device
      commit: eabf5dfc2d6048d8415cd22d38d7d3e0bdb4dff9

Best regards,
diff mbox series

Patch

diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
index 12fcc881b04f54..9071c4ebc1b901 100644
--- a/drivers/block/pktcdvd.c
+++ b/drivers/block/pktcdvd.c
@@ -828,6 +828,12 @@  static noinline_for_stack int pkt_set_speed(struct pktcdvd_device *pd,
  */
 static void pkt_queue_bio(struct pktcdvd_device *pd, struct bio *bio)
 {
+	/*
+	 * Some CDRW drives can not handle writes larger than one packet,
+	 * even if the size is a multiple of the packet size.
+	 */
+	bio->bi_opf |= REQ_NOMERGE;
+
 	spin_lock(&pd->iosched.lock);
 	if (bio_data_dir(bio) == READ)
 		bio_list_add(&pd->iosched.read_queue, bio);
@@ -2191,11 +2197,6 @@  static int pkt_open_dev(struct pktcdvd_device *pd, bool write)
 		ret = pkt_open_write(pd);
 		if (ret)
 			goto out_putdev;
-		/*
-		 * Some CDRW drives can not handle writes larger than one packet,
-		 * even if the size is a multiple of the packet size.
-		 */
-		blk_queue_max_hw_sectors(q, pd->settings.size);
 		set_bit(PACKET_WRITABLE, &pd->flags);
 	} else {
 		pkt_set_speed(pd, MAX_SPEED, MAX_SPEED);