From nobody Sat May 18 12:29:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1531519652032185.24803575240446; Fri, 13 Jul 2018 15:07:32 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.25]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C1A5C7F3F1; Fri, 13 Jul 2018 22:07:30 +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 7D1E82010CCE; Fri, 13 Jul 2018 22:07:30 +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 236714A465; Fri, 13 Jul 2018 22:07:30 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w6DM6cmW014568 for ; Fri, 13 Jul 2018 18:06:38 -0400 Received: by smtp.corp.redhat.com (Postfix) id 7CBF02010CD0; Fri, 13 Jul 2018 22:06:38 +0000 (UTC) Received: from mx1.redhat.com (ext-mx08.extmail.prod.ext.phx2.redhat.com [10.5.110.32]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 707F82010CCE for ; Fri, 13 Jul 2018 22:06:36 +0000 (UTC) Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D233BC056807 for ; Fri, 13 Jul 2018 22:06:33 +0000 (UTC) Received: by mail-wr1-f68.google.com with SMTP id t6-v6so26422738wrn.7 for ; Fri, 13 Jul 2018 15:06:33 -0700 (PDT) Received: from clem.localdomain ([2a01:e34:ec25:e330:f2d5:bfff:fe6e:3278]) by smtp.gmail.com with ESMTPSA id z62-v6sm6985941wmc.10.2018.07.13.15.06.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 Jul 2018 15:06:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=6C7DbdkZrvtIJggxyAKprdLsfy2Yh2vdRCohUR4qWAE=; b=mg3CptXji/WwSdDmGjmBRZrQYFYXhS8wOptgin9BHx0NUXO3lfQ8ZYM1caIfm3IWo8 DJZXzf5IFm4geiqeMMN+pMJ+EzLqYTXMb5SI1ETuKEi8biEIFSQFGisPrpH0ghI+AVsl RMiCU8OWHrpEbYx9wHYqAI7d+X0F7CPqIw/NNHMP411q0xHi9VBuHeNgssZYPKNhe+R3 bvcI+Z1dLhudT1B9tIqGNgi9X10H9GRK3dbFetCucDaUdPZw4tUN4AvGvhWGW3agqUfc y5NICNJFqwEJfGvIn6ZmOF2DJgKWg7rsXCnLxAu8T1xu9G7OsmWrqFpyZ1LT/JcTSgsd wotA== X-Gm-Message-State: AOUpUlElPK6DiiruN6htsAITJZ/WnztV9MzveFkp4Y1SNoEAok3CcCma yLjxgOB7XS68JC3m93FOKBqV8g== X-Google-Smtp-Source: AAOMgpcUY5+kzqDINIyfxaiL2gpwknd8tZUXp2nkfN9n2UawjTihWYa5u5vBNrMOkuxPm25NPpU9bA== X-Received: by 2002:adf:b726:: with SMTP id l38-v6mr6323314wre.115.1531519592254; Fri, 13 Jul 2018 15:06:32 -0700 (PDT) From: clem@lse.epita.fr To: libvir-list@redhat.com Date: Sat, 14 Jul 2018 00:06:13 +0200 Message-Id: <20180713220615.31054-2-clem@lse.epita.fr> In-Reply-To: <20180713220615.31054-1-clem@lse.epita.fr> References: <20180713220615.31054-1-clem@lse.epita.fr> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Fri, 13 Jul 2018 22:06:34 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Fri, 13 Jul 2018 22:06:34 +0000 (UTC) for IP:'209.85.221.68' DOMAIN:'mail-wr1-f68.google.com' HELO:'mail-wr1-f68.google.com' FROM:'clementinehayat@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.488 (FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_PASS) 209.85.221.68 mail-wr1-f68.google.com 209.85.221.68 mail-wr1-f68.google.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.32 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.25 X-loop: libvir-list@redhat.com Cc: Clementine Hayat Subject: [libvirt] [PATCH 1/3] configure: Introduce libiscsi in build system 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.25 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Fri, 13 Jul 2018 22:07:31 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Clementine Hayat The minimal required version is 1.18.0 because the synchrounous function needed were introduced here. Signed-off-by: Clementine Hayat --- configure.ac | 3 +++ m4/virt-libiscsi.m4 | 30 ++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 m4/virt-libiscsi.m4 diff --git a/configure.ac b/configure.ac index a87ca06854..c668630a79 100644 --- a/configure.ac +++ b/configure.ac @@ -250,6 +250,7 @@ LIBVIRT_ARG_FIREWALLD LIBVIRT_ARG_FUSE LIBVIRT_ARG_GLUSTER LIBVIRT_ARG_HAL +LIBVIRT_ARG_LIBISCSI LIBVIRT_ARG_LIBPCAP LIBVIRT_ARG_LIBSSH LIBVIRT_ARG_LIBXML @@ -290,6 +291,7 @@ LIBVIRT_CHECK_FUSE LIBVIRT_CHECK_GLUSTER LIBVIRT_CHECK_GNUTLS LIBVIRT_CHECK_HAL +LIBVIRT_CHECK_LIBISCSI LIBVIRT_CHECK_LIBNL LIBVIRT_CHECK_LIBPARTED LIBVIRT_CHECK_LIBPCAP @@ -970,6 +972,7 @@ LIBVIRT_RESULT_FUSE LIBVIRT_RESULT_GLUSTER LIBVIRT_RESULT_GNUTLS LIBVIRT_RESULT_HAL +LIBVIRT_RESULT_LIBISCSI LIBVIRT_RESULT_LIBNL LIBVIRT_RESULT_LIBPCAP LIBVIRT_RESULT_LIBSSH diff --git a/m4/virt-libiscsi.m4 b/m4/virt-libiscsi.m4 new file mode 100644 index 0000000000..2747f00ec4 --- /dev/null +++ b/m4/virt-libiscsi.m4 @@ -0,0 +1,30 @@ +dnl Libiscsi library +dnl +dnl Copyright (C) 2018 Clementine Hayat. +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License, or (at your option) any later version. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library. If not, see +dnl . +dnl + +AC_DEFUN([LIBVIRT_ARG_LIBISCSI],[ + LIBVIRT_ARG_WITH_FEATURE([LIBISCSI], [libiscsi], [check], [1.18.0]) +]) + +AC_DEFUN([LIBVIRT_CHECK_LIBISCSI],[ + LIBVIRT_CHECK_PKG([LIBISCSI], [libiscsi], [1.18.0]) +]) + +AC_DEFUN([LIBVIRT_RESULT_LIBISCSI],[ + LIBVIRT_RESULT_LIB(LIBISCSI) +]) --=20 2.17.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat May 18 12:29:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1531519646939652.2978770821279; Fri, 13 Jul 2018 15:07:26 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 44E1930E6857; Fri, 13 Jul 2018 22:07:25 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 11333D25B; Fri, 13 Jul 2018 22:07:25 +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 B2B0918037EF; Fri, 13 Jul 2018 22:07:24 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w6DM6bOS014561 for ; Fri, 13 Jul 2018 18:06:37 -0400 Received: by smtp.corp.redhat.com (Postfix) id 2E2B4308BDAE; Fri, 13 Jul 2018 22:06:37 +0000 (UTC) Received: from mx1.redhat.com (ext-mx18.extmail.prod.ext.phx2.redhat.com [10.5.110.47]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2249A308BDA9 for ; Fri, 13 Jul 2018 22:06:37 +0000 (UTC) Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D932630820D6 for ; Fri, 13 Jul 2018 22:06:34 +0000 (UTC) Received: by mail-wr1-f66.google.com with SMTP id c13-v6so26396100wrt.1 for ; Fri, 13 Jul 2018 15:06:34 -0700 (PDT) Received: from clem.localdomain ([2a01:e34:ec25:e330:f2d5:bfff:fe6e:3278]) by smtp.gmail.com with ESMTPSA id z62-v6sm6985941wmc.10.2018.07.13.15.06.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 Jul 2018 15:06:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Pd30RocUKFzykENSx24XwTqO5HJzt1pUXvt4uGqihps=; b=pSNKfrU23nOrjbcSceqpErCetENS3OjWUL0V2xhf8/L/5ywXrfWZAvIZr/Qju6w8B6 S0/7Qj82QmPnaj3pJ6PC8liPuhXREixwTEVEn/8wk53x7Vp9phi7n5AlOOvua3IwnhrT PerhG+6Ka0/sGvUuRtOj+gS17hbeM0PQ3B8gJqSLxNjNIb0jZWmmDPHhunIe3tSPzxGA 6S9JsrXojQmp0EONkqexqFOrMlEPxtF44x6kO+xuGLDgCNmE22A/ZohQxcTZLaP1Z24z ib03uXrF0KKfgi8R0EXO8eHG/ahfq8aN7Unmnhx/7rOC9+OaEU0HdHY/8+JT0jXKaCxG lRnw== X-Gm-Message-State: AOUpUlEFlfysS7f2N5DzbteZONn6kN5FfnDzVHusBgUDVuvJKvyBf7Zf gNfb7N4cZ4VspIPEbT/Q0EhD2g== X-Google-Smtp-Source: AAOMgpdKfLuDbmKlnPIdBXfZOL4bsL7qLpKd/R2vBrRESd/oSrgHCPuCqIcs4dH593tGtIwBXzUepA== X-Received: by 2002:adf:fc45:: with SMTP id e5-v6mr5985726wrs.157.1531519593206; Fri, 13 Jul 2018 15:06:33 -0700 (PDT) From: clem@lse.epita.fr To: libvir-list@redhat.com Date: Sat, 14 Jul 2018 00:06:14 +0200 Message-Id: <20180713220615.31054-3-clem@lse.epita.fr> In-Reply-To: <20180713220615.31054-1-clem@lse.epita.fr> References: <20180713220615.31054-1-clem@lse.epita.fr> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.47]); Fri, 13 Jul 2018 22:06:35 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.47]); Fri, 13 Jul 2018 22:06:35 +0000 (UTC) for IP:'209.85.221.66' DOMAIN:'mail-wr1-f66.google.com' HELO:'mail-wr1-f66.google.com' FROM:'clementinehayat@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.488 (FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_PASS) 209.85.221.66 mail-wr1-f66.google.com 209.85.221.66 mail-wr1-f66.google.com X-Scanned-By: MIMEDefang 2.84 on 10.5.110.47 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.24 X-loop: libvir-list@redhat.com Cc: Clementine Hayat Subject: [libvirt] [PATCH 2/3] storage: Introduce iscsi_direct pool type 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Fri, 13 Jul 2018 22:07:26 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Clementine Hayat Signed-off-by: Clementine Hayat --- configure.ac | 6 ++- m4/virt-storage-iscsi-direct.m4 | 41 +++++++++++++++++++++ src/conf/domain_conf.c | 1 + src/conf/storage_conf.c | 31 ++++++++++++++-- src/conf/storage_conf.h | 1 + src/conf/virstorageobj.c | 2 + src/storage/Makefile.inc.am | 21 +++++++++++ src/storage/storage_backend.c | 6 +++ src/storage/storage_backend_iscsi_direct.c | 43 ++++++++++++++++++++++ src/storage/storage_backend_iscsi_direct.h | 6 +++ src/storage/storage_driver.c | 1 + tools/virsh-pool.c | 3 ++ 12 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 m4/virt-storage-iscsi-direct.m4 create mode 100644 src/storage/storage_backend_iscsi_direct.c create mode 100644 src/storage/storage_backend_iscsi_direct.h diff --git a/configure.ac b/configure.ac index c668630a79..87ac4dc2c3 100644 --- a/configure.ac +++ b/configure.ac @@ -564,6 +564,7 @@ LIBVIRT_STORAGE_ARG_DIR LIBVIRT_STORAGE_ARG_FS LIBVIRT_STORAGE_ARG_LVM LIBVIRT_STORAGE_ARG_ISCSI +LIBVIRT_STORAGE_ARG_ISCSI_DIRECT LIBVIRT_STORAGE_ARG_SCSI LIBVIRT_STORAGE_ARG_MPATH LIBVIRT_STORAGE_ARG_DISK @@ -578,6 +579,7 @@ if test "$with_libvirtd" =3D "no"; then with_storage_fs=3Dno with_storage_lvm=3Dno with_storage_iscsi=3Dno + with_storage_iscsi_direct=3Dno with_storage_scsi=3Dno with_storage_mpath=3Dno with_storage_disk=3Dno @@ -598,6 +600,7 @@ LIBVIRT_STORAGE_CHECK_DIR LIBVIRT_STORAGE_CHECK_FS LIBVIRT_STORAGE_CHECK_LVM LIBVIRT_STORAGE_CHECK_ISCSI +LIBVIRT_STORAGE_CHECK_ISCSI_DIRECT LIBVIRT_STORAGE_CHECK_SCSI LIBVIRT_STORAGE_CHECK_MPATH LIBVIRT_STORAGE_CHECK_DISK @@ -608,7 +611,7 @@ LIBVIRT_STORAGE_CHECK_ZFS LIBVIRT_STORAGE_CHECK_VSTORAGE =20 with_storage=3Dno -for backend in dir fs lvm iscsi scsi mpath rbd disk; do +for backend in dir fs lvm iscsi iscsi_direct scsi mpath rbd disk; do if eval test \$with_storage_$backend =3D yes; then with_storage=3Dyes break @@ -936,6 +939,7 @@ LIBVIRT_STORAGE_RESULT_DIR LIBVIRT_STORAGE_RESULT_FS LIBVIRT_STORAGE_RESULT_LVM LIBVIRT_STORAGE_RESULT_ISCSI +LIBVIRT_STORAGE_RESULT_ISCSI_DIRECT LIBVIRT_STORAGE_RESULT_SCSI LIBVIRT_STORAGE_RESULT_MPATH LIBVIRT_STORAGE_RESULT_DISK diff --git a/m4/virt-storage-iscsi-direct.m4 b/m4/virt-storage-iscsi-direct= .m4 new file mode 100644 index 0000000000..cc2d490352 --- /dev/null +++ b/m4/virt-storage-iscsi-direct.m4 @@ -0,0 +1,41 @@ +dnl Iscsi-direct storage +dnl +dnl Copyright (C) 2018 Clementine Hayat. +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License, or (at your option) any later version. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library. If not, see +dnl . +dnl + +AC_DEFUN([LIBVIRT_STORAGE_ARG_ISCSI_DIRECT], [ + LIBVIRT_ARG_WITH_FEATURE([STORAGE_ISCSI_DIRECT], + [iscsi-direct backend for the storage driver], + [check]) +]) + +AC_DEFUN([LIBVIRT_STORAGE_CHECK_ISCSI_DIRECT], [ + AC_REQUIRE([LIBVIRT_CHECK_LIBISCSI]) + if test "$with_storage_iscsi_direct" =3D "check"; then + with_storage_iscsi_direct=3D$with_libiscsi + fi + if test "$with_storage_iscsi_direct" =3D "yes"; then + AC_DEFINE_UNQUOTED([WITH_STORAGE_ISCSI_DIRECT], [1], + [whether iSCSI backend for storage driver is enable= d]) + fi + AM_CONDITIONAL([WITH_STORAGE_ISCSI_DIRECT], + [test "$with_storage_iscsi_direct" =3D "yes"]) +]) + +AC_DEFUN([LIBVIRT_STORAGE_RESULT_ISCSI_DIRECT], [ + LIBVIRT_RESULT([iscsi-direct], [$with_storage_iscsi_direct]) +]) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 7396616eda..0a9509de0b 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -30163,6 +30163,7 @@ virDomainDiskTranslateSourcePool(virDomainDiskDefPt= r def) =20 break; =20 + case VIR_STORAGE_POOL_ISCSI_DIRECT: case VIR_STORAGE_POOL_ISCSI: if (def->startupPolicy) { virReportError(VIR_ERR_XML_ERROR, "%s", diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 5036ab9ef8..7a4b00ad8c 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -62,9 +62,9 @@ VIR_ENUM_IMPL(virStoragePool, VIR_STORAGE_POOL_LAST, "dir", "fs", "netfs", "logical", "disk", "iscsi", - "scsi", "mpath", "rbd", - "sheepdog", "gluster", "zfs", - "vstorage") + "iscsi-direct", "scsi", "mpath", + "rbd", "sheepdog", "gluster", + "zfs", "vstorage") =20 VIR_ENUM_IMPL(virStoragePoolFormatFileSystem, VIR_STORAGE_POOL_FS_LAST, @@ -207,6 +207,16 @@ static virStoragePoolTypeInfo poolTypeInfo[] =3D { .formatToString =3D virStoragePoolFormatDiskTypeToString, } }, + {.poolType =3D VIR_STORAGE_POOL_ISCSI_DIRECT, + .poolOptions =3D { + .flags =3D (VIR_STORAGE_POOL_SOURCE_HOST | + VIR_STORAGE_POOL_SOURCE_NETWORK | + VIR_STORAGE_POOL_SOURCE_INITIATOR_IQN), + }, + .volOptions =3D { + .formatToString =3D virStoragePoolFormatDiskTypeToString, + } + }, {.poolType =3D VIR_STORAGE_POOL_SCSI, .poolOptions =3D { .flags =3D (VIR_STORAGE_POOL_SOURCE_ADAPTER), @@ -802,6 +812,18 @@ virStoragePoolDefParseXML(xmlXPathContextPtr ctxt) "./target/permissions") < 0) goto error; } + if (ret->type =3D=3D VIR_STORAGE_POOL_ISCSI_DIRECT) { + if (!ret->source.initiator.iqn) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("missing storage pool initiator iqn")); + goto error; + } + if (!ret->source.ndevice) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("missing storage pool device path")); + goto error; + } + } =20 cleanup: VIR_FREE(uuid); @@ -1004,7 +1026,8 @@ virStoragePoolDefFormatBuf(virBufferPtr buf, * files, so they don't have a target */ if (def->type !=3D VIR_STORAGE_POOL_RBD && def->type !=3D VIR_STORAGE_POOL_SHEEPDOG && - def->type !=3D VIR_STORAGE_POOL_GLUSTER) { + def->type !=3D VIR_STORAGE_POOL_GLUSTER && + def->type !=3D VIR_STORAGE_POOL_ISCSI_DIRECT) { virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); =20 diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h index 15dfd8becf..858623783d 100644 --- a/src/conf/storage_conf.h +++ b/src/conf/storage_conf.h @@ -85,6 +85,7 @@ typedef enum { VIR_STORAGE_POOL_LOGICAL, /* Logical volume groups / volumes */ VIR_STORAGE_POOL_DISK, /* Disk partitions */ VIR_STORAGE_POOL_ISCSI, /* iSCSI targets */ + VIR_STORAGE_POOL_ISCSI_DIRECT, /* iSCSI targets using libiscsi */ VIR_STORAGE_POOL_SCSI, /* SCSI HBA */ VIR_STORAGE_POOL_MPATH, /* Multipath devices */ VIR_STORAGE_POOL_RBD, /* RADOS Block Device */ diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index e66b2ebfb2..1c45bb71b9 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -1838,11 +1838,13 @@ virStoragePoolObjSourceFindDuplicateCb(const void *= payload, break; =20 case VIR_STORAGE_POOL_ISCSI: + case VIR_STORAGE_POOL_ISCSI_DIRECT: case VIR_STORAGE_POOL_FS: case VIR_STORAGE_POOL_LOGICAL: case VIR_STORAGE_POOL_DISK: case VIR_STORAGE_POOL_ZFS: if ((data->def->type =3D=3D VIR_STORAGE_POOL_ISCSI || + data->def->type =3D=3D VIR_STORAGE_POOL_ISCSI_DIRECT || data->def->type =3D=3D VIR_STORAGE_POOL_FS || data->def->type =3D=3D VIR_STORAGE_POOL_LOGICAL || data->def->type =3D=3D VIR_STORAGE_POOL_DISK || diff --git a/src/storage/Makefile.inc.am b/src/storage/Makefile.inc.am index ea98c0ee52..d81864f5b9 100644 --- a/src/storage/Makefile.inc.am +++ b/src/storage/Makefile.inc.am @@ -31,6 +31,11 @@ STORAGE_DRIVER_ISCSI_SOURCES =3D \ storage/storage_backend_iscsi.c \ $(NULL) =20 +STORAGE_DRIVER_ISCSI_DIRECT_SOURCES =3D \ + storage/storage_backend_iscsi_direct.h \ + storage/storage_backend_iscsi_direct.c \ + $(NULL) + STORAGE_DRIVER_SCSI_SOURCES =3D \ storage/storage_backend_scsi.h \ storage/storage_backend_scsi.c \ @@ -89,6 +94,7 @@ EXTRA_DIST +=3D \ $(STORAGE_FILE_FS_SOURCES) \ $(STORAGE_DRIVER_LVM_SOURCES) \ $(STORAGE_DRIVER_ISCSI_SOURCES) \ + $(STORAGE_DRIVER_ISCSI_DIRECT_SOURCES) \ $(STORAGE_DRIVER_SCSI_SOURCES) \ $(STORAGE_DRIVER_MPATH_SOURCES) \ $(STORAGE_DRIVER_DISK_SOURCES) \ @@ -193,6 +199,21 @@ libvirt_storage_backend_iscsi_la_LIBADD =3D \ $(NULL) endif WITH_STORAGE_ISCSI =20 +if WITH_STORAGE_ISCSI_DIRECT +libvirt_storage_backend_iscsi_direct_la_SOURCES =3D $(STORAGE_DRIVER_ISCSI= _DIRECT_SOURCES) +libvirt_storage_backend_iscsi_direct_la_CFLAGS =3D \ + $(LIBISCSI_CFLAGS) \ + $(AM_CFLAGS) \ + $(NULL) + +storagebackend_LTLIBRARIES +=3D libvirt_storage_backend_iscsi-direct.la +libvirt_storage_backend_iscsi_direct_la_LDFLAGS =3D $(AM_LDFLAGS_MOD) +libvirt_storage_backend_iscsi_direct_la_LIBADD =3D \ + libvirt.la \ + ../gnulib/lib/libgnu.la \ + $(NULL) +endif WITH_STORAGE_ISCSI_DIRECT + if WITH_STORAGE_SCSI libvirt_storage_backend_scsi_la_SOURCES =3D $(STORAGE_DRIVER_SCSI_SOURCES) libvirt_storage_backend_scsi_la_CFLAGS =3D \ diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index 7d226f3d3a..e7fbc37eb1 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -43,6 +43,9 @@ #if WITH_STORAGE_ISCSI # include "storage_backend_iscsi.h" #endif +#if WITH_STORAGE_ISCSI_DIRECT +# include "storage_backend_iscsi_direct.h" +#endif #if WITH_STORAGE_SCSI # include "storage_backend_scsi.h" #endif @@ -122,6 +125,9 @@ virStorageBackendDriversRegister(bool allbackends ATTRI= BUTE_UNUSED) #if WITH_STORAGE_ISCSI VIR_STORAGE_BACKEND_REGISTER(virStorageBackendISCSIRegister, "iscsi"); #endif +#if WITH_STORAGE_ISCSI_DIRECT + VIR_STORAGE_BACKEND_REGISTER(virStorageBackendISCSIDirectRegister, "is= csi-direct"); +#endif #if WITH_STORAGE_SCSI VIR_STORAGE_BACKEND_REGISTER(virStorageBackendSCSIRegister, "scsi"); #endif diff --git a/src/storage/storage_backend_iscsi_direct.c b/src/storage/stora= ge_backend_iscsi_direct.c new file mode 100644 index 0000000000..e3c1f75b42 --- /dev/null +++ b/src/storage/storage_backend_iscsi_direct.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include +#include + +#include "datatypes.h" +#include "driver.h" +#include "storage_backend_iscsi_direct.h" +#include "storage_util.h" +#include "virlog.h" +#include "virobject.h" + +#define VIR_FROM_THIS VIR_FROM_STORAGE + +VIR_LOG_INIT("storage.storage_backend_iscsi_direct"); + + +static int +virStorageBackendISCSIDirectCheckPool(virStoragePoolObjPtr pool ATTRIBUTE_= UNUSED, + bool *isActive ATTRIBUTE_UNUSED) +{ + return 0; +} + +static int +virStorageBackendISCSIDirectRefreshPool(virStoragePoolObjPtr pool ATTRIBUT= E_UNUSED) +{ + return 0; +} + +virStorageBackend virStorageBackendISCSIDirect =3D { + .type =3D VIR_STORAGE_POOL_ISCSI_DIRECT, + + .checkPool =3D virStorageBackendISCSIDirectCheckPool, + .refreshPool =3D virStorageBackendISCSIDirectRefreshPool, +}; + +int +virStorageBackendISCSIDirectRegister(void) +{ + return virStorageBackendRegister(&virStorageBackendISCSIDirect); +} diff --git a/src/storage/storage_backend_iscsi_direct.h b/src/storage/stora= ge_backend_iscsi_direct.h new file mode 100644 index 0000000000..545579daf7 --- /dev/null +++ b/src/storage/storage_backend_iscsi_direct.h @@ -0,0 +1,6 @@ +#ifndef __VIR_STORAGE_BACKEND_ISCSI_H__ +# define __VIR_STORAGE_BACKEND_ISCSI_H__ + +int virStorageBackendISCSIDirectRegister(void); + +#endif /* __VIR_STORAGE_BACKEND_ISCSI_H__ */ diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 8070d159ea..c108f026ce 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -1566,6 +1566,7 @@ storageVolLookupByPathCallback(virStoragePoolObjPtr o= bj, case VIR_STORAGE_POOL_LOGICAL: case VIR_STORAGE_POOL_DISK: case VIR_STORAGE_POOL_ISCSI: + case VIR_STORAGE_POOL_ISCSI_DIRECT: case VIR_STORAGE_POOL_SCSI: case VIR_STORAGE_POOL_MPATH: case VIR_STORAGE_POOL_VSTORAGE: diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c index cc49a5b96d..4604b05020 100644 --- a/tools/virsh-pool.c +++ b/tools/virsh-pool.c @@ -1203,6 +1203,9 @@ cmdPoolList(vshControl *ctl, const vshCmd *cmd ATTRIB= UTE_UNUSED) case VIR_STORAGE_POOL_ISCSI: flags |=3D VIR_CONNECT_LIST_STORAGE_POOLS_ISCSI; break; + case VIR_STORAGE_POOL_ISCSI_DIRECT: + flags |=3D VIR_CONNECT_LIST_STORAGE_POOLS_ISCSI; + break; case VIR_STORAGE_POOL_SCSI: flags |=3D VIR_CONNECT_LIST_STORAGE_POOLS_SCSI; break; --=20 2.17.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat May 18 12:29:46 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1531519628075274.77256201846956; Fri, 13 Jul 2018 15:07:08 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6E747C049D4B; Fri, 13 Jul 2018 22:07:06 +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 2B2F110694FC; Fri, 13 Jul 2018 22:07:06 +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 C483F4A465; Fri, 13 Jul 2018 22:07:05 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w6DM6flt014586 for ; Fri, 13 Jul 2018 18:06:41 -0400 Received: by smtp.corp.redhat.com (Postfix) id 445805D761; Fri, 13 Jul 2018 22:06:41 +0000 (UTC) Received: from mx1.redhat.com (ext-mx07.extmail.prod.ext.phx2.redhat.com [10.5.110.31]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3AB4C5D75A for ; Fri, 13 Jul 2018 22:06:37 +0000 (UTC) Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CF31AC049D5C for ; Fri, 13 Jul 2018 22:06:35 +0000 (UTC) Received: by mail-wr1-f49.google.com with SMTP id b15-v6so26473668wrv.10 for ; Fri, 13 Jul 2018 15:06:35 -0700 (PDT) Received: from clem.localdomain ([2a01:e34:ec25:e330:f2d5:bfff:fe6e:3278]) by smtp.gmail.com with ESMTPSA id z62-v6sm6985941wmc.10.2018.07.13.15.06.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 13 Jul 2018 15:06:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Gx5jcsc1P56Jl3Nr3RFiiZmkFU9jklALJEddyhGcR+0=; b=qe0sNkRoFnu2agnyzyYGp+kT8wrzh71YUHCFKs7/4rq0rgGBUC4N9nhEvAA4JiqBEd yRvLKJL0hTcbiPOVo9t0WEt/BS5GdrGof/owdsqto1lFQ/Ir1dv25f4N7CBIon+QzKXE nA1iiYSgbPy9wZ13QJW4AwK3E2en2SmJRSAEMTTHJP0kAJZJGonquWFE+gMXmwXqMyTJ wtRdO0H9qf7RI92jCgpJrqgdKq57QxW9RXx7A0nkwHnXKXknoIZh1HvehQ2IqWlN63z2 4VqrltxiXRW6EDfiOU9RZe0m9gE8b1WdE+WNCCoAMbji7RoSCL0LSux6y2+u9ZjEA2DQ q6CA== X-Gm-Message-State: AOUpUlEYUxz/PCHTT0V9Z8etqWLokIZ4ENHdhm0argjLpC6zHvQsT5gO EcBair1zWUEdMAXE1pGB3zSTTw== X-Google-Smtp-Source: AAOMgpdhGL8gQUUUh10nW9Ew5CWJCElXqFYEbmHifpy3k1GWRJogW0wwKkbSdZB0/N3x7mZ7XJfiKg== X-Received: by 2002:adf:9d81:: with SMTP id p1-v6mr6307333wre.12.1531519594132; Fri, 13 Jul 2018 15:06:34 -0700 (PDT) From: clem@lse.epita.fr To: libvir-list@redhat.com Date: Sat, 14 Jul 2018 00:06:15 +0200 Message-Id: <20180713220615.31054-4-clem@lse.epita.fr> In-Reply-To: <20180713220615.31054-1-clem@lse.epita.fr> References: <20180713220615.31054-1-clem@lse.epita.fr> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 13 Jul 2018 22:06:36 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 13 Jul 2018 22:06:36 +0000 (UTC) for IP:'209.85.221.49' DOMAIN:'mail-wr1-f49.google.com' HELO:'mail-wr1-f49.google.com' FROM:'clementinehayat@gmail.com' RCPT:'' X-RedHat-Spam-Score: 0.489 (FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE, SPF_PASS) 209.85.221.49 mail-wr1-f49.google.com 209.85.221.49 mail-wr1-f49.google.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.31 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: Clementine Hayat Subject: [libvirt] [PATCH 3/3] storage: Implement iscsi_direct pool backend 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 13 Jul 2018 22:07:07 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Clementine Hayat We need here libiscsi for the storgae pool backend. For the iscsi-direct storage pool, only checkPool and refreshPool should be necessary. The pool is state-less and just need the informations within the volume to work. Signed-off-by: Clementine Hayat --- m4/virt-storage-iscsi-direct.m4 | 3 + src/storage/Makefile.inc.am | 3 + src/storage/storage_backend_iscsi_direct.c | 407 ++++++++++++++++++++- 3 files changed, 410 insertions(+), 3 deletions(-) diff --git a/m4/virt-storage-iscsi-direct.m4 b/m4/virt-storage-iscsi-direct= .m4 index cc2d490352..dab4414169 100644 --- a/m4/virt-storage-iscsi-direct.m4 +++ b/m4/virt-storage-iscsi-direct.m4 @@ -29,6 +29,9 @@ AC_DEFUN([LIBVIRT_STORAGE_CHECK_ISCSI_DIRECT], [ with_storage_iscsi_direct=3D$with_libiscsi fi if test "$with_storage_iscsi_direct" =3D "yes"; then + if test "$with_libiscsi" =3D "no"; then + AC_MSG_ERROR([Need libiscsi for iscsi-direct storage driver]) + fi AC_DEFINE_UNQUOTED([WITH_STORAGE_ISCSI_DIRECT], [1], [whether iSCSI backend for storage driver is enable= d]) fi diff --git a/src/storage/Makefile.inc.am b/src/storage/Makefile.inc.am index d81864f5b9..bd5ea06f8b 100644 --- a/src/storage/Makefile.inc.am +++ b/src/storage/Makefile.inc.am @@ -202,6 +202,8 @@ endif WITH_STORAGE_ISCSI if WITH_STORAGE_ISCSI_DIRECT libvirt_storage_backend_iscsi_direct_la_SOURCES =3D $(STORAGE_DRIVER_ISCSI= _DIRECT_SOURCES) libvirt_storage_backend_iscsi_direct_la_CFLAGS =3D \ + -I$(srcdir)/conf \ + -I$(srcdir)/secret \ $(LIBISCSI_CFLAGS) \ $(AM_CFLAGS) \ $(NULL) @@ -210,6 +212,7 @@ storagebackend_LTLIBRARIES +=3D libvirt_storage_backend= _iscsi-direct.la libvirt_storage_backend_iscsi_direct_la_LDFLAGS =3D $(AM_LDFLAGS_MOD) libvirt_storage_backend_iscsi_direct_la_LIBADD =3D \ libvirt.la \ + $(LIBISCSI_LIBS) \ ../gnulib/lib/libgnu.la \ $(NULL) endif WITH_STORAGE_ISCSI_DIRECT diff --git a/src/storage/storage_backend_iscsi_direct.c b/src/storage/stora= ge_backend_iscsi_direct.c index e3c1f75b42..f93c8e1e67 100644 --- a/src/storage/storage_backend_iscsi_direct.c +++ b/src/storage/storage_backend_iscsi_direct.c @@ -1,34 +1,435 @@ #include #include +#include +#include +#include #include #include #include =20 #include "datatypes.h" #include "driver.h" +#include "secret_util.h" #include "storage_backend_iscsi_direct.h" #include "storage_util.h" +#include "viralloc.h" +#include "vircommand.h" +#include "virerror.h" +#include "virfile.h" #include "virlog.h" #include "virobject.h" +#include "virstring.h" +#include "virtime.h" +#include "viruuid.h" =20 #define VIR_FROM_THIS VIR_FROM_STORAGE =20 +#define ISCSI_DEFAULT_TARGET_PORT 3260 +#define VIR_ISCSI_TEST_UNIT_TIMEOUT 30 * 1000 + VIR_LOG_INIT("storage.storage_backend_iscsi_direct"); =20 +static struct iscsi_context * +virISCSIDirectCreateContext(const char* initiator_iqn) +{ + struct iscsi_context *iscsi =3D NULL; + + iscsi =3D iscsi_create_context(initiator_iqn); + if (!iscsi) + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to create iscsi context for %s"), + initiator_iqn); + return iscsi; +} + +static char * +virStorageBackendISCSIDirectPortal(virStoragePoolSourcePtr source) +{ + char *portal =3D NULL; + + if (source->nhost !=3D 1) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Expected exactly 1 host for the storage pool")); + return NULL; + } + if (source->hosts[0].port =3D=3D 0) { + ignore_value(virAsprintf(&portal, "%s:%d", + source->hosts[0].name, + ISCSI_DEFAULT_TARGET_PORT)); + } else if (strchr(source->hosts[0].name, ':')) { + ignore_value(virAsprintf(&portal, "[%s]:%d", + source->hosts[0].name, + source->hosts[0].port)); + } else { + ignore_value(virAsprintf(&portal, "%s:%d", + source->hosts[0].name, + source->hosts[0].port)); + } + return portal; +} + +static int +virStorageBackendISCSIDirectSetAuth(struct iscsi_context *iscsi, + virStoragePoolSourcePtr source) +{ + unsigned char *secret_value =3D NULL; + size_t secret_size; + virStorageAuthDefPtr authdef =3D source->auth; + int ret =3D -1; + virConnectPtr conn =3D NULL; + + if (!authdef || authdef->authType =3D=3D VIR_STORAGE_AUTH_TYPE_NONE) + return 0; + + VIR_DEBUG("username=3D'%s' authType=3D%d seclookupdef.type=3D%d", + authdef->username, authdef->authType, authdef->seclookupdef.= type); + + if (authdef->authType !=3D VIR_STORAGE_AUTH_TYPE_CHAP) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("iscsi-direct pool only supports 'chap' auth type= ")); + return ret; + } + + if (!(conn =3D virGetConnectSecret())) + return ret; + + if (virSecretGetSecretString(conn, &authdef->seclookupdef, + VIR_SECRET_USAGE_TYPE_ISCSI, + &secret_value, &secret_size) < 0) + goto cleanup; + + if (iscsi_set_initiator_username_pwd(iscsi, + authdef->username, + (const char *)secret_value) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to set credential: %s"), + iscsi_get_error(iscsi)); + goto cleanup; + } + + ret =3D 0; + cleanup: + VIR_DISPOSE_N(secret_value, secret_size); + virObjectUnref(conn); + return ret; +} + +static int +virISCSIDirectSetContext(struct iscsi_context *iscsi, + const char *target_name) +{ + if (iscsi_init_transport(iscsi, TCP_TRANSPORT) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to init transport: %s"), + iscsi_get_error(iscsi)); + return -1; + } + if (iscsi_set_targetname(iscsi, target_name) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to set target name: %s"), + iscsi_get_error(iscsi)); + return -1; + } + if (iscsi_set_session_type(iscsi, ISCSI_SESSION_NORMAL) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to set session type: %s"), + iscsi_get_error(iscsi)); + return -1; + } + return 0; +} =20 static int -virStorageBackendISCSIDirectCheckPool(virStoragePoolObjPtr pool ATTRIBUTE_= UNUSED, - bool *isActive ATTRIBUTE_UNUSED) +virISCSIDirectConnect(struct iscsi_context *iscsi, + const char *portal) { + if (iscsi_connect_sync(iscsi, portal) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to connect: %s"), + iscsi_get_error(iscsi)); + return -1; + } + if (iscsi_login_sync(iscsi) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to login: %s"), + iscsi_get_error(iscsi)); + return -1; + } return 0; } =20 +static struct scsi_reportluns_list * +virISCSIDirectReportLuns(struct iscsi_context *iscsi) +{ + struct scsi_task *task =3D NULL; + struct scsi_reportluns_list *list =3D NULL; + int full_size; + + if (!(task =3D iscsi_reportluns_sync(iscsi, 0, 16))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to reportluns: %s"), + iscsi_get_error(iscsi)); + goto cleanup; + } + + full_size =3D scsi_datain_getfullsize(task); + + if (full_size > task->datain.size) { + scsi_free_scsi_task(task); + if (!(task =3D iscsi_reportluns_sync(iscsi, 0, full_size))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to reportluns: %s"), + iscsi_get_error(iscsi)); + goto cleanup; + } + } + + if (!(list =3D scsi_datain_unmarshall(task))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to unmarshall reportluns: %s"), + iscsi_get_error(iscsi)); + goto cleanup; + } + + cleanup: + scsi_free_scsi_task(task); + return list; +} + static int -virStorageBackendISCSIDirectRefreshPool(virStoragePoolObjPtr pool ATTRIBUT= E_UNUSED) +virISCSIDirectTestUnitReady(struct iscsi_context *iscsi, + int lun) { + struct scsi_task *task =3D NULL; + int ret =3D -1; + virTimeBackOffVar timebackoff; + + if (virTimeBackOffStart(&timebackoff, 1, + VIR_ISCSI_TEST_UNIT_TIMEOUT) < 0) + goto cleanup; + + do { + if (!(task =3D iscsi_testunitready_sync(iscsi, lun))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed testunitready: %s"), + iscsi_get_error(iscsi)); + goto cleanup; + } + + if (task->status !=3D SCSI_STATUS_CHECK_CONDITION || + task->sense.key !=3D SCSI_SENSE_UNIT_ATTENTION || + task->sense.ascq !=3D SCSI_SENSE_ASCQ_BUS_RESET) + break; + + scsi_free_scsi_task(task); + } while (virTimeBackOffWait(&timebackoff)); + + if (task->status !=3D SCSI_STATUS_GOOD) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed testunitready: %s"), + iscsi_get_error(iscsi)); + goto cleanup; + } + + ret =3D 0; + cleanup: + scsi_free_scsi_task(task); + return ret; +} + +static int +virISCSIDirectSetVolumeAttributes(virStoragePoolObjPtr pool, + virStorageVolDefPtr vol, + int lun, + char *portal) +{ + virStoragePoolDefPtr def =3D virStoragePoolObjGetDef(pool); + + if (virAsprintf(&vol->name, "%u", lun) < 0) + return -1; + if (virAsprintf(&vol->key, "ip-%s-iscsi-%s-lun-%u", portal, + def->source.devices[0].path, lun) < 0) + return -1; + if (virAsprintf(&vol->target.path, "ip-%s-iscsi-%s-lun-%u", portal, + def->source.devices[0].path, lun) < 0) + return -1; return 0; } =20 +static int +virISCSIDirectSetVolumeCapacity(struct iscsi_context *iscsi, + virStorageVolDefPtr vol, int lun) +{ + struct scsi_task *task =3D NULL; + struct scsi_inquiry_standard *inq =3D NULL; + long long size =3D 0; + int ret =3D -1; + + if (!(task =3D iscsi_inquiry_sync(iscsi, lun, 0, 0, 64)) || + task->status !=3D SCSI_STATUS_GOOD) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to send inquiry command: %s"), + iscsi_get_error(iscsi)); + goto cleanup; + } + + if (!(inq =3D scsi_datain_unmarshall(task))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to unmarshall reply: %s"), + iscsi_get_error(iscsi)); + goto cleanup; + } + + if (inq->device_type =3D=3D SCSI_INQUIRY_PERIPHERAL_DEVICE_TYPE_DIRECT= _ACCESS) { + struct scsi_readcapacity10 *rc10 =3D NULL; + + scsi_free_scsi_task(task); + task =3D NULL; + + if (!(task =3D iscsi_readcapacity10_sync(iscsi, lun, 0, 0)) || + task->status !=3D SCSI_STATUS_GOOD) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to get capacity of lun: %s"), + iscsi_get_error(iscsi)); + goto cleanup; + } + + if (!(rc10 =3D scsi_datain_unmarshall(task))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to unmarshall reply: %s"), + iscsi_get_error(iscsi)); + goto cleanup; + } + + size =3D rc10->block_size; + size *=3D rc10->lba; + vol->target.capacity =3D size; + vol->target.allocation =3D size; + + } + + ret =3D 0; + cleanup: + scsi_free_scsi_task(task); + return ret; +} + +static int +virISCSIDirectRefreshVol(virStoragePoolObjPtr pool, + struct iscsi_context *iscsi, + int lun, + char *portal) +{ + virStoragePoolDefPtr def =3D virStoragePoolObjGetDef(pool); + virStorageVolDefPtr vol =3D NULL; + int ret =3D -1; + + virStoragePoolObjClearVols(pool); + if (virISCSIDirectTestUnitReady(iscsi, lun) < 0) + goto cleanup; + + if (VIR_ALLOC(vol) < 0) + goto cleanup; + + vol->type =3D VIR_STORAGE_VOL_NETWORK; + + if (virISCSIDirectSetVolumeCapacity(iscsi, vol, lun) < 0) + goto cleanup; + + def->capacity +=3D vol->target.capacity; + def->allocation +=3D vol->target.allocation; + + if (virISCSIDirectSetVolumeAttributes(pool, vol, lun, portal) < 0) + goto cleanup; + + if (virStoragePoolObjAddVol(pool, vol) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to create volume: %d"), + lun); + goto cleanup; + } + vol =3D NULL; + + ret =3D 0; + cleanup: + virStorageVolDefFree(vol); + return ret; +} + +static int +virStorageBackendISCSIDirectRefreshVols(virStoragePoolObjPtr pool, + struct iscsi_context *iscsi, + char *portal) +{ + struct scsi_reportluns_list *list =3D NULL; + size_t i; + + if (!(list =3D virISCSIDirectReportLuns(iscsi))) + return -1; + for (i =3D 0; i < list->num; i++) { + if (virISCSIDirectRefreshVol(pool, iscsi, list->luns[i], portal) <= 0) + return -1; + } + + return 0; +} + +static int +virISCSIDirectDisconnect(struct iscsi_context *iscsi) +{ + if (iscsi_logout_sync(iscsi) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to logout: %s"), + iscsi_get_error(iscsi)); + return -1; + } + if (iscsi_disconnect(iscsi) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to disconnect: %s"), + iscsi_get_error(iscsi)); + return -1; + } + return 0; +} + +static int +virStorageBackendISCSIDirectCheckPool(virStoragePoolObjPtr pool, + bool *isActive) +{ + *isActive =3D virStoragePoolObjIsActive(pool); + return 0; +} + +static int +virStorageBackendISCSIDirectRefreshPool(virStoragePoolObjPtr pool) +{ + virStoragePoolDefPtr def =3D virStoragePoolObjGetDef(pool); + struct iscsi_context *iscsi =3D NULL; + char *portal =3D NULL; + int ret =3D -1; + + if (!(iscsi =3D virISCSIDirectCreateContext(def->source.initiator.iqn)= )) + goto cleanup; + if (!(portal =3D virStorageBackendISCSIDirectPortal(&def->source))) + goto cleanup; + if (virStorageBackendISCSIDirectSetAuth(iscsi, &def->source) < 0) + goto cleanup; + if (virISCSIDirectSetContext(iscsi, def->source.devices[0].path) < 0) + goto cleanup; + if (virISCSIDirectConnect(iscsi, portal) < 0) + goto cleanup; + if (virStorageBackendISCSIDirectRefreshVols(pool, iscsi, portal) < 0) + goto disconect; + + ret =3D 0; + disconect: + virISCSIDirectDisconnect(iscsi); + cleanup: + iscsi_destroy_context(iscsi); + VIR_FREE(portal); + return ret; +} + virStorageBackend virStorageBackendISCSIDirect =3D { .type =3D VIR_STORAGE_POOL_ISCSI_DIRECT, =20 --=20 2.17.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list