linux/drivers/scsi
John Garry bf4ae8f2e6 scsi: sd: Atomic write support
Support is divided into two main areas:
- reading VPD pages and setting sdev request_queue limits
- support WRITE ATOMIC (16) command and tracing

The relevant block limits VPD page need to be read to allow the block layer
request_queue atomic write limits to be set. These VPD page limits are
described in sbc4r22 section 6.6.4 - Block limits VPD page.

There are five limits of interest:
- MAXIMUM ATOMIC TRANSFER LENGTH
- ATOMIC ALIGNMENT
- ATOMIC TRANSFER LENGTH GRANULARITY
- MAXIMUM ATOMIC TRANSFER LENGTH WITH BOUNDARY
- MAXIMUM ATOMIC BOUNDARY SIZE

MAXIMUM ATOMIC TRANSFER LENGTH is the maximum length for a WRITE ATOMIC
(16) command. It will not be greater than the device MAXIMUM TRANSFER
LENGTH.

ATOMIC ALIGNMENT and ATOMIC TRANSFER LENGTH GRANULARITY are the minimum
alignment and length values for an atomic write in terms of logical blocks.

Unlike NVMe, SCSI does not specify an LBA space boundary, but does specify
a per-IO boundary granularity. The maximum boundary size is specified in
MAXIMUM ATOMIC BOUNDARY SIZE. When used, this boundary value is set in the
WRITE ATOMIC (16) ATOMIC BOUNDARY field - layout for the WRITE_ATOMIC_16
command can be found in sbc4r22 section 5.48. This boundary value is the
granularity size at which the device may atomically write the data. A value
of zero in WRITE ATOMIC (16) ATOMIC BOUNDARY field means that all data must
be atomically written together.

MAXIMUM ATOMIC TRANSFER LENGTH WITH BOUNDARY is the maximum atomic write
length if a non-zero boundary value is set.

For atomic write support, the WRITE ATOMIC (16) boundary is not of much
interest, as the block layer expects each request submitted to be executed
atomically. However, the SCSI spec does leave itself open to a quirky
scenario where MAXIMUM ATOMIC TRANSFER LENGTH is zero, yet MAXIMUM ATOMIC
TRANSFER LENGTH WITH BOUNDARY and MAXIMUM ATOMIC BOUNDARY SIZE are both
non-zero. This case will be supported.

To set the block layer request_queue atomic write capabilities, sanitize
the VPD page limits and set limits as follows:
- atomic_write_unit_min is derived from granularity and alignment values.
  If no granularity value is not set, use physical block size
- atomic_write_unit_max is derived from MAXIMUM ATOMIC TRANSFER LENGTH. In
  the scenario where MAXIMUM ATOMIC TRANSFER LENGTH is zero and boundary
  limits are non-zero, use MAXIMUM ATOMIC BOUNDARY SIZE for
  atomic_write_unit_max. New flag scsi_disk.use_atomic_write_boundary is
  set for this scenario.
- atomic_write_boundary_bytes is set to zero always

SCSI also supports a WRITE ATOMIC (32) command, which is for type 2
protection enabled. This is not going to be supported now, so check for
T10_PI_TYPE2_PROTECTION when setting any request_queue limits.

To handle an atomic write request, add support for WRITE ATOMIC (16)
command in handler sd_setup_atomic_cmnd(). Flag use_atomic_write_boundary
is checked here for encoding ATOMIC BOUNDARY field.

Trace info is also added for WRITE_ATOMIC_16 command.

Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: John Garry <john.g.garry@oracle.com>
Acked-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Link: https://lore.kernel.org/r/20240620125359.2684798-9-john.g.garry@oracle.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2024-06-20 15:19:17 -06:00
..
aacraid scsi: aacraid: aachba: Replace snprintf() with the safer scnprintf() variant 2024-01-29 20:34:52 -05:00
aic7xxx Kbuild updates for v6.10 2024-05-18 12:39:20 -07:00
aic94xx Merge patch series "Add LIBSAS_SHT_BASE for libsas" 2024-03-25 16:09:36 -04:00
arcmsr scsi: arcmsr: Use PCI_IRQ_INTX instead of PCI_IRQ_LEGACY 2024-05-16 14:35:08 -05:00
arm scsi: powertec: Declare SCSI host template const 2023-03-24 19:19:21 -04:00
be2iscsi scsi: be2iscsi: Fix a memleak in beiscsi_init_wrb_handle() 2023-12-05 20:38:26 -05:00
bfa Driver core changes for 6.10-rc1 2024-05-22 12:13:40 -07:00
bnx2fc SCSI misc on 20240514 2024-05-14 18:25:53 -07:00
bnx2i scsi: bnx2i: Replace all non-returning strlcpy with strscpy 2023-05-26 13:52:19 -07:00
csiostor scsi: csiostor: Drop driver owner assignment 2024-04-05 20:52:49 -04:00
cxgbi scsi: cxgbi: Fix 'generated' typo 2023-10-13 14:15:54 -04:00
cxlflash scsi: cxlflash: Fix function pointer cast warnings 2024-04-08 15:08:52 -04:00
device_handler scsi: core: alua: I/O errors for ALUA state transitions 2024-05-15 09:46:13 -04:00
elx scsi: elx: libefc: Replace deprecated strncpy() with strscpy_pad()/memcpy() 2023-11-15 09:46:03 -05:00
esas2r scsi: esas2r: Use FIELD_GET() to extract PCIe capability fields 2023-09-13 21:01:59 -04:00
fcoe SCSI misc on 20240316 2024-03-16 16:31:12 -07:00
fnic SCSI misc on 20240316 2024-03-16 16:31:12 -07:00
hisi_sas SCSI misc on 20240514 2024-05-14 18:25:53 -07:00
ibmvscsi scsi: scsi_transport_fc: Add a max_bsg_segments field to struct fc_function_template 2024-04-11 21:37:48 -04:00
ibmvscsi_tgt scsi: Use device_show_string() helper for sysfs attributes 2024-05-04 17:37:04 +02:00
isci Merge patch series "Add LIBSAS_SHT_BASE for libsas" 2024-03-25 16:09:36 -04:00
libfc scsi: libfc: replace deprecated strncpy() with memcpy() 2024-02-26 21:21:23 -05:00
libsas SCSI misc on 20240514 2024-05-14 18:25:53 -07:00
lpfc Merge patch series "Update lpfc to revision 14.4.0.2" 2024-05-06 21:56:00 -04:00
megaraid pci-v6.10-changes 2024-05-21 10:09:28 -07:00
mpi3mr Merge branch '6.10/scsi-queue' into 6.10/scsi-fixes 2024-05-28 21:29:03 -04:00
mpt3sas SCSI fixes on 20240606 2024-06-06 14:40:51 -07:00
mvsas Driver core changes for 6.10-rc1 2024-05-22 12:13:40 -07:00
pcmcia scsi: Add HAS_IOPORT dependencies 2023-05-31 19:59:26 -04:00
pm8001 Merge patch series "Add LIBSAS_SHT_BASE for libsas" 2024-03-25 16:09:36 -04:00
qedf scsi: qedf: Set qed_slowpath_params to zero before use 2024-05-15 10:26:53 -04:00
qedi scsi: qedi: Fix crash while reading debugfs attribute 2024-04-24 21:09:08 -04:00
qla2xxx Driver core changes for 6.10-rc1 2024-05-22 12:13:40 -07:00
qla4xxx scsi: qla4xxx: Replace deprecated strncpy() with strscpy() 2024-03-10 18:37:43 -04:00
smartpqi Driver core changes for 6.10-rc1 2024-05-22 12:13:40 -07:00
snic scsi: snic: Convert sprintf() family to sysfs_emit() family 2024-04-08 22:04:32 -04:00
sym53c8xx_2 scsi: sym53c8xx_2: Rework reset handling 2023-10-13 14:23:15 -04:00
.gitignore
3w-9xxx.c scsi: 3w-9xxx: Remove snprintf() from sysfs call-backs and replace with sysfs_emit() 2024-01-29 20:34:52 -05:00
3w-9xxx.h
3w-sas.c scsi: 3w-sas: Remove snprintf() from sysfs call-backs and replace with sysfs_emit() 2024-01-29 20:34:52 -05:00
3w-sas.h scsi: 3w-sas: Replace 1-element arrays with flexible array members 2023-01-12 00:09:52 -05:00
3w-xxxx.c scsi: 3w-xxxx: Remove snprintf() from sysfs call-backs and replace with sysfs_emit() 2024-01-29 20:34:52 -05:00
3w-xxxx.h
53c700_d.h_shipped
53c700.c scsi: 53c700: Remove snprintf() from sysfs call-backs and replace with sysfs_emit() 2024-01-29 20:34:52 -05:00
53c700.h
53c700.scr
a100u2w.c scsi: a100u2w: Declare SCSI host template const 2023-03-24 19:19:20 -04:00
a100u2w.h
a2091.c scsi: a2091: Declare SCSI host template const 2023-03-24 19:19:20 -04:00
a2091.h
a3000.c scsi: a3000: Mark driver struct with __refdata to prevent section mismatch 2024-04-05 21:11:44 -04:00
a3000.h
a4000t.c scsi: a4000t: Mark driver struct with __refdata to prevent section mismatch 2024-04-05 21:11:44 -04:00
advansys.c scsi: advansys: Declare SCSI host template const 2023-03-24 19:19:20 -04:00
aha152x.c scsi: core: Add a no_highmem flag to struct Scsi_Host 2024-04-11 21:37:48 -04:00
aha152x.h
aha1542.c scsi: aha1542: Declare SCSI host template const 2023-03-24 19:19:21 -04:00
aha1542.h
aha1740.c scsi: aha1740: Declare SCSI host template const 2023-03-24 19:19:21 -04:00
aha1740.h
am53c974.c scsi: esp_scsi: Declare SCSI host template const 2023-03-24 19:19:22 -04:00
atari_scsi.c scsi: atari_scsi: Mark driver struct with __refdata to prevent section mismatch 2024-04-05 21:11:44 -04:00
atp870u.c scsi: atp870u: Declare SCSI host template const 2023-03-24 19:19:21 -04:00
atp870u.h
BusLogic.c scsi: BusLogic: Declare SCSI host template const 2023-03-24 19:19:20 -04:00
BusLogic.h
bvme6000_scsi.c scsi: bvme6000: Convert to platform remove callback returning void 2023-12-05 21:51:36 -05:00
ch.c scsi: ch: Make ch_sysfs_class constant 2024-03-10 18:15:48 -04:00
constants.c
dc395x.c scsi: dc395x: Fix warning using plain integer as NULL 2023-11-24 21:08:23 -05:00
dc395x.h
dmx3191d.c scsi: dmx3191d: Declare SCSI host template const 2023-03-24 19:19:22 -04:00
esp_scsi.c Normalise "name (ad@dr)" MODULE_AUTHORs to "name <ad@dr>" 2024-03-06 13:07:39 -08:00
esp_scsi.h scsi: esp_scsi: Declare SCSI host template const 2023-03-24 19:19:22 -04:00
fdomain_isa.c
fdomain_pci.c
fdomain.c scsi: fdomain: Declare SCSI host template const 2023-03-24 19:19:22 -04:00
fdomain.h
FlashPoint.c scsi: FlashPoint: Remove redundant assignment to pointer currTar_Info 2024-04-08 22:01:19 -04:00
g_NCR5380.c scsi: NCR5380: Declare SCSI host template const 2023-03-24 19:19:22 -04:00
gvp11.c scsi: gvp11: Remove unused gvp11_setup() function 2023-08-21 16:37:11 -04:00
gvp11.h
hosts.c SCSI misc on 20240514 2024-05-14 18:25:53 -07:00
hpsa_cmd.h
hpsa.c pci-v6.10-changes 2024-05-21 10:09:28 -07:00
hpsa.h
hptiop.c scsi: hptiop: Switch to using ->device_configure 2024-04-11 21:37:49 -04:00
hptiop.h
imm.c scsi: core: Add a no_highmem flag to struct Scsi_Host 2024-04-11 21:37:48 -04:00
imm.h scsi: imm: Add a module parameter for the transfer mode 2023-09-13 21:11:55 -04:00
initio.c scsi: initio: Remove redundant variable 'rb' 2024-01-17 14:49:05 -05:00
initio.h
ipr.c pci-v6.10-changes 2024-05-21 10:09:28 -07:00
ipr.h scsi: ipr: Remove SATA support 2023-04-18 23:01:23 -04:00
ips.c scsi: ips: Do not try to abort command from host reset 2023-10-13 14:23:15 -04:00
ips.h
iscsi_boot_sysfs.c
iscsi_tcp.c block: move the stable_writes flag to queue_limits 2024-06-19 07:58:28 -06:00
iscsi_tcp.h scsi: iscsi_tcp: Use sendmsg(MSG_SPLICE_PAGES) rather than sendpage 2023-06-24 15:50:13 -07:00
jazz_esp.c Normalise "name (ad@dr)" MODULE_AUTHORs to "name <ad@dr>" 2024-03-06 13:07:39 -08:00
Kconfig block: remove the blk_integrity_profile structure 2024-06-14 10:20:06 -06:00
lasi700.c
libiscsi_tcp.c
libiscsi.c scsi: iscsi: Declare SCSI host template const 2023-03-24 19:19:57 -04:00
mac53c94.c powerpc/macio: Make remove callback of macio driver void returned 2024-03-07 23:06:19 +11:00
mac53c94.h
mac_esp.c scsi: mac_esp: Convert to platform remove callback returning void 2023-12-05 21:51:37 -05:00
mac_scsi.c scsi: mac_scsi: Mark driver struct with __refdata to prevent section mismatch 2024-04-05 21:11:44 -04:00
Makefile scsi: scsi_proto: Add structures and constants related to I/O groups and streams 2024-02-26 21:37:26 -05:00
megaraid.c scsi: megaraid: Remove redundant assignment to variable 'retval' 2024-01-23 21:38:18 -05:00
megaraid.h
mesh.c powerpc updates for 6.9 2024-03-15 17:53:48 -07:00
mesh.h
mvme16x_scsi.c scsi: mvme16x: Convert to platform remove callback returning void 2023-12-05 21:51:37 -05:00
mvme147.c scsi: mvme147: Declare SCSI host template const 2023-03-24 19:19:57 -04:00
mvme147.h
mvumi.c scsi: core: Improve type safety of scsi_rescan_device() 2023-08-24 22:11:29 -04:00
mvumi.h scsi: mvumi: Replace 1-element arrays with flexible array members 2023-01-12 00:11:11 -05:00
myrb.c scsi: mylex: Fix sysfs buffer lengths 2024-04-01 21:08:48 -04:00
myrb.h
myrs.c scsi: mylex: Fix sysfs buffer lengths 2024-04-01 21:08:48 -04:00
myrs.h
ncr53c8xx.c scsi: ncr53c8xx: Replace strlcpy() with strscpy() 2023-06-21 21:13:00 -04:00
ncr53c8xx.h
NCR5380.c scsi: NCR5380: Use default @max_active for hostdata->work_q 2023-05-22 15:13:03 -10:00
NCR5380.h
nsp32_debug.c
nsp32_io.h
nsp32.c scsi: nsp32: Declare SCSI host template const 2023-03-24 19:19:58 -04:00
nsp32.h
pmcraid.c pci-v6.10-changes 2024-05-21 10:09:28 -07:00
pmcraid.h
ppa.c scsi: core: Add a no_highmem flag to struct Scsi_Host 2024-04-11 21:37:48 -04:00
ppa.h scsi: ppa: Add a module parameter for the transfer mode 2023-08-21 16:32:40 -04:00
ps3rom.c scsi: ps3rom: Declare SCSI host template const 2023-03-24 19:19:58 -04:00
qla1280.c scsi: qla1280: Remove redundant assignment to variable 'mr' 2024-02-15 15:09:09 -05:00
qla1280.h
qlogicfas408.c
qlogicfas408.h
qlogicfas.c
qlogicpti.c Normalise "name (ad@dr)" MODULE_AUTHORs to "name <ad@dr>" 2024-03-06 13:07:39 -08:00
qlogicpti.h
raid_class.c scsi: core: raid_class: Remove raid_component_add() 2023-08-24 21:34:28 -04:00
script_asm.pl
scsi_bsg.c scsi: replace the fmode_t argument to ->sg_io_fn with a simple bool 2023-06-12 08:04:04 -06:00
scsi_common.c scsi: core: Use min() instead of open-coding it 2023-05-31 11:05:34 -04:00
scsi_debug.c SCSI misc on 20240322 2024-03-22 13:31:07 -07:00
scsi_debugfs.c scsi: core: Improve the code for showing commands in debugfs 2024-04-08 22:12:33 -04:00
scsi_debugfs.h
scsi_devinfo.c scsi: devinfo: Replace strncpy() and manual pad 2024-03-10 18:37:43 -04:00
scsi_dh.c
scsi_error.c scsi: core: Move scsi_host_busy() out of host lock if it is for per-command 2024-02-05 16:15:20 -05:00
scsi_ioctl.c scsi: replace the fmode_t argument to scsi_ioctl with a simple bool 2023-06-12 08:04:04 -06:00
scsi_lib_dma.c
scsi_lib_test.c scsi: core: Add kunit tests for scsi_check_passthrough() 2024-01-29 21:20:55 -05:00
scsi_lib.c block: move the bounce flag into the features field 2024-06-19 07:58:28 -06:00
scsi_logging.c
scsi_logging.h
scsi_netlink.c
scsi_pm.c
scsi_priv.h SCSI misc on 20240316 2024-03-16 16:31:12 -07:00
scsi_proc.c scsi: core: Fix legacy /proc parsing buffer overflow 2023-07-31 15:39:39 -04:00
scsi_proto_test.c scsi: scsi_proto: Add structures and constants related to I/O groups and streams 2024-02-26 21:37:26 -05:00
scsi_sas_internal.h
scsi_scan.c SCSI misc on 20240514 2024-05-14 18:25:53 -07:00
scsi_sysctl.c scsi: Remove now superfluous sentinel element from ctl_table array 2023-10-11 12:16:13 -07:00
scsi_sysfs.c scsi: core: Store owner from modules with scsi_register_driver() 2024-04-05 20:58:25 -04:00
scsi_trace.c scsi: sd: Atomic write support 2024-06-20 15:19:17 -06:00
scsi_transport_api.h
scsi_transport_fc.c scsi: scsi_transport_fc: Add a max_bsg_segments field to struct fc_function_template 2024-04-11 21:37:48 -04:00
scsi_transport_iscsi.c scsi: iscsi: Remove unused list 'connlist_err' 2024-05-06 21:39:32 -04:00
scsi_transport_sas.c scsi: bsg: Pass queue_limits to bsg_setup_queue() 2024-04-11 21:37:48 -04:00
scsi_transport_spi.c scsi: spi: Have midlayer retry spi_execute() UAs 2024-01-29 21:20:53 -05:00
scsi_transport_srp.c scsi: core: Replace scsi_target_block() with scsi_block_targets() 2023-06-16 12:19:59 -04:00
scsi.c scsi: core: Handle devices which return an unusually large VPD page count 2024-05-23 20:35:32 -04:00
scsicam.c use ->bd_mapping instead of ->bd_inode->i_mapping 2024-05-03 02:36:51 -04:00
sd_dif.c block: move integrity information into queue_limits 2024-06-14 10:20:07 -06:00
sd_trace.h scsi: sd: sd_zbc: Trace zone append emulation 2022-12-01 03:13:55 +00:00
sd_zbc.c block: move the zone_resetall flag to queue_limits 2024-06-19 07:58:28 -06:00
sd.c scsi: sd: Atomic write support 2024-06-20 15:19:17 -06:00
sd.h scsi: sd: Atomic write support 2024-06-20 15:19:17 -06:00
sense_codes.h
ses.c scsi: ses: Drop driver owner initialization 2024-04-05 20:58:25 -04:00
sg.c scsi: sg: Avoid race in error handling & drop bogus warn 2024-04-04 18:22:12 -04:00
sgiwd93.c scsi: sgiwd93: Convert to platform remove callback returning void 2023-12-05 21:51:37 -05:00
sim710.c
sni_53c710.c scsi: sni_53c710: Convert to platform remove callback returning void 2023-12-05 21:51:37 -05:00
sr_ioctl.c scsi: sr: Fix unintentional arithmetic wraparound 2024-05-15 10:05:24 -04:00
sr_vendor.c
sr.c sr: convert to the atomic queue limits API 2024-06-14 10:19:44 -06:00
sr.h scsi: sr: Fix unintentional arithmetic wraparound 2024-05-15 10:05:24 -04:00
st_options.h
st.c scsi: st: Drop driver owner initialization 2024-04-05 20:58:25 -04:00
st.h
stex.c scsi: stex: Fix gcc 13 warnings 2023-05-31 11:36:40 -04:00
storvsc_drv.c scsi: storvsc: Fix ring buffer size calculation 2024-01-23 21:27:28 -05:00
sun3_scsi_vme.c
sun3_scsi.c scsi: sun3: Convert to platform remove callback returning void 2023-12-05 21:51:37 -05:00
sun3x_esp.c Normalise "name (ad@dr)" MODULE_AUTHORs to "name <ad@dr>" 2024-03-06 13:07:39 -08:00
sun_esp.c Normalise "name (ad@dr)" MODULE_AUTHORs to "name <ad@dr>" 2024-03-06 13:07:39 -08:00
virtio_scsi.c scsi: virtio: drop owner assignment 2024-05-22 08:31:18 -04:00
vmw_pvscsi.c scsi: vmw_pvscsi: Do not use PCI_IRQ_LEGACY instead of PCI_IRQ_LEGACY 2024-05-16 14:35:08 -05:00
vmw_pvscsi.h
wd33c93.c scsi: wd33c93: Replace deprecated strncpy() with strscpy() 2024-03-10 18:37:43 -04:00
wd33c93.h
wd719x.c scsi: wd719x: Declare SCSI host template const 2023-03-24 19:19:59 -04:00
wd719x.h
xen-scsifront.c scsi: xen-scsifront: shost_priv() can never return NULL 2023-08-24 22:06:44 -04:00
zalon.c
zorro7xx.c
zorro_esp.c scsi: esp_scsi: Declare SCSI host template const 2023-03-24 19:19:22 -04:00