All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 2/2] dm-crypt: enable DM_TARGET_ATOMIC_WRITES
@ 2025-11-05 15:02 Mikulas Patocka
  2025-11-06  2:04 ` Benjamin Marzinski
  2025-11-10 16:02 ` John Garry
  0 siblings, 2 replies; 13+ messages in thread
From: Mikulas Patocka @ 2025-11-05 15:02 UTC (permalink / raw)
  To: John Garry, agk, snitzer, dm-devel, michael.christie,
	martin.petersen

Allow handling of bios with REQ_ATOMIC flag set.

Don't split these bios and fail them if they overrun the hard limit
"BIO_MAX_VECS << PAGE_SHIFT".

This commit joins the logic that avoids splitting emulated zone append
bios with atomic write bios.

Signed-off-by: John Garry <john.g.garry@oracle.com>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>

---
 drivers/md/dm-crypt.c |   39 ++++++++++++++++++++++++---------------
 1 file changed, 24 insertions(+), 15 deletions(-)

Index: linux-2.6/drivers/md/dm-crypt.c
===================================================================
--- linux-2.6.orig/drivers/md/dm-crypt.c	2025-11-05 14:50:28.000000000 +0100
+++ linux-2.6/drivers/md/dm-crypt.c	2025-11-05 14:50:28.000000000 +0100
@@ -254,22 +254,15 @@ static unsigned int max_write_size = 0;
 module_param(max_write_size, uint, 0644);
 MODULE_PARM_DESC(max_write_size, "Maximum size of a write request");
 
-static unsigned get_max_request_sectors(struct dm_target *ti, struct bio *bio)
+static unsigned get_max_request_sectors(struct dm_target *ti, struct bio *bio, bool no_split)
 {
 	struct crypt_config *cc = ti->private;
 	unsigned val, sector_align;
 	bool wrt = op_is_write(bio_op(bio));
 
-	if (wrt) {
-		/*
-		 * For zoned devices, splitting write operations creates the
-		 * risk of deadlocking queue freeze operations with zone write
-		 * plugging BIO work when the reminder of a split BIO is
-		 * issued. So always allow the entire BIO to proceed.
-		 */
-		if (ti->emulate_zone_append)
-			return bio_sectors(bio);
-
+	if (no_split) {
+		val = -1;
+	} else if (wrt) {
 		val = min_not_zero(READ_ONCE(max_write_size),
 				   DM_CRYPT_DEFAULT_MAX_WRITE_SIZE);
 	} else {
@@ -3496,6 +3489,7 @@ static int crypt_map(struct dm_target *t
 	struct dm_crypt_io *io;
 	struct crypt_config *cc = ti->private;
 	unsigned max_sectors;
+	bool no_split;
 
 	/*
 	 * If bio is REQ_PREFLUSH or REQ_OP_DISCARD, just bypass crypt queues.
@@ -3513,10 +3507,20 @@ static int crypt_map(struct dm_target *t
 
 	/*
 	 * Check if bio is too large, split as needed.
-	 */
-	max_sectors = get_max_request_sectors(ti, bio);
-	if (unlikely(bio_sectors(bio) > max_sectors))
+	 *
+	 * For zoned devices, splitting write operations creates the
+	 * risk of deadlocking queue freeze operations with zone write
+	 * plugging BIO work when the reminder of a split BIO is
+	 * issued. So always allow the entire BIO to proceed.
+	 */
+	no_split = (ti->emulate_zone_append && op_is_write(bio_op(bio))) ||
+		   (bio->bi_opf & REQ_ATOMIC);
+	max_sectors = get_max_request_sectors(ti, bio, no_split);
+	if (unlikely(bio_sectors(bio) > max_sectors)) {
+		if (unlikely(no_split))
+			return DM_MAPIO_KILL;
 		dm_accept_partial_bio(bio, max_sectors);
+	}
 
 	/*
 	 * Ensure that bio is a multiple of internal sector encryption size
@@ -3762,6 +3766,11 @@ static void crypt_io_hints(struct dm_tar
 	if (ti->emulate_zone_append)
 		limits->max_hw_sectors = min(limits->max_hw_sectors,
 					     BIO_MAX_VECS << PAGE_SECTORS_SHIFT);
+
+	limits->atomic_write_hw_unit_max = min(limits->atomic_write_hw_unit_max,
+					       BIO_MAX_VECS << PAGE_SHIFT);
+	limits->atomic_write_hw_max = min(limits->atomic_write_hw_max,
+					  BIO_MAX_VECS << PAGE_SHIFT);
 }
 
 static struct target_type crypt_target = {
@@ -3770,7 +3779,7 @@ static struct target_type crypt_target =
 	.module = THIS_MODULE,
 	.ctr    = crypt_ctr,
 	.dtr    = crypt_dtr,
-	.features = DM_TARGET_ZONED_HM,
+	.features = DM_TARGET_ZONED_HM | DM_TARGET_ATOMIC_WRITES,
 	.report_zones = crypt_report_zones,
 	.map    = crypt_map,
 	.status = crypt_status,


^ permalink raw reply	[flat|nested] 13+ messages in thread
* [PATCH 0/2] dm-crypt atomic writes support
@ 2025-11-05 12:02 John Garry
  2025-11-05 12:02 ` [PATCH 2/2] dm-crypt: enable DM_TARGET_ATOMIC_WRITES John Garry
  0 siblings, 1 reply; 13+ messages in thread
From: John Garry @ 2025-11-05 12:02 UTC (permalink / raw)
  To: agk, snitzer, mpatocka
  Cc: dm-devel, michael.christie, martin.petersen, John Garry

This small series enables atomic writes support for dm-crypt.

Apart from setting DM_TARGET_ATOMIC_WRITES flag, we need to make the
following changes:
- limit atomic write size to dm-crypt max write size
- BUG_ON() any partial completions for when REQ_ATOMIC is set

John Garry (2):
  dm: BUG on REQ_ATOMIC in dm_accept_partial_bio()
  dm-crypt: enable DM_TARGET_ATOMIC_WRITES

 drivers/md/dm-crypt.c | 21 +++++++++++++++++++--
 drivers/md/dm.c       |  5 +++--
 2 files changed, 22 insertions(+), 4 deletions(-)

-- 
2.43.5


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2025-11-18 18:42 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-05 15:02 [PATCH 2/2] dm-crypt: enable DM_TARGET_ATOMIC_WRITES Mikulas Patocka
2025-11-06  2:04 ` Benjamin Marzinski
2025-11-06  9:21   ` John Garry
2025-11-06 12:06   ` Mikulas Patocka
2025-11-06 12:17     ` John Garry
2025-11-06 14:00       ` Mikulas Patocka
2025-11-06 14:12         ` John Garry
2025-11-10 16:02 ` John Garry
2025-11-18 17:00   ` John Garry
2025-11-18 17:09     ` Mikulas Patocka
2025-11-18 17:22       ` John Garry
2025-11-18 18:42         ` Mikulas Patocka
  -- strict thread matches above, loose matches on Subject: below --
2025-11-05 12:02 [PATCH 0/2] dm-crypt atomic writes support John Garry
2025-11-05 12:02 ` [PATCH 2/2] dm-crypt: enable DM_TARGET_ATOMIC_WRITES John Garry

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.