This solves boot issue on Oracle Cloud Infrastructure (OCI) as mentioned:

Subject:    VirtIO SCSI device recognized by boot loader but not kernel
Date:       2021-01-13 16:37:45
https://marc.info/?l=openbsd-misc&m=161055611306914


Index: sys/scsi/scsiconf.c
===================================================================
RCS file: /cvs/src/sys/scsi/scsiconf.c,v
retrieving revision 1.238
diff -u -p -r1.238 scsiconf.c
--- sys/scsi/scsiconf.c 24 Oct 2021 16:57:30 -0000      1.238
+++ sys/scsi/scsiconf.c 24 Feb 2022 01:52:01 -0000
@@ -75,7 +75,7 @@ int   scsibussubprint(void *, const char *
 int    scsibusbioctl(struct device *, u_long, caddr_t);
 #endif /* NBIO > 0 */
 
-void   scsi_get_target_luns(struct scsi_link *, struct scsi_lun_array *);
+void   scsi_get_target_luns(struct scsibus_softc *, int, struct scsi_lun_array 
*);
 void   scsi_add_link(struct scsi_link *);
 void   scsi_remove_link(struct scsi_link *);
 void   scsi_print_link(struct scsi_link *);
@@ -412,6 +412,40 @@ scsi_activate_link(struct scsi_link *lin
        return rv;
 }
 
+struct scsi_link *
+scsi_alloc_link(struct scsibus_softc *sb, int target, int lun)
+{
+       struct scsi_link *link;
+
+       link = malloc(sizeof(*link), M_DEVBUF, M_NOWAIT);
+       if (link == NULL) {
+               SC_DEBUG(link, SDEV_DB2, ("Bad LUN. can't allocate "
+                   "scsi_link.\n"));
+               return NULL;
+       }
+
+       link->state = 0;
+       link->target = target;
+       link->lun = lun;
+       link->openings = sb->sb_openings;
+       link->node_wwn = link->port_wwn = 0;
+       link->flags = sb->sb_flags;
+       link->quirks = sb->sb_quirks;
+       link->interpret_sense = scsi_interpret_sense;
+       link->device_softc = NULL;
+       link->bus = sb;
+       memset(&link->inqdata, 0, sizeof(link->inqdata));
+       link->id = NULL;
+       TAILQ_INIT(&link->queue);
+       link->running = 0;
+       link->pending = 0;
+       link->pool = sb->sb_pool;
+
+       SC_DEBUG(link, SDEV_DB2, ("scsi_link created.\n"));
+
+       return link;
+}
+
 int
 scsi_probe(struct scsibus_softc *sb, int target, int lun)
 {
@@ -441,18 +475,13 @@ int
 scsi_probe_target(struct scsibus_softc *sb, int target)
 {
        struct scsi_lun_array            lunarray;
-       struct scsi_link                *link0;
        int                              i, r, rv = 0;
 
        if (target < 0 || target == sb->sb_adapter_target)
                return EINVAL;
 
        /* Probe all possible luns on target. */
-       scsi_probe_link(sb, target, 0, 0);
-       link0 = scsi_get_link(sb, target, 0);
-       if (link0 == NULL)
-               return EINVAL;
-       scsi_get_target_luns(link0, &lunarray);
+       scsi_get_target_luns(sb, target, &lunarray);
        for (i = 0; i < lunarray.count; i++) {
                r = scsi_probe_link(sb, target, lunarray.luns[i],
                    lunarray.dumbscan);
@@ -495,31 +524,9 @@ scsi_probe_link(struct scsibus_softc *sb
        if (scsi_get_link(sb, target, lun) != NULL)
                return 0;
 
-       link = malloc(sizeof(*link), M_DEVBUF, M_NOWAIT);
-       if (link == NULL) {
-               SC_DEBUG(link, SDEV_DB2, ("Bad LUN. can't allocate "
-                   "scsi_link.\n"));
+       link = scsi_alloc_link(sb, target, lun);
+       if (link == NULL)
                return EINVAL;
-       }
-
-       link->state = 0;
-       link->target = target;
-       link->lun = lun;
-       link->openings = sb->sb_openings;
-       link->node_wwn = link->port_wwn = 0;
-       link->flags = sb->sb_flags;
-       link->quirks = sb->sb_quirks;
-       link->interpret_sense = scsi_interpret_sense;
-       link->device_softc = NULL;
-       link->bus = sb;
-       memset(&link->inqdata, 0, sizeof(link->inqdata));
-       link->id = NULL;
-       TAILQ_INIT(&link->queue);
-       link->running = 0;
-       link->pending = 0;
-       link->pool = sb->sb_pool;
-
-       SC_DEBUG(link, SDEV_DB2, ("scsi_link created.\n"));
 
        /* Ask the adapter if this will be a valid device. */
        if (sb->sb_adapter->dev_probe != NULL &&
@@ -878,13 +885,19 @@ scsi_remove_link(struct scsi_link *link)
 }
 
 void
-scsi_get_target_luns(struct scsi_link *link0, struct scsi_lun_array *lunarray)
+scsi_get_target_luns(struct scsibus_softc *sb, int target, struct 
scsi_lun_array *lunarray)
 {
-       struct scsi_report_luns_data    *report;
+       struct scsi_report_luns_data    *report = NULL;
+       struct scsi_link                *link0;
        int                              i, nluns, rv = 0;
 
+       link0 = scsi_alloc_link(sb, target, 0);
+       if (link0 == NULL) {
+               lunarray->count = 0;
+               goto dumbscan;
+       }
+
        /* Initialize dumbscan result. Just in case. */
-       report = NULL;
        for (i = 0; i < link0->bus->sb_luns; i++)
                lunarray->luns[i] = i;
        lunarray->count = link0->bus->sb_luns;
@@ -928,6 +941,8 @@ scsi_get_target_luns(struct scsi_link *l
        }
 
 dumbscan:
+       if (link0 != NULL)
+               free(link0, M_DEVBUF, sizeof(*link0));
        if (report != NULL)
                dma_free(report, sizeof(*report));
 }

Reply via email to