summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth R Westerback <krw@cvs.openbsd.org>2023-11-08 12:01:22 +0000
committerKenneth R Westerback <krw@cvs.openbsd.org>2023-11-08 12:01:22 +0000
commit737e77d2f6dc10525494b44feeb8186d6be2b031 (patch)
tree5f04a4f6130001719f479acbf8582f757145baf4
parente5a71e64f44f24bcecfb6697941d3fb43a2de1eb (diff)
Allow Xen to use backing store devices with 4K-byte sectors.
Problem reported and much testing by Christian Kujau. Thanks! Roughly equivalent to bouyer@NetBSD changes prompted by Christian. ok mlarkin@ dlg@
-rw-r--r--sys/dev/pv/xbf.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/dev/pv/xbf.c b/sys/dev/pv/xbf.c
index 63b90024ef5..08c285d88f1 100644
--- a/sys/dev/pv/xbf.c
+++ b/sys/dev/pv/xbf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: xbf.c,v 1.52 2022/04/16 19:19:59 naddy Exp $ */
+/* $OpenBSD: xbf.c,v 1.53 2023/11/08 12:01:21 krw Exp $ */
/*
* Copyright (c) 2016, 2017 Mike Belopuhov
@@ -57,6 +57,7 @@
#define XBF_MAX_ISGE 8
#define XBF_SEC_SHIFT 9
+#define XBF_SEC_SIZE (1 << XBF_SEC_SHIFT)
#define XBF_CDROM 1
#define XBF_REMOVABLE 2
@@ -662,6 +663,10 @@ xbf_submit_cmd(struct scsi_xfer *xs)
nblk = _4btol(rw16->length);
}
+ /* SCSI lba/nblk are sc_block_size. ccb's need XBF_SEC_SIZE. */
+ lba *= sc->sc_block_size / XBF_SEC_SIZE;
+ nblk *= sc->sc_block_size / XBF_SEC_SIZE;
+
ccb->ccb_want = ccb->ccb_seen = 0;
do {
@@ -856,7 +861,8 @@ xbf_scsi_capacity(struct scsi_xfer *xs)
bzero(&rcd, sizeof(rcd));
- capacity = sc->sc_disk_size - 1;
+ /* [addr|length] are sc_block_size. sc->sc_disk_size is XBF_SEC_SIZE. */
+ capacity = (sc->sc_disk_size * XBF_SEC_SIZE) / sc->sc_block_size - 1;
if (capacity > 0xffffffff)
capacity = 0xffffffff;
@@ -873,10 +879,13 @@ xbf_scsi_capacity16(struct scsi_xfer *xs)
{
struct xbf_softc *sc = xs->sc_link->bus->sb_adapter_softc;
struct scsi_read_cap_data_16 rcd;
+ uint64_t capacity;
bzero(&rcd, sizeof(rcd));
- _lto8b(sc->sc_disk_size - 1, rcd.addr);
+ /* [addr|length] are sc_block_size. sc->sc_disk_size is XBF_SEC_SIZE. */
+ capacity = (sc->sc_disk_size * XBF_SEC_SIZE) / sc->sc_block_size - 1;
+ _lto8b(capacity, rcd.addr);
_lto4b(sc->sc_block_size, rcd.length);
bcopy(&rcd, xs->data, MIN(sizeof(rcd), xs->datalen));