* [PATCH 0/1] hw/scsi: add initial SCSI tape device emulation @ 2026-05-13 2:58 Emmanuel Ugwu 2026-05-13 2:58 ` [PATCH 1/1] " Emmanuel Ugwu 2026-05-22 17:22 ` [PATCH v2] hw/scsi: add scsi-tape device emulation support for QEMU Emmanuel Ugwu 0 siblings, 2 replies; 5+ messages in thread From: Emmanuel Ugwu @ 2026-05-13 2:58 UTC (permalink / raw) To: qemu-devel; +Cc: fam, deller, Emmanuel Ugwu This RFC adds the foundation for SCSI tape emulation in QEMU. This patch implements realize and unrealize only. SCSI command handling will follow in subsequent patches. Feedback needed on the overall structure. Emmanuel Ugwu (1): hw/scsi: add initial SCSI tape device emulation hw/scsi/meson.build | 1 + hw/scsi/scsi-tape.c | 221 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 222 insertions(+) create mode 100644 hw/scsi/scsi-tape.c -- 2.54.0 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/1] hw/scsi: add initial SCSI tape device emulation 2026-05-13 2:58 [PATCH 0/1] hw/scsi: add initial SCSI tape device emulation Emmanuel Ugwu @ 2026-05-13 2:58 ` Emmanuel Ugwu 2026-05-19 13:20 ` Helge Deller 2026-05-22 17:22 ` [PATCH v2] hw/scsi: add scsi-tape device emulation support for QEMU Emmanuel Ugwu 1 sibling, 1 reply; 5+ messages in thread From: Emmanuel Ugwu @ 2026-05-13 2:58 UTC (permalink / raw) To: qemu-devel; +Cc: fam, deller, kantnero From: kantnero <emmanuelugwu121@gmail.com> Add a new scsi-tape device that attaches to a VirtIO SCSI bus. Implements realize and unrealize lifecycle only. SCSI command handling will follow in subsequent patches. Signed-off-by: Emmanuel Ugwu <emmanuelugwu121@gmail.com> Signed-off-by: kantnero <emmanuelugwu121@gmail.com> --- hw/scsi/meson.build | 1 + hw/scsi/scsi-tape.c | 221 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 222 insertions(+) create mode 100644 hw/scsi/scsi-tape.c diff --git a/hw/scsi/meson.build b/hw/scsi/meson.build index 69fde0cf84..1699b6e591 100644 --- a/hw/scsi/meson.build +++ b/hw/scsi/meson.build @@ -7,6 +7,7 @@ scsi_ss.add(files( 'scsi-bus.c', 'scsi-disk.c', 'scsi-generic.c', + 'scsi-tape.c', )) scsi_ss.add(when: 'CONFIG_ESP', if_true: files('esp.c')) scsi_ss.add(when: 'CONFIG_ESP_PCI', if_true: files('esp-pci.c')) diff --git a/hw/scsi/scsi-tape.c b/hw/scsi/scsi-tape.c new file mode 100644 index 0000000000..650f75471f --- /dev/null +++ b/hw/scsi/scsi-tape.c @@ -0,0 +1,221 @@ +/* + * SCSI Tape Device Emulation + * + * Copyright (c) Emmanuel Ugwu <emmanuelugwu121@gmail.com> + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/units.h" +#include "qapi/error.h" +#include "qemu/error-report.h" +#include "hw/scsi/scsi.h" +#include "qemu/hw-version.h" +#include "qemu/memalign.h" +#include "scsi/constants.h" +#include "hw/core/qdev-properties.h" +#include "hw/core/qdev-properties-system.h" +#include "system/block-backend.h" +#include "qemu/cutils.h" +#include "qom/object.h" + + + +#define MAX_SERIAL_LEN 36 +#define MAX_SERIAL_LEN_FOR_DEVID 20 +#define TYPE_SCSI_TAPE_BASE "scsi-tape" + +OBJECT_DECLARE_TYPE(SCSITapeState, SCSITapeClass, SCSI_TAPE_BASE) + +typedef struct SCSITapeClass { + SCSIDeviceClass parent_class; +} SCSITapeClass; + + +typedef struct SCSITapeReq { + SCSIRequest req; + struct iovec iov; + uint32_t buflen; + QEMUIOVector qiov; + BlockAcctCookie acct; +} SCSITapeReq; + +typedef struct SCSITapeState { + SCSIDevice qdev; + uint32_t position; + bool at_filemark; + bool eof; + bool bot; + bool eot; + char *vendor; + char *version; + char *serial; + char *product; + char *device_id; +} SCSITapeState; + + + +/* + * scsi_free_request() will be enabled once scsi_init_iovec() is + * implemented. It frees the buffer allocated by qemu_memalign(). + * static void scsi_free_request(SCSIRequest *req) + * { + * SCSITapeReq *r = DO_UPCAST(SCSITapeReq, req, req); + * static void scsi_free_request(SCSIRequest *req) + * { + * SCSITapeReq *r = DO_UPCAST(SCSITapeReq, req, req); + * qemu_vfree(r->iov.iov_base); + * } + */ + +/* TODO: finish implementation for testing realize function for now */ +static int32_t scsi_tape_send_command(SCSIRequest *req, uint8_t *buf) +{ + scsi_req_complete(req, GOOD); + return 0; +} + +/*TODO: Add elements when commands are implemented*/ +static const SCSIReqOps *const scsi_tape_reqops_dispatch[256] = { + +}; +static const SCSIReqOps scsi_tape_emulate_reqops = { + .size = sizeof(SCSITapeReq), + /* required to test if tape is detected by QEMU*/ + .send_command = scsi_tape_send_command +}; + + +static SCSIRequest *scsi_tape_new_request(SCSIDevice *dev, uint32_t tag, + uint32_t lun, uint8_t *buf, + void *hba_private) +{ + SCSITapeState *s = DO_UPCAST(SCSITapeState, qdev, dev); + SCSIRequest *req; + const SCSIReqOps *ops = scsi_tape_reqops_dispatch[buf[0]]; + if (!ops) { + ops = &scsi_tape_emulate_reqops; + } + req = scsi_req_alloc(ops, &s->qdev, tag, lun, hba_private); + + return req; +} + +static void scsi_tape_init(SCSITapeState *s) +{ + s->position = 0; + s->at_filemark = false; + s->eof = false; + s->bot = true; + s->eot = false; +} + + + +static void scsi_tape_realize(SCSIDevice *dev, Error **errp) +{ + SCSITapeState *s = DO_UPCAST(SCSITapeState, qdev, dev); + + s->qdev.type = TYPE_TAPE; + + if (!s->qdev.conf.blk) { + error_setg(errp, "drive property not set"); + return; + } + + if (!blk_attach_dev(s->qdev.conf.blk, &dev->qdev)) { + error_setg(errp, "failed to attach block backend"); + return; + } + + if (!s->vendor) { + s->vendor = g_strdup("QEMU TAPE"); + } + if (!s->version) { + s->version = g_strdup(QEMU_HW_VERSION); + } + + if (s->serial && strlen(s->serial) > MAX_SERIAL_LEN) { + error_setg(errp, "The serial number can't be longer than %d characters", + MAX_SERIAL_LEN); + goto fail; + } + + if (!s->device_id) { + if (s->serial) { + if (strlen(s->serial) > MAX_SERIAL_LEN_FOR_DEVID) { + error_setg(errp, "The serial number can't be longer than %d " + "characters when it is also used as the default for " + "device_id", MAX_SERIAL_LEN_FOR_DEVID); + goto fail; + } + s->device_id = g_strdup(s->serial); + } + } + + scsi_tape_init(s); + return; + +fail: + g_free(s->vendor); + s->vendor = NULL; + g_free(s->version); + s->version = NULL; + blk_detach_dev(s->qdev.conf.blk, &dev->qdev); +} + +static void scsi_tape_unrealize(SCSIDevice *dev) +{ + SCSITapeState *s = DO_UPCAST(SCSITapeState, qdev, dev); + + g_free(s->vendor); + g_free(s->serial); + g_free(s->product); + g_free(s->device_id); + g_free(s->version); + if (s->qdev.conf.blk) { + blk_detach_dev(s->qdev.conf.blk, &dev->qdev); + } +} + +#define DEFINE_SCSI_TAPE_PROPERTIES() \ + DEFINE_PROP_DRIVE_IOTHREAD("drive", SCSITapeState, qdev.conf.blk), \ + DEFINE_BLOCK_PROPERTIES_BASE(SCSITapeState, qdev.conf), \ + DEFINE_BLOCK_ERROR_PROPERTIES(SCSITapeState, qdev.conf), \ + DEFINE_PROP_STRING("ver", SCSITapeState, version), \ + DEFINE_PROP_STRING("serial", SCSITapeState, serial), \ + DEFINE_PROP_STRING("vendor", SCSITapeState, vendor), \ + DEFINE_PROP_STRING("product", SCSITapeState, product), \ + DEFINE_PROP_STRING("device_id", SCSITapeState, device_id) + +static const Property scsi_tape_properties[] = { + DEFINE_SCSI_TAPE_PROPERTIES(), +}; +static void scsi_tape_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass); + + sc->realize = scsi_tape_realize; + sc->unrealize = scsi_tape_unrealize; + sc->alloc_req = scsi_tape_new_request; + dc->desc = "virtual SCSI tape"; + device_class_set_props(dc, scsi_tape_properties); +} +static const TypeInfo scsi_tape_info = { + .name = TYPE_SCSI_TAPE_BASE, + .parent = TYPE_SCSI_DEVICE, + .instance_size = sizeof(SCSITapeState), + .class_size = sizeof(SCSITapeClass), + .class_init = scsi_tape_class_init, +}; + +static void scsi_tape_register_types(void) +{ + type_register_static(&scsi_tape_info); +} + +type_init(scsi_tape_register_types) + -- 2.54.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/1] hw/scsi: add initial SCSI tape device emulation 2026-05-13 2:58 ` [PATCH 1/1] " Emmanuel Ugwu @ 2026-05-19 13:20 ` Helge Deller 0 siblings, 0 replies; 5+ messages in thread From: Helge Deller @ 2026-05-19 13:20 UTC (permalink / raw) To: Emmanuel Ugwu; +Cc: qemu-devel, fam, deller Hi Emmanuel, * Emmanuel Ugwu <emmanuelugwu121@gmail.com>: > From: kantnero <emmanuelugwu121@gmail.com> > > Add a new scsi-tape device that attaches to a VirtIO SCSI bus. > Implements realize and unrealize lifecycle only. SCSI command > handling will follow in subsequent patches. Ok. > Signed-off-by: Emmanuel Ugwu <emmanuelugwu121@gmail.com> > Signed-off-by: kantnero <emmanuelugwu121@gmail.com> Please use the first only. > --- > hw/scsi/meson.build | 1 + > hw/scsi/scsi-tape.c | 221 ++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 222 insertions(+) > create mode 100644 hw/scsi/scsi-tape.c > > diff --git a/hw/scsi/meson.build b/hw/scsi/meson.build > index 69fde0cf84..1699b6e591 100644 > --- a/hw/scsi/meson.build > +++ b/hw/scsi/meson.build > @@ -7,6 +7,7 @@ scsi_ss.add(files( > 'scsi-bus.c', > 'scsi-disk.c', > 'scsi-generic.c', > + 'scsi-tape.c', > )) > scsi_ss.add(when: 'CONFIG_ESP', if_true: files('esp.c')) > scsi_ss.add(when: 'CONFIG_ESP_PCI', if_true: files('esp-pci.c')) > diff --git a/hw/scsi/scsi-tape.c b/hw/scsi/scsi-tape.c > new file mode 100644 > index 0000000000..650f75471f > --- /dev/null > +++ b/hw/scsi/scsi-tape.c > @@ -0,0 +1,221 @@ > +/* > + * SCSI Tape Device Emulation > + * > + * Copyright (c) Emmanuel Ugwu <emmanuelugwu121@gmail.com> Add copyright year. I'm no qemu SCSI maintainer, but for me the rest looks OK. I'm really looking forward to your first implementation! Thanks! Helge ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2] hw/scsi: add scsi-tape device emulation support for QEMU 2026-05-13 2:58 [PATCH 0/1] hw/scsi: add initial SCSI tape device emulation Emmanuel Ugwu 2026-05-13 2:58 ` [PATCH 1/1] " Emmanuel Ugwu @ 2026-05-22 17:22 ` Emmanuel Ugwu 1 sibling, 0 replies; 5+ messages in thread From: Emmanuel Ugwu @ 2026-05-22 17:22 UTC (permalink / raw) To: qemu-devel; +Cc: pbonzini, fam, deller, stefanha, Emmanuel Ugwu Add copyright year to header v2: - Add copyright year. - Split into 5 patches for easier review. Signed-off-by: Emmanuel Ugwu <emmanuelugwu121@gmail.com> --- hw/scsi/scsi-tape.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/scsi/scsi-tape.c b/hw/scsi/scsi-tape.c index 650f75471f..17d9ce4e7b 100644 --- a/hw/scsi/scsi-tape.c +++ b/hw/scsi/scsi-tape.c @@ -1,7 +1,7 @@ /* * SCSI Tape Device Emulation * - * Copyright (c) Emmanuel Ugwu <emmanuelugwu121@gmail.com> + * Copyright (c) 2026 - Emmanuel Ugwu <emmanuelugwu121@gmail.com> * * SPDX-License-Identifier: GPL-2.0-or-later */ -- 2.54.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 0/1] hw/scsi: add initial SCSI tape device emulation @ 2026-05-13 2:44 kantnero 2026-05-13 2:44 ` [PATCH 1/1] " kantnero 0 siblings, 1 reply; 5+ messages in thread From: kantnero @ 2026-05-13 2:44 UTC (permalink / raw) To: qemu-devel; +Cc: pbonzini, fam, deller, Emmanuel Ugwu From: Emmanuel Ugwu <emmanuelugwu121@gmail.com> This RFC adds the foundation for SCSI tape emulation in QEMU. This patch implements realize and unrealize only. SCSI command handling will follow in subsequent patches. Feedback needed on the overall structure. Emmanuel Ugwu (1): hw/scsi: add initial SCSI tape device emulation hw/scsi/meson.build | 1 + hw/scsi/scsi-tape.c | 221 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 222 insertions(+) create mode 100644 hw/scsi/scsi-tape.c -- 2.54.0 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/1] hw/scsi: add initial SCSI tape device emulation 2026-05-13 2:44 [PATCH 0/1] hw/scsi: add initial SCSI tape device emulation kantnero @ 2026-05-13 2:44 ` kantnero 0 siblings, 0 replies; 5+ messages in thread From: kantnero @ 2026-05-13 2:44 UTC (permalink / raw) To: qemu-devel; +Cc: pbonzini, fam, deller, kantnero Add a new scsi-tape device that attaches to a VirtIO SCSI bus. Implements realize and unrealize lifecycle only. SCSI command handling will follow in subsequent patches. Signed-off-by: Emmanuel Ugwu <emmanuelugwu121@gmail.com> Signed-off-by: kantnero <emmanuelugwu121@gmail.com> --- hw/scsi/meson.build | 1 + hw/scsi/scsi-tape.c | 221 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 222 insertions(+) create mode 100644 hw/scsi/scsi-tape.c diff --git a/hw/scsi/meson.build b/hw/scsi/meson.build index 69fde0cf84..1699b6e591 100644 --- a/hw/scsi/meson.build +++ b/hw/scsi/meson.build @@ -7,6 +7,7 @@ scsi_ss.add(files( 'scsi-bus.c', 'scsi-disk.c', 'scsi-generic.c', + 'scsi-tape.c', )) scsi_ss.add(when: 'CONFIG_ESP', if_true: files('esp.c')) scsi_ss.add(when: 'CONFIG_ESP_PCI', if_true: files('esp-pci.c')) diff --git a/hw/scsi/scsi-tape.c b/hw/scsi/scsi-tape.c new file mode 100644 index 0000000000..650f75471f --- /dev/null +++ b/hw/scsi/scsi-tape.c @@ -0,0 +1,221 @@ +/* + * SCSI Tape Device Emulation + * + * Copyright (c) Emmanuel Ugwu <emmanuelugwu121@gmail.com> + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/units.h" +#include "qapi/error.h" +#include "qemu/error-report.h" +#include "hw/scsi/scsi.h" +#include "qemu/hw-version.h" +#include "qemu/memalign.h" +#include "scsi/constants.h" +#include "hw/core/qdev-properties.h" +#include "hw/core/qdev-properties-system.h" +#include "system/block-backend.h" +#include "qemu/cutils.h" +#include "qom/object.h" + + + +#define MAX_SERIAL_LEN 36 +#define MAX_SERIAL_LEN_FOR_DEVID 20 +#define TYPE_SCSI_TAPE_BASE "scsi-tape" + +OBJECT_DECLARE_TYPE(SCSITapeState, SCSITapeClass, SCSI_TAPE_BASE) + +typedef struct SCSITapeClass { + SCSIDeviceClass parent_class; +} SCSITapeClass; + + +typedef struct SCSITapeReq { + SCSIRequest req; + struct iovec iov; + uint32_t buflen; + QEMUIOVector qiov; + BlockAcctCookie acct; +} SCSITapeReq; + +typedef struct SCSITapeState { + SCSIDevice qdev; + uint32_t position; + bool at_filemark; + bool eof; + bool bot; + bool eot; + char *vendor; + char *version; + char *serial; + char *product; + char *device_id; +} SCSITapeState; + + + +/* + * scsi_free_request() will be enabled once scsi_init_iovec() is + * implemented. It frees the buffer allocated by qemu_memalign(). + * static void scsi_free_request(SCSIRequest *req) + * { + * SCSITapeReq *r = DO_UPCAST(SCSITapeReq, req, req); + * static void scsi_free_request(SCSIRequest *req) + * { + * SCSITapeReq *r = DO_UPCAST(SCSITapeReq, req, req); + * qemu_vfree(r->iov.iov_base); + * } + */ + +/* TODO: finish implementation for testing realize function for now */ +static int32_t scsi_tape_send_command(SCSIRequest *req, uint8_t *buf) +{ + scsi_req_complete(req, GOOD); + return 0; +} + +/*TODO: Add elements when commands are implemented*/ +static const SCSIReqOps *const scsi_tape_reqops_dispatch[256] = { + +}; +static const SCSIReqOps scsi_tape_emulate_reqops = { + .size = sizeof(SCSITapeReq), + /* required to test if tape is detected by QEMU*/ + .send_command = scsi_tape_send_command +}; + + +static SCSIRequest *scsi_tape_new_request(SCSIDevice *dev, uint32_t tag, + uint32_t lun, uint8_t *buf, + void *hba_private) +{ + SCSITapeState *s = DO_UPCAST(SCSITapeState, qdev, dev); + SCSIRequest *req; + const SCSIReqOps *ops = scsi_tape_reqops_dispatch[buf[0]]; + if (!ops) { + ops = &scsi_tape_emulate_reqops; + } + req = scsi_req_alloc(ops, &s->qdev, tag, lun, hba_private); + + return req; +} + +static void scsi_tape_init(SCSITapeState *s) +{ + s->position = 0; + s->at_filemark = false; + s->eof = false; + s->bot = true; + s->eot = false; +} + + + +static void scsi_tape_realize(SCSIDevice *dev, Error **errp) +{ + SCSITapeState *s = DO_UPCAST(SCSITapeState, qdev, dev); + + s->qdev.type = TYPE_TAPE; + + if (!s->qdev.conf.blk) { + error_setg(errp, "drive property not set"); + return; + } + + if (!blk_attach_dev(s->qdev.conf.blk, &dev->qdev)) { + error_setg(errp, "failed to attach block backend"); + return; + } + + if (!s->vendor) { + s->vendor = g_strdup("QEMU TAPE"); + } + if (!s->version) { + s->version = g_strdup(QEMU_HW_VERSION); + } + + if (s->serial && strlen(s->serial) > MAX_SERIAL_LEN) { + error_setg(errp, "The serial number can't be longer than %d characters", + MAX_SERIAL_LEN); + goto fail; + } + + if (!s->device_id) { + if (s->serial) { + if (strlen(s->serial) > MAX_SERIAL_LEN_FOR_DEVID) { + error_setg(errp, "The serial number can't be longer than %d " + "characters when it is also used as the default for " + "device_id", MAX_SERIAL_LEN_FOR_DEVID); + goto fail; + } + s->device_id = g_strdup(s->serial); + } + } + + scsi_tape_init(s); + return; + +fail: + g_free(s->vendor); + s->vendor = NULL; + g_free(s->version); + s->version = NULL; + blk_detach_dev(s->qdev.conf.blk, &dev->qdev); +} + +static void scsi_tape_unrealize(SCSIDevice *dev) +{ + SCSITapeState *s = DO_UPCAST(SCSITapeState, qdev, dev); + + g_free(s->vendor); + g_free(s->serial); + g_free(s->product); + g_free(s->device_id); + g_free(s->version); + if (s->qdev.conf.blk) { + blk_detach_dev(s->qdev.conf.blk, &dev->qdev); + } +} + +#define DEFINE_SCSI_TAPE_PROPERTIES() \ + DEFINE_PROP_DRIVE_IOTHREAD("drive", SCSITapeState, qdev.conf.blk), \ + DEFINE_BLOCK_PROPERTIES_BASE(SCSITapeState, qdev.conf), \ + DEFINE_BLOCK_ERROR_PROPERTIES(SCSITapeState, qdev.conf), \ + DEFINE_PROP_STRING("ver", SCSITapeState, version), \ + DEFINE_PROP_STRING("serial", SCSITapeState, serial), \ + DEFINE_PROP_STRING("vendor", SCSITapeState, vendor), \ + DEFINE_PROP_STRING("product", SCSITapeState, product), \ + DEFINE_PROP_STRING("device_id", SCSITapeState, device_id) + +static const Property scsi_tape_properties[] = { + DEFINE_SCSI_TAPE_PROPERTIES(), +}; +static void scsi_tape_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass); + + sc->realize = scsi_tape_realize; + sc->unrealize = scsi_tape_unrealize; + sc->alloc_req = scsi_tape_new_request; + dc->desc = "virtual SCSI tape"; + device_class_set_props(dc, scsi_tape_properties); +} +static const TypeInfo scsi_tape_info = { + .name = TYPE_SCSI_TAPE_BASE, + .parent = TYPE_SCSI_DEVICE, + .instance_size = sizeof(SCSITapeState), + .class_size = sizeof(SCSITapeClass), + .class_init = scsi_tape_class_init, +}; + +static void scsi_tape_register_types(void) +{ + type_register_static(&scsi_tape_info); +} + +type_init(scsi_tape_register_types) + -- 2.54.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-05-22 17:29 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-05-13 2:58 [PATCH 0/1] hw/scsi: add initial SCSI tape device emulation Emmanuel Ugwu 2026-05-13 2:58 ` [PATCH 1/1] " Emmanuel Ugwu 2026-05-19 13:20 ` Helge Deller 2026-05-22 17:22 ` [PATCH v2] hw/scsi: add scsi-tape device emulation support for QEMU Emmanuel Ugwu -- strict thread matches above, loose matches on Subject: below -- 2026-05-13 2:44 [PATCH 0/1] hw/scsi: add initial SCSI tape device emulation kantnero 2026-05-13 2:44 ` [PATCH 1/1] " kantnero
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.