Index: sd.c =================================================================== RCS file: /cvsroot/src/sys/dev/scsipi/sd.c,v retrieving revision 1.338 diff -p -u -r1.338 sd.c --- sd.c 11 Feb 2025 15:02:42 -0000 1.338 +++ sd.c 19 Feb 2025 16:04:05 -0000 @@ -1199,10 +1199,13 @@ sd_dumpblocks(device_t dev, void *va, da struct dk_softc *dksc = &sd->sc_dksc; struct disk_geom *dg = &dksc->sc_dkdev.dk_geom; struct scsipi_rw_10 cmd; /* write command */ + struct scsipi_rw_16 cmd16; /* write command */ + struct scsipi_generic *cmdp; struct scsipi_xfer *xs; /* ... convenience */ struct scsipi_periph *periph; struct scsipi_channel *chan; size_t sectorsize; + int cmdlen; periph = sd->sc_periph; chan = periph->periph_channel; @@ -1215,10 +1218,22 @@ sd_dumpblocks(device_t dev, void *va, da /* * Fill out the scsi command */ - memset(&cmd, 0, sizeof(cmd)); - cmd.opcode = WRITE_10; - _lto4b(blkno, cmd.addr); - _lto2b(nblk, cmd.length); + if ((blkno & 0xffffffff) == blkno) { + memset(&cmd, 0, sizeof(cmd)); + cmd.opcode = WRITE_10; + _lto4b(blkno, cmd.addr); + _lto2b(nblk, cmd.length); + cmdlen = sizeof(cmd); + cmdp = (struct scsipi_generic *)&cmd; + } else { + memset(&cmd16, 0, sizeof(cmd16)); + cmd16.opcode = WRITE_16; + _lto8b(blkno, cmd16.addr); + _lto4b(nblk, cmd16.length); + cmdlen = sizeof(cmd16); + cmdp = (struct scsipi_generic *)&cmd16; + } + /* * Fill out the scsipi_xfer structure * Note: we cannot sleep as we may be an interrupt @@ -1232,8 +1247,8 @@ sd_dumpblocks(device_t dev, void *va, da xs->xs_periph = periph; xs->xs_retries = SDRETRIES; xs->timeout = 10000; /* 10000 millisecs for a disk ! */ - xs->cmd = (struct scsipi_generic *)&cmd; - xs->cmdlen = sizeof(cmd); + xs->cmd = cmdp; + xs->cmdlen = cmdlen; xs->resid = nblk * sectorsize; xs->error = XS_NOERROR; xs->bp = 0;