]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scsi: target: Add helper to set up atomic values from block_device
authorMike Christie <michael.christie@oracle.com>
Mon, 20 Oct 2025 10:38:16 +0000 (10:38 +0000)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 3 Nov 2025 02:40:01 +0000 (21:40 -0500)
Add a helper function that sets up the atomic value based on a
block_device similar to what we do for unmap.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
jpg: Set atomic alignment, drop atomic_supported reference
Signed-off-by: John Garry <john.g.garry@oracle.com>
Link: https://patch.msgid.link/20251020103820.2917593-4-john.g.garry@oracle.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/target/target_core_device.c
include/target/target_core_backend.h

index 83fe3d9a9681cd9821203c710709a6896f559053..39a2d9c3eb9e109e16cef651e8f40b4fcee552c7 100644 (file)
@@ -840,6 +840,23 @@ free_device:
        return NULL;
 }
 
+void target_configure_write_atomic_from_bdev(struct se_dev_attrib *attrib,
+                                            struct block_device *bdev)
+{
+       struct request_queue *q = bdev_get_queue(bdev);
+       int block_size = bdev_logical_block_size(bdev);
+
+       if (!bdev_can_atomic_write(bdev))
+               return;
+
+       attrib->atomic_max_len = queue_atomic_write_max_bytes(q) / block_size;
+       attrib->atomic_granularity = attrib->atomic_alignment =
+               queue_atomic_write_unit_min_bytes(q) / block_size;
+       attrib->atomic_max_with_boundary = 0;
+       attrib->atomic_max_boundary = 0;
+}
+EXPORT_SYMBOL_GPL(target_configure_write_atomic_from_bdev);
+
 /*
  * Check if the underlying struct block_device supports discard and if yes
  * configure the UNMAP parameters.
index d394306f8f490035ea382efc5375c5e52dad717c..e32de80854b6ab6108f470b273f457d06dd7b4a0 100644 (file)
@@ -123,6 +123,8 @@ bool target_sense_desc_format(struct se_device *dev);
 sector_t target_to_linux_sector(struct se_device *dev, sector_t lb);
 bool target_configure_unmap_from_bdev(struct se_dev_attrib *attrib,
                                      struct block_device *bdev);
+void target_configure_write_atomic_from_bdev(struct se_dev_attrib *attrib,
+                                            struct block_device *bdev);
 
 static inline bool target_dev_configured(struct se_device *se_dev)
 {