From nobody Sun Feb 8 20:52:14 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) client-ip=207.211.31.81; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1587952936; cv=none; d=zohomail.com; s=zohoarc; b=PNk568vLgIWCMe5Y5irm2HO/aUeyjMZWAy2pNU3cN7ynVFEcQtLggj0EHHI457lH2AmZBgLp73pqBz5CUtiEqLg63r/ww56yrhK20fHo0xWjNGuQBqyGeLT0s1y1PfaZDyUv98RfdcLfFylgX9yKvNat9JeT6V+JHCtIlqFt6z4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1587952936; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=LVnKW7TSjKL8uR6K5VLSLDBqxIr2iE/yyYKMXhFQSXY=; b=DaQ1KsrQ03P3znPAyEixGXANBHasSzPSUBjC1loUiZQYycOO9SY8DToB0jT1b4+WKV2wEoZgnniDJCcd16NkLDj1A5Xgmk9BM2aZOIZEQMSu4rSVZJZCJlVffkny2PoVSXeZegPD6t2ngUv6/62QpR9bg9q2yGJxJsvsO1+Gr7U= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) by mx.zohomail.com with SMTPS id 1587952936120913.2435309908768; Sun, 26 Apr 2020 19:02:16 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-43-qu35MPoNPFGy0ZQyEZx0HQ-1; Sun, 26 Apr 2020 22:02:09 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2C31D1800D42; Mon, 27 Apr 2020 02:02:04 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DEF016062B; Mon, 27 Apr 2020 02:02:03 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 50B864CAA0; Mon, 27 Apr 2020 02:02:03 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 03R21QdV021267 for ; Sun, 26 Apr 2020 22:01:26 -0400 Received: by smtp.corp.redhat.com (Postfix) id E72263818D; Mon, 27 Apr 2020 02:01:26 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-13-109.pek2.redhat.com [10.72.13.109]) by smtp.corp.redhat.com (Postfix) with ESMTP id 56987605D1; Mon, 27 Apr 2020 02:01:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1587952934; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=LVnKW7TSjKL8uR6K5VLSLDBqxIr2iE/yyYKMXhFQSXY=; b=jOqHNx+sK+cPqyq06qmq2i7MleLhzKkxAq/yIReF1Gj3uqDfQ5uNq9OWZ3Kl3zcGRjWmP6 95CQYnKfi8TRAe7zvOFncRjR9atfsojfDMRzAk+a/j+OGYpXSykY84N1pZVxYFpBP+3KhQ xEFCxFM7CqB7U8gD3edtNpm0v6Lg/xI= X-MC-Unique: qu35MPoNPFGy0ZQyEZx0HQ-1 From: Han Han To: libvir-list@redhat.com Subject: [PATCH v1 2/5] qemu: Support iser transport in iscsi Date: Mon, 27 Apr 2020 10:01:07 +0800 Message-Id: <20200427020110.174406-3-hhan@redhat.com> In-Reply-To: <20200427020110.174406-1-hhan@redhat.com> References: <20200427020110.174406-1-hhan@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Cc: pkrempa@redhat.com, Han Han X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" The iscsi iser transport is introdcued since QEMU 2.9. For iscsi blockdev json, it will be shown at 'transport' field: 'json:{...,{"driver": "iscsi","transport":"iser",...}}' For legacy drive filename as iscsi uri, it will start with 'iser' scheme: iser://[[username][%]@][:]// By default, the iscsi transport is still tcp. Signed-off-by: Han Han --- src/qemu/qemu_backup.c | 1 + src/qemu/qemu_block.c | 16 +++++++++++++--- src/qemu/qemu_command.c | 17 +++++++++++++++++ src/qemu/qemu_monitor_json.c | 1 + src/storage/storage_file_gluster.c | 7 +++++++ src/util/virstoragefile.c | 26 ++++++++++++++++++-------- src/util/virstoragefile.h | 1 + 7 files changed, 58 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c index 80fc5d77..caf0b4ce 100644 --- a/src/qemu/qemu_backup.c +++ b/src/qemu/qemu_backup.c @@ -88,6 +88,7 @@ qemuBackupPrepare(virDomainBackupDefPtr def) /* TODO: Do we need to mess with selinux? */ break; =20 + case VIR_STORAGE_NET_HOST_TRANS_ISER: case VIR_STORAGE_NET_HOST_TRANS_RDMA: case VIR_STORAGE_NET_HOST_TRANS_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index d32277d7..003c18f1 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -418,10 +418,16 @@ qemuBlockStorageSourceGetURI(virStorageSourcePtr src) if (VIR_ALLOC(uri) < 0) return NULL; =20 - if (src->hosts->transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_TCP) { + if (src->hosts->transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_TCP || + src->hosts->transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_RDMA || + src->hosts->transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_ISER) uri->port =3D src->hosts->port; =20 + if (src->hosts->transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_TCP) { uri->scheme =3D g_strdup(virStorageNetProtocolTypeToString(src->pr= otocol)); + } else if (src->protocol =3D=3D VIR_STORAGE_NET_PROTOCOL_ISCSI && + src->hosts->transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_ISE= R) { + uri->scheme =3D g_strdup("iser"); } else { uri->scheme =3D g_strdup_printf("%s+%s", virStorageNetProtocolTypeToString(sr= c->protocol), @@ -497,6 +503,7 @@ qemuBlockStorageSourceBuildJSONSocketAddress(virStorage= NetHostDefPtr host, return NULL; break; =20 + case VIR_STORAGE_NET_HOST_TRANS_ISER: case VIR_STORAGE_NET_HOST_TRANS_RDMA: case VIR_STORAGE_NET_HOST_TRANS_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, @@ -743,6 +750,7 @@ qemuBlockStorageSourceGetISCSIProps(virStorageSourcePtr= src, { qemuDomainStorageSourcePrivatePtr srcPriv =3D QEMU_DOMAIN_STORAGE_SOUR= CE_PRIVATE(src); g_autofree char *target =3D NULL; + const char *transport =3D NULL; char *lunStr =3D NULL; char *username =3D NULL; char *objalias =3D NULL; @@ -762,6 +770,7 @@ qemuBlockStorageSourceGetISCSIProps(virStorageSourcePtr= src, */ =20 target =3D g_strdup(src->path); + transport =3D virStorageNetHostTransportTypeToString(src->hosts->trans= port); =20 /* Separate the target and lun */ if ((lunStr =3D strchr(target, '/'))) { @@ -791,7 +800,7 @@ qemuBlockStorageSourceGetISCSIProps(virStorageSourcePtr= src, "s:portal", portal, "s:target", target, "u:lun", lun, - "s:transport", "tcp", + "s:transport", transport, "S:user", username, "S:password-secret", objalias, "S:initiator-name", src->initiat= or.iqn, @@ -2063,7 +2072,8 @@ qemuBlockGetBackingStoreString(virStorageSourcePtr sr= c, /* generate simplified URIs for the easy cases */ if (actualType =3D=3D VIR_STORAGE_TYPE_NETWORK && src->nhosts =3D=3D 1 && - src->hosts->transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_TCP && + (src->hosts->transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_TCP || + src->hosts->transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_ISER)= && src->timeout =3D=3D 0 && src->ncookies =3D=3D 0 && src->sslverify =3D=3D VIR_TRISTATE_BOOL_ABSENT && diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 45dd8307..c5cf9401 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1443,6 +1443,16 @@ qemuCheckDiskConfig(virDomainDiskDefPtr disk, return -1; } } + + if (disk->src && + disk->src->hosts && + disk->src->hosts->transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_= ISER && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_ISCSI_TRANSPORT_ISER)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("iSCSI iser transport is not supported by this " + "QEMU binary")); + return -1; + } } =20 if (disk->serial && @@ -4888,6 +4898,13 @@ qemuBuildSCSIiSCSIHostdevDrvStr(virDomainHostdevDefP= tr dev, qemuDomainStorageSourcePrivatePtr srcPriv =3D QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(iscsisrc->src); =20 + if (iscsisrc->src->hosts->transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_= ISER && + !virQEMUCapsGet(qemuCaps, QEMU_CAPS_ISCSI_TRANSPORT_ISER)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("This QEMU doesn't support iSCSI iser transport")= ); + return NULL; + } + if (qemuDiskSourceNeedsProps(iscsisrc->src, qemuCaps)) { if (!(srcprops =3D qemuDiskSourceGetProps(iscsisrc->src))) return NULL; diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 619717ea..338f66ef 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -7199,6 +7199,7 @@ qemuMonitorJSONNBDServerStart(qemuMonitorPtr mon, case VIR_STORAGE_NET_HOST_TRANS_UNIX: addr =3D qemuMonitorJSONBuildUnixSocketAddress(server->socket); break; + case VIR_STORAGE_NET_HOST_TRANS_ISER: case VIR_STORAGE_NET_HOST_TRANS_RDMA: case VIR_STORAGE_NET_HOST_TRANS_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", diff --git a/src/storage/storage_file_gluster.c b/src/storage/storage_file_= gluster.c index f389a944..73dfef0c 100644 --- a/src/storage/storage_file_gluster.c +++ b/src/storage/storage_file_gluster.c @@ -78,6 +78,13 @@ virStorageFileBackendGlusterInitServer(virStorageFileBac= kendGlusterPrivPtr priv, hoststr =3D host->socket; break; =20 + case VIR_STORAGE_NET_HOST_TRANS_ISER: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("invalid transport '%s' for gluster host"), + transport); + return -1; + break; + case VIR_STORAGE_NET_HOST_TRANS_LAST: break; } diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index ffc8bdb3..4f162f10 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -97,6 +97,7 @@ VIR_ENUM_IMPL(virStorageNetHostTransport, "tcp", "unix", "rdma", + "iser", ); =20 VIR_ENUM_IMPL(virStorageSourcePoolMode, @@ -2839,10 +2840,15 @@ virStorageSourceParseBackingURI(virStorageSourcePtr= src, =20 if (!scheme[0] || (src->protocol =3D virStorageNetProtocolTypeFromString(scheme[0]))= < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("invalid backing protocol '%s'"), - NULLSTR(scheme[0])); - return -1; + if (STRNEQ(scheme[0], "iser")) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("invalid backing protocol '%s'"), + NULLSTR(scheme[0])); + return -1; + } + + src->protocol =3D VIR_STORAGE_NET_PROTOCOL_ISCSI; + src->hosts->transport =3D VIR_STORAGE_NET_HOST_TRANS_ISER; } =20 if (scheme[1] && @@ -3523,14 +3529,17 @@ virStorageSourceParseBackingJSONiSCSI(virStorageSou= rcePtr src, return -1; =20 src->nhosts =3D 1; + src->hosts->transport =3D VIR_STORAGE_NET_HOST_TRANS_TCP; =20 - if (STRNEQ_NULLABLE(transport, "tcp")) { + if (STRNEQ(transport, "tcp") && STRNEQ(transport, "iser") && transport= ) { virReportError(VIR_ERR_INVALID_ARG, "%s", - _("only TCP transport is supported for iSCSI volume= s")); + _("only TCP or iSER transport is supported for iSCS= I " + "volumes")); return -1; } =20 - src->hosts->transport =3D VIR_STORAGE_NET_HOST_TRANS_TCP; + if (transport) + src->hosts->transport =3D virStorageNetHostTransportTypeFromString= (transport); =20 if (!portal) { virReportError(VIR_ERR_INVALID_ARG, "%s", @@ -4710,7 +4719,8 @@ virStorageSourceNetworkAssignDefaultPorts(virStorageS= ourcePtr src) size_t i; =20 for (i =3D 0; i < src->nhosts; i++) { - if (src->hosts[i].transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_TCP = && + if ((src->hosts[i].transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_TCP= || + src->hosts[i].transport =3D=3D VIR_STORAGE_NET_HOST_TRANS_ISE= R) && src->hosts[i].port =3D=3D 0) src->hosts[i].port =3D virStorageSourceNetworkDefaultPort(src-= >protocol); } diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h index 7939c09c..120d6190 100644 --- a/src/util/virstoragefile.h +++ b/src/util/virstoragefile.h @@ -146,6 +146,7 @@ typedef enum { VIR_STORAGE_NET_HOST_TRANS_TCP, VIR_STORAGE_NET_HOST_TRANS_UNIX, VIR_STORAGE_NET_HOST_TRANS_RDMA, + VIR_STORAGE_NET_HOST_TRANS_ISER, =20 VIR_STORAGE_NET_HOST_TRANS_LAST } virStorageNetHostTransport; --=20 2.25.0