]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scsi: scsi_debug: Support injecting unaligned write errors
authorBart Van Assche <bvanassche@acm.org>
Thu, 13 Nov 2025 17:41:51 +0000 (09:41 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 20 Nov 2025 03:42:09 +0000 (22:42 -0500)
Allow user space software, e.g. a blktests test, to inject unaligned
write errors.

Acked-by: Douglas Gilbert <dgilbert@interlog.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Link: https://patch.msgid.link/20251113174151.1095574-1-bvanassche@acm.org
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/scsi_debug.c

index 92b2af803d87ea39b6d63f177ce2ebaba8bc9b54..1f2a53ba5dd98b8c9494b59458527f630a77972e 100644 (file)
@@ -230,6 +230,7 @@ struct tape_block {
 #define SDEBUG_OPT_NO_CDB_NOISE                0x4000
 #define SDEBUG_OPT_HOST_BUSY           0x8000
 #define SDEBUG_OPT_CMD_ABORT           0x10000
+#define SDEBUG_OPT_UNALIGNED_WRITE     0x20000
 #define SDEBUG_OPT_ALL_NOISE (SDEBUG_OPT_NOISE | SDEBUG_OPT_Q_NOISE | \
                              SDEBUG_OPT_RESET_NOISE)
 #define SDEBUG_OPT_ALL_INJECTING (SDEBUG_OPT_RECOVERED_ERR | \
@@ -237,7 +238,8 @@ struct tape_block {
                                  SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR | \
                                  SDEBUG_OPT_SHORT_TRANSFER | \
                                  SDEBUG_OPT_HOST_BUSY | \
-                                 SDEBUG_OPT_CMD_ABORT)
+                                 SDEBUG_OPT_CMD_ABORT | \
+                                 SDEBUG_OPT_UNALIGNED_WRITE)
 #define SDEBUG_OPT_RECOV_DIF_DIX (SDEBUG_OPT_RECOVERED_ERR | \
                                  SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR)
 
@@ -4932,6 +4934,14 @@ static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
        u8 *cmd = scp->cmnd;
        bool meta_data_locked = false;
 
+       if (unlikely(sdebug_opts & SDEBUG_OPT_UNALIGNED_WRITE &&
+                    atomic_read(&sdeb_inject_pending))) {
+               atomic_set(&sdeb_inject_pending, 0);
+               mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE,
+                               UNALIGNED_WRITE_ASCQ);
+               return check_condition_result;
+       }
+
        switch (cmd[0]) {
        case WRITE_16:
                ei_lba = 0;