From nobody Thu May 2 01:08:17 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; dkim=fail; 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 1507583073200813.1834256865358; Mon, 9 Oct 2017 14:04:33 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 99E39C04AC6A; Mon, 9 Oct 2017 21:04:31 +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 D46E460269; Mon, 9 Oct 2017 21:04: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 911A84EE50; Mon, 9 Oct 2017 21:04:29 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v99Ko0b7022375 for ; Mon, 9 Oct 2017 16:50:00 -0400 Received: by smtp.corp.redhat.com (Postfix) id 31AAA5C6BF; Mon, 9 Oct 2017 20:50:00 +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 2C2CF7770D for ; Mon, 9 Oct 2017 20:49:58 +0000 (UTC) Received: from mail-qk0-f176.google.com (mail-qk0-f176.google.com [209.85.220.176]) (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 2EC72C058EBF for ; Mon, 9 Oct 2017 20:49:57 +0000 (UTC) Received: by mail-qk0-f176.google.com with SMTP id o187so22611807qke.7 for ; Mon, 09 Oct 2017 13:49:57 -0700 (PDT) Received: from dawid-fedora.datto.lan ([47.19.105.250]) by smtp.gmail.com with ESMTPSA id y31sm5505361qta.83.2017.10.09.13.49.55 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 09 Oct 2017 13:49:55 -0700 (PDT) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 99E39C04AC6A Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=fail (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 99E39C04AC6A Authentication-Results: mx1.redhat.com; dkim=fail reason="signature verification failed" (2048-bit key) header.d=datto-com.20150623.gappssmtp.com header.i=@datto-com.20150623.gappssmtp.com header.b="lwJ3FXNj" DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 2EC72C058EBF Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=pass (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=dzamirski@datto.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 2EC72C058EBF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=datto-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=jkZU2ZY9cVy6yIN3lwWC/G0rEXDsvW/kZIOEkfYZg7s=; b=lwJ3FXNjzqr6liKNM6RD053wmzufjFVFjDPWL60SVIBdfaSVNcprYMSDSaVleQAgQz fYE3vgNGaUMfaBTW8eOMkrNyyY8Z+ZQDuU/6/d3wAqyjLQUoPV/vJxHQUdF2Pi+R2QVP mTMa3DQFd4VMvcNje7WT+wyBrl4on1Sg/UQa/xBbX7uhqZpuV/Vya1DeZodHu7rrUU/K DgF0U5px1Tea4C9Dh6rJ0JxcWkIFIRV/nGVRNMX3pko6lRC4NLZtqjWVPV2SkOfdpyZA 2hH3bVn8jFjgngL8hEq2Mz9tl474FaoWYcJhgoxNcJf8VRxdFs+mAwlB/WJeNLWgjwgw nZrw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=jkZU2ZY9cVy6yIN3lwWC/G0rEXDsvW/kZIOEkfYZg7s=; b=mCOnz5BX0+RBBoJ09JP8P6AdnVOEB7iDcqJeLmYDlJ8M5HdMs9vD6Gd+QM8i3YN+JW bey/Ug0OE+eFwB7wrGMJ6xRK1q1bkRbAyInsv0+ukXIU+yFunGKMEdIpDMKGSj3T4Pud f/HFaztn41E+SLesx3CvaDtG3eRznbAo5FyOnae+4kD0KPfMDZslDWyM4B+wF79ATflt MBO4fIr1FWn+Rqu25ybq27g9uyQ0ReIYiuIgKR6JhQ8AM3zLhrdfhKKZl8FD78GAQsvU WDhZhrGrhM10EaZ2glYuK3F2HySTx3RuzMRna6VWyo9wHa609t9MzX8pJDq3obxff4+r +c1Q== X-Gm-Message-State: AMCzsaXvghzBgo2ZEhnmP5YffyxeG+NkxCIxqLisQWjQXwsDOA6o6gbg 1fvJfBrWwXC0Ns5INfk4g4zU64o95Hs= X-Google-Smtp-Source: AOwi7QAmDKzVgFfQY3j/hpVHx/mxEy6uWuKq9zgeRokYH6NXLuc+QdKYHFwHdG+67PVpFBC2ZfXkww== X-Received: by 10.55.159.4 with SMTP id i4mr11339778qke.339.1507582196116; Mon, 09 Oct 2017 13:49:56 -0700 (PDT) From: Dawid Zamirski X-Google-Original-From: Dawid Zamirski To: libvir-list@redhat.com Date: Mon, 9 Oct 2017 16:49:49 -0400 Message-Id: <20171009204954.11382-2-dzrudy@gmail.com> In-Reply-To: <20171009204954.11382-1-dzrudy@gmail.com> References: <20171009204954.11382-1-dzrudy@gmail.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 09 Oct 2017 20:49:57 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 09 Oct 2017 20:49:57 +0000 (UTC) for IP:'209.85.220.176' DOMAIN:'mail-qk0-f176.google.com' HELO:'mail-qk0-f176.google.com' FROM:'dzamirski@datto.com' RCPT:'' X-RedHat-Spam-Score: -2.311 (DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, RCVD_IN_SORBS_SPAM, SPF_PASS) 209.85.220.176 mail-qk0-f176.google.com 209.85.220.176 mail-qk0-f176.google.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.32 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 1/6] vbox: Close media when undefining domains. 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.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 09 Oct 2017 21:04:32 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Dawid Zamirski When registering a VM we call OpenMedium on each disk image which adds it to vbox's global media registry. Therefore, we should make sure to call Close when unregistering VM so we cleanup the media registry entries after ourselves - this does not remove disk image files. This follows the behaviour of the VBoxManage unregistervm command. --- src/vbox/vbox_tmpl.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index dffeabde0..ac3b8fa00 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -378,6 +378,8 @@ _unregisterMachine(vboxDriverPtr data, vboxIID *iid, IM= achine **machine) { nsresult rc; vboxArray media =3D VBOX_ARRAY_INITIALIZER; + size_t i; + rc =3D data->vboxObj->vtbl->FindMachine(data->vboxObj, iid->value, mac= hine); if (NS_FAILED(rc)) { virReportError(VIR_ERR_NO_DOMAIN, "%s", @@ -385,12 +387,24 @@ _unregisterMachine(vboxDriverPtr data, vboxIID *iid, = IMachine **machine) return rc; } =20 - /* We're not interested in the array returned by the Unregister method, - * but in the side effect of unregistering the virtual machine. In ord= er - * to call the Unregister method correctly we need to use the vboxArray - * wrapper here. */ rc =3D vboxArrayGetWithUintArg(&media, *machine, (*machine)->vtbl->Unr= egister, - CleanupMode_DetachAllReturnNone); + CleanupMode_DetachAllReturnHardDisksOnly); + + if (NS_FAILED(rc)) + goto cleanup; + + /* close each medium attached to VM to remove from media registry */ + for (i =3D 0; i < media.count; i++) { + IMedium *medium =3D media.items[i]; + + if (!medium) + continue; + + /* it's ok to ignore failure here - e.g. it may be used by another= VM */ + medium->vtbl->Close(medium); + } + + cleanup: vboxArrayUnalloc(&media); return rc; } --=20 2.14.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 01:08:17 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; dkim=fail; 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 1507583373934947.7683014391771; Mon, 9 Oct 2017 14:09:33 -0700 (PDT) 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 mx1.redhat.com (Postfix) with ESMTPS id 86F9581DF6; Mon, 9 Oct 2017 21:09:32 +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 41DBA77710; Mon, 9 Oct 2017 21:09:32 +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 9F61118355D8; Mon, 9 Oct 2017 21:09:31 +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 v99Ko2Ru022396 for ; Mon, 9 Oct 2017 16:50:02 -0400 Received: by smtp.corp.redhat.com (Postfix) id 52C3562468; Mon, 9 Oct 2017 20:50:02 +0000 (UTC) Received: from mx1.redhat.com (ext-mx10.extmail.prod.ext.phx2.redhat.com [10.5.110.39]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 4AEAC62469 for ; Mon, 9 Oct 2017 20:49:59 +0000 (UTC) Received: from mail-qk0-f172.google.com (mail-qk0-f172.google.com [209.85.220.172]) (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 BCACA2579E for ; Mon, 9 Oct 2017 20:49:57 +0000 (UTC) Received: by mail-qk0-f172.google.com with SMTP id b15so22707080qkg.9 for ; Mon, 09 Oct 2017 13:49:57 -0700 (PDT) Received: from dawid-fedora.datto.lan ([47.19.105.250]) by smtp.gmail.com with ESMTPSA id y31sm5505361qta.83.2017.10.09.13.49.56 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 09 Oct 2017 13:49:56 -0700 (PDT) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 86F9581DF6 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=fail (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 86F9581DF6 Authentication-Results: mx1.redhat.com; dkim=fail reason="signature verification failed" (2048-bit key) header.d=datto-com.20150623.gappssmtp.com header.i=@datto-com.20150623.gappssmtp.com header.b="XPhjyECo" DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com BCACA2579E Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=pass (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=dzamirski@datto.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com BCACA2579E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=datto-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=9JYh3BioyuXiexqYNRPjbuIydRAPwlHa5etzRxmy1wI=; b=XPhjyECol3kVkaTVu8qqScCW1BnT1k4Ca/w8vUWZEfNE1Pp/cprCkJzimy26hi6dMU uFJc/E2BGnNIZ23pMR3q1AZfv/W9bv/UYTRPX+yj0JsI00d+rVfHpFjqXBg9poCEP5iw wiylaU3/EE+oOiT4f+sMefrgkbSEbwUlXSVVSK4s84rC9LuIn//XdE2q//MdiHQsNorZ 5s8uOX4k3v8SwZQfcy6hDxVCyecI5rQYnoSjYp0swg+TYnnnAsrSUVab0jRWm57i6uWd lgRR2GaiHTt2j7yh2QgyZ0exW6ocGmZsMEk1cULFJNjMVnx8JzfPeENVPZSdVN78q/Fd mPGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=9JYh3BioyuXiexqYNRPjbuIydRAPwlHa5etzRxmy1wI=; b=qHjlyDadi3Vkdj0SdbLDe6ubPKtd7ZjsuxJUQmEzyQV65gOg8sh/AltkRkBFjWGKb0 eRq0ZaJnzX6af0S5+crX/Z0wCux4zI/4t2PbUGB8nm40qk76AsP6JJmn6r0d9kxHqZP4 hD02N2BnaZb8hn0cVqazCK0cNylR9g3rfrPcld/g0XzrlqFzAEHz4QLFaIOgrE0GFlhF J3GHDPt4dlFcl9tcZjQHsRuv/yb3R1k7laN38XlrrHaAyuYtzuWRiVyOT4KSoqhlrN9u 7+zcFukulx3kLaoHZ0f77Q59FHi52I+9pbpDTaRXS84iPoI/oFMNYCsLazKuFk5Qy7Aq emdA== X-Gm-Message-State: AMCzsaXrr58eWuyQYDHTbfS0MRI7DTWfqg72U6aE4MR+f3WMptBbcPyI cSgkVnXFw+kATD7fb/M9x6B2Y0qm0nM= X-Google-Smtp-Source: AOwi7QAeAKTyABxBWnXCzepnF7D5q0I9FAvyBtkBrHFyT7Rt+/XoAavryHE85Hh+hntt7SNgHOONOg== X-Received: by 10.55.43.227 with SMTP id r96mr11711460qkr.216.1507582196700; Mon, 09 Oct 2017 13:49:56 -0700 (PDT) From: Dawid Zamirski X-Google-Original-From: Dawid Zamirski To: libvir-list@redhat.com Date: Mon, 9 Oct 2017 16:49:50 -0400 Message-Id: <20171009204954.11382-3-dzrudy@gmail.com> In-Reply-To: <20171009204954.11382-1-dzrudy@gmail.com> References: <20171009204954.11382-1-dzrudy@gmail.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 09 Oct 2017 20:49:58 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 09 Oct 2017 20:49:58 +0000 (UTC) for IP:'209.85.220.172' DOMAIN:'mail-qk0-f172.google.com' HELO:'mail-qk0-f172.google.com' FROM:'dzamirski@datto.com' RCPT:'' X-RedHat-Spam-Score: -2.311 (DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, RCVD_IN_SORBS_SPAM, SPF_PASS) 209.85.220.172 mail-qk0-f172.google.com 209.85.220.172 mail-qk0-f172.google.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.39 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 2/6] domain: Allow 'model' attribute for ide controller. 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.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 09 Oct 2017 21:09:33 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Dawid Zamirski The optional values are 'piix3', 'piix4' or 'ich6'. Those will be needed to allow setting IDE controller model in VirtualBox driver. --- docs/schemas/domaincommon.rng | 18 ++++++++++++++++-- src/conf/domain_conf.c | 9 +++++++++ src/conf/domain_conf.h | 9 +++++++++ src/libvirt_private.syms | 2 ++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 4dbda6932..c3f1557f0 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1927,12 +1927,11 @@ - + fdc - ide sata ccid @@ -1993,6 +1992,21 @@ + + + + ide + + + + + piix3 + piix4 + ich6 + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 54be9028d..493bf83ff 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -378,6 +378,11 @@ VIR_ENUM_IMPL(virDomainControllerModelUSB, VIR_DOMAIN_= CONTROLLER_MODEL_USB_LAST, "qemu-xhci", "none") =20 +VIR_ENUM_IMPL(virDomainControllerModelIDE, VIR_DOMAIN_CONTROLLER_MODEL_IDE= _LAST, + "piix3", + "piix4", + "ich6") + VIR_ENUM_IMPL(virDomainFS, VIR_DOMAIN_FS_TYPE_LAST, "mount", "block", @@ -9467,6 +9472,8 @@ virDomainControllerModelTypeFromString(const virDomai= nControllerDef *def, return virDomainControllerModelUSBTypeFromString(model); else if (def->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_PCI) return virDomainControllerModelPCITypeFromString(model); + else if (def->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_IDE) + return virDomainControllerModelIDETypeFromString(model); =20 return -1; } @@ -9482,6 +9489,8 @@ virDomainControllerModelTypeToString(virDomainControl= lerDefPtr def, return virDomainControllerModelUSBTypeToString(model); else if (def->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_PCI) return virDomainControllerModelPCITypeToString(model); + else if (def->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_IDE) + return virDomainControllerModelIDETypeToString(model); =20 return NULL; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index a42efcfa6..d7f4c3f1e 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -748,6 +748,14 @@ typedef enum { VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST } virDomainControllerModelUSB; =20 +typedef enum { + VIR_DOMAIN_CONTROLLER_MODEL_IDE_PIIX3, + VIR_DOMAIN_CONTROLLER_MODEL_IDE_PIIX4, + VIR_DOMAIN_CONTROLLER_MODEL_IDE_ICH6, + + VIR_DOMAIN_CONTROLLER_MODEL_IDE_LAST +} virDomainControllerModelIDE; + # define IS_USB2_CONTROLLER(ctrl) \ (((ctrl)->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_USB) && \ ((ctrl)->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1 || \ @@ -3231,6 +3239,7 @@ VIR_ENUM_DECL(virDomainControllerModelPCI) VIR_ENUM_DECL(virDomainControllerPCIModelName) VIR_ENUM_DECL(virDomainControllerModelSCSI) VIR_ENUM_DECL(virDomainControllerModelUSB) +VIR_ENUM_DECL(virDomainControllerModelIDE) VIR_ENUM_DECL(virDomainFS) VIR_ENUM_DECL(virDomainFSDriver) VIR_ENUM_DECL(virDomainFSAccessMode) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 9243c5591..616b14f82 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -231,6 +231,8 @@ virDomainControllerFindUnusedIndex; virDomainControllerInsert; virDomainControllerInsertPreAlloced; virDomainControllerIsPSeriesPHB; +virDomainControllerModelIDETypeFromString; +virDomainControllerModelIDETypeToString; virDomainControllerModelPCITypeToString; virDomainControllerModelSCSITypeFromString; virDomainControllerModelSCSITypeToString; --=20 2.14.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 01:08:17 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; dkim=fail; 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 1507585201036698.154665488506; Mon, 9 Oct 2017 14:40:01 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5FC71ED250; Mon, 9 Oct 2017 21:39:59 +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 32E9C6155F; Mon, 9 Oct 2017 21:39:59 +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 6A59718355D8; Mon, 9 Oct 2017 21:39:58 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v99Ko9x8022443 for ; Mon, 9 Oct 2017 16:50:09 -0400 Received: by smtp.corp.redhat.com (Postfix) id 34403179D1; Mon, 9 Oct 2017 20:50:09 +0000 (UTC) Received: from mx1.redhat.com (ext-mx10.extmail.prod.ext.phx2.redhat.com [10.5.110.39]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2F43F5ED4D for ; Mon, 9 Oct 2017 20:50:05 +0000 (UTC) Received: from mail-qk0-f171.google.com (mail-qk0-f171.google.com [209.85.220.171]) (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 3667C61478 for ; Mon, 9 Oct 2017 20:49:58 +0000 (UTC) Received: by mail-qk0-f171.google.com with SMTP id f199so11649569qke.2 for ; Mon, 09 Oct 2017 13:49:58 -0700 (PDT) Received: from dawid-fedora.datto.lan ([47.19.105.250]) by smtp.gmail.com with ESMTPSA id y31sm5505361qta.83.2017.10.09.13.49.56 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 09 Oct 2017 13:49:56 -0700 (PDT) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 5FC71ED250 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=fail (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 5FC71ED250 Authentication-Results: mx1.redhat.com; dkim=fail reason="signature verification failed" (2048-bit key) header.d=datto-com.20150623.gappssmtp.com header.i=@datto-com.20150623.gappssmtp.com header.b="WqNO7WMX" DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 3667C61478 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=pass (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=dzamirski@datto.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 3667C61478 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=datto-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=aD4AJGxTy8jFc7Megbn+McS8+SM1uuzEjDMWkLo+DdU=; b=WqNO7WMX1PlX+iZ0Cr40Ki6qKXTvUk4b85Mjjt06s7JufCz/9BYMwQvo1uxfNCr0eR fez2KreyF98MzHCL/ZZ3aCwb33/o264IX4YVMMUNXsYqLNCtaub7az0KXjzKksNVpKnH KnyLs7PWAlJym3X3rThIJuJmjuOtK1Yn6yD072b2Sn1h3RImWVlLLBSiKtE3hP8RwidA Fo1Bm6RgRs0fj+claPLDtrDbsVF0q/XZ47wRhq1X5AVAtb22OCVnNXG/n9RNIkPMCizj 73hyUhE/XUkxTGbdjSh1wfjv2YuK/zl8DHPQHE0FcZoPhHqxKbR2hOkZMWHDQVTLXOtk o1+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=aD4AJGxTy8jFc7Megbn+McS8+SM1uuzEjDMWkLo+DdU=; b=b0Dh91UngaD0QlqxELQgSYGvw4dzC5tdEyUt7Nw3xFnV3OLTwOiOJip5XL/qPdOfmB fgL9JMrD4QcX/SF/kq6LJWXbS7i3uqWA4kNwOl60XuBd3WMlYWIh+UIRxcHB1kJprlih 286Ajf3DHIBqNMUN2ElO2sqpkfXDHIb9cAm27k9OY/TX6nRIoq/DGAc3nTmnIXAxzSWs P1agY87jFhFLkaZYgmMKEIaaq4c/5Wluq3rSyk51QMLXAfuMrU9CnGgoug7x5oQT2frW GLlEBLHbhDZmOcasFMuL0b2yp+03pTwRG65UKwjjKdtvJZnXEiQHL6d5u2+OXQxmFLNJ NABw== X-Gm-Message-State: AMCzsaWr/JMRnqYHGKWRGf/VsPZXlzKIW4sHaHMBXKJUCdOFwO91jkAR ZPtrXMle8iK8GinNGjD1rat9LbE2SZc= X-Google-Smtp-Source: AOwi7QBtEnXjeGR/C80luSyyEdnX7R0WoQJ30zOnZY2zN/yDH/T75lEo1LQIT6Mll/yPTQe0f95Usw== X-Received: by 10.55.132.133 with SMTP id g127mr1220394qkd.72.1507582197217; Mon, 09 Oct 2017 13:49:57 -0700 (PDT) From: Dawid Zamirski X-Google-Original-From: Dawid Zamirski To: libvir-list@redhat.com Date: Mon, 9 Oct 2017 16:49:51 -0400 Message-Id: <20171009204954.11382-4-dzrudy@gmail.com> In-Reply-To: <20171009204954.11382-1-dzrudy@gmail.com> References: <20171009204954.11382-1-dzrudy@gmail.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 09 Oct 2017 20:49:58 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 09 Oct 2017 20:49:58 +0000 (UTC) for IP:'209.85.220.171' DOMAIN:'mail-qk0-f171.google.com' HELO:'mail-qk0-f171.google.com' FROM:'dzamirski@datto.com' RCPT:'' X-RedHat-Spam-Score: -2.311 (DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, RCVD_IN_SORBS_SPAM, SPF_PASS) 209.85.220.171 mail-qk0-f171.google.com 209.85.220.171 mail-qk0-f171.google.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.39 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 3/6] docs: Add info about ide model attribute. 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.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 09 Oct 2017 21:40:00 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Dawid Zamirski --- docs/formatdomain.html.in | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index c0e3c2221..ddcc9f1b1 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -3596,6 +3596,9 @@ Since 1.3.5, USB controllers accept a ports attribute to configure how many devices can be connected to the controller. +
ide
+
An ide controller has an optional attribute + model, which is one of "piix3", "piix4" or "ich6". =20

--=20 2.14.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 01:08:17 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; dkim=fail; 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 1507583396542109.56512123193943; Mon, 9 Oct 2017 14:09:56 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 68B6C883D1; Mon, 9 Oct 2017 21:09:54 +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 45B2B5887F; Mon, 9 Oct 2017 21:09:54 +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 090DE410B2; Mon, 9 Oct 2017 21:09:54 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v99Ko2wI022404 for ; Mon, 9 Oct 2017 16:50:02 -0400 Received: by smtp.corp.redhat.com (Postfix) id 762B468873; Mon, 9 Oct 2017 20:50:02 +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 7164E6886C for ; Mon, 9 Oct 2017 20:49:59 +0000 (UTC) Received: from mail-qk0-f171.google.com (mail-qk0-f171.google.com [209.85.220.171]) (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 E2A9DC04AC47 for ; Mon, 9 Oct 2017 20:49:58 +0000 (UTC) Received: by mail-qk0-f171.google.com with SMTP id k123so21316662qke.3 for ; Mon, 09 Oct 2017 13:49:58 -0700 (PDT) Received: from dawid-fedora.datto.lan ([47.19.105.250]) by smtp.gmail.com with ESMTPSA id y31sm5505361qta.83.2017.10.09.13.49.57 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 09 Oct 2017 13:49:57 -0700 (PDT) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 68B6C883D1 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=fail (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 68B6C883D1 Authentication-Results: mx1.redhat.com; dkim=fail reason="signature verification failed" (2048-bit key) header.d=datto-com.20150623.gappssmtp.com header.i=@datto-com.20150623.gappssmtp.com header.b="L+tsoh+m" DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com E2A9DC04AC47 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=pass (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=dzamirski@datto.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com E2A9DC04AC47 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=datto-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=naV75nSlgJK2Pe3LiEl9AgpzvhowLZQ/dFfzlfM+tTs=; b=L+tsoh+mvoEq/+qete4JWBZf+zbnQyKF49rmXtUbn+7PDSVa3S5YYEYf+/+69nubLF ksWwUSpveRKAw4lBPh13umJh5tNUrkX6FqzsCD1YK8kAoTeJN0mqfK8/2K5Gs57/uMRg Gyu9rU0Y2xwtu9vO/OiDtxcDmGsU9aTEEdFI4b8QbhNmTp30ViyvF08BptkYuM/KNkNT SpLok0Q+AS//PrqOrgLEan2zJUePhDIVSi8OGprnO4ihR+6L2VcUeZjxg/J3y3Eosh5r hlxp62IAJBXWAYF4D3e+1Km7IatQvKxJ5Rf+v5OsOaQO3Dd6INGxzdyIe6gkKu9RIA01 GCsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=naV75nSlgJK2Pe3LiEl9AgpzvhowLZQ/dFfzlfM+tTs=; b=s6rLPI1I0UsMhXMLKfsiI8//JI53U47v30eMjQ3fH2KnsWYfU+cK+FhmqZs9rV789k QOKI23Mf8cQkRRbUVEB04xF7DC5sNVcppgu2R2uxI4qXBEGBsq0wGgvLGRa+wmn6nKaG o8B38pcOV0UHQS7kmEMzaA83mW+PYSqAxI8u/y/5nZThMYmZKEY6A0FjkTX1Lp6BlgPz R8XjIsWho4P6w1lvkLBswDheT6kzIOgwd0s4V4aGXIRnPuCi+PVFoH2H8iuWa6Q/Zanq nBfEvTboWy5nnyHvjzzdF599D9bLJxxbmByCTMtdV75PeweboGEEXYmxjjI9lefGN+oY LnJg== X-Gm-Message-State: AMCzsaXJY7PfWcaVpw9q2vRO180WxWYXniRNmImjhmPY/30QIc2V0IjC RR3f0p9kxuLmajUeXtmwVfgH4REoA84= X-Google-Smtp-Source: AOwi7QC43r0cMvdfEBJoNU4ORf76ptPAzmqPRzuWXze+RhmirWEvQOt+tfpObH8f/ASPHEWubfGITQ== X-Received: by 10.55.23.160 with SMTP id 32mr10053851qkx.20.1507582197972; Mon, 09 Oct 2017 13:49:57 -0700 (PDT) From: Dawid Zamirski X-Google-Original-From: Dawid Zamirski To: libvir-list@redhat.com Date: Mon, 9 Oct 2017 16:49:52 -0400 Message-Id: <20171009204954.11382-5-dzrudy@gmail.com> In-Reply-To: <20171009204954.11382-1-dzrudy@gmail.com> References: <20171009204954.11382-1-dzrudy@gmail.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 09 Oct 2017 20:49:59 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 09 Oct 2017 20:49:59 +0000 (UTC) for IP:'209.85.220.171' DOMAIN:'mail-qk0-f171.google.com' HELO:'mail-qk0-f171.google.com' FROM:'dzamirski@datto.com' RCPT:'' X-RedHat-Spam-Score: -2.311 (DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, RCVD_IN_SORBS_SPAM, SPF_PASS) 209.85.220.171 mail-qk0-f171.google.com 209.85.220.171 mail-qk0-f171.google.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.31 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 4/6] vbox: Add more IStorageController API mappings. 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.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 09 Oct 2017 21:09:55 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Dawid Zamirski This patch 'maps' additonal methods for VBOX API to the libvirt unified vbox API to deal with IStorageController. The 'mapped' methods are: * IStorageController->GetStorageControllerType() * IStorageController->SetStorageControllerType() * IMachine->GetStorageControllers() Reviewed-by: John Ferlan --- src/vbox/vbox_common.h | 13 +++++++++++++ src/vbox/vbox_tmpl.c | 20 ++++++++++++++++++++ src/vbox/vbox_uniformed_api.h | 3 +++ 3 files changed, 36 insertions(+) diff --git a/src/vbox/vbox_common.h b/src/vbox/vbox_common.h index c6da8929d..b08ad1e3e 100644 --- a/src/vbox/vbox_common.h +++ b/src/vbox/vbox_common.h @@ -235,6 +235,19 @@ enum StorageBus StorageBus_SAS =3D 5 }; =20 +enum StorageControllerType +{ + StorageControllerType_Null =3D 0, + StorageControllerType_LsiLogic =3D 1, + StorageControllerType_BusLogic =3D 2, + StorageControllerType_IntelAhci =3D 3, + StorageControllerType_PIIX3 =3D 4, + StorageControllerType_PIIX4 =3D 5, + StorageControllerType_ICH6 =3D 6, + StorageControllerType_I82078 =3D 7, + StorageControllerType_LsiLogicSas =3D 8 +}; + enum AccessMode { AccessMode_ReadOnly =3D 1, diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index ac3b8fa00..6592cbd63 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -550,6 +550,11 @@ static void* _handleUSBGetDeviceFilters(IUSBCommon *US= BCommon) return USBCommon->vtbl->GetDeviceFilters; } =20 +static void* _handleMachineGetStorageControllers(IMachine *machine) +{ + return machine->vtbl->GetStorageControllers; +} + static void* _handleMachineGetMediumAttachments(IMachine *machine) { return machine->vtbl->GetMediumAttachments; @@ -1919,6 +1924,18 @@ _storageControllerGetBus(IStorageController *storage= Controller, PRUint32 *bus) return storageController->vtbl->GetBus(storageController, bus); } =20 +static nsresult +_storageControllerGetControllerType(IStorageController *storageController,= PRUint32 *controllerType) +{ + return storageController->vtbl->GetControllerType(storageController, c= ontrollerType); +} + +static nsresult +_storageControllerSetControllerType(IStorageController *storageController,= PRUint32 controllerType) +{ + return storageController->vtbl->SetControllerType(storageController, c= ontrollerType); +} + static nsresult _sharedFolderGetHostPath(ISharedFolder *sharedFolder, PRUnichar **hostPath) { @@ -2268,6 +2285,7 @@ static vboxUniformedArray _UArray =3D { .handleGetMachines =3D _handleGetMachines, .handleGetHardDisks =3D _handleGetHardDisks, .handleUSBGetDeviceFilters =3D _handleUSBGetDeviceFilters, + .handleMachineGetStorageControllers =3D _handleMachineGetStorageContro= llers, .handleMachineGetMediumAttachments =3D _handleMachineGetMediumAttachme= nts, .handleMachineGetSharedFolders =3D _handleMachineGetSharedFolders, .handleSnapshotGetChildren =3D _handleSnapshotGetChildren, @@ -2499,6 +2517,8 @@ static vboxUniformedIMediumAttachment _UIMediumAttach= ment =3D { =20 static vboxUniformedIStorageController _UIStorageController =3D { .GetBus =3D _storageControllerGetBus, + .GetControllerType =3D _storageControllerGetControllerType, + .SetControllerType =3D _storageControllerSetControllerType, }; =20 static vboxUniformedISharedFolder _UISharedFolder =3D { diff --git a/src/vbox/vbox_uniformed_api.h b/src/vbox/vbox_uniformed_api.h index 2ccaf43e8..dc0b391b2 100644 --- a/src/vbox/vbox_uniformed_api.h +++ b/src/vbox/vbox_uniformed_api.h @@ -135,6 +135,7 @@ typedef struct { void* (*handleGetMachines)(IVirtualBox *vboxObj); void* (*handleGetHardDisks)(IVirtualBox *vboxObj); void* (*handleUSBGetDeviceFilters)(IUSBCommon *USBCommon); + void* (*handleMachineGetStorageControllers)(IMachine *machine); void* (*handleMachineGetMediumAttachments)(IMachine *machine); void* (*handleMachineGetSharedFolders)(IMachine *machine); void* (*handleSnapshotGetChildren)(ISnapshot *snapshot); @@ -410,6 +411,8 @@ typedef struct { /* Functions for IStorageController */ typedef struct { nsresult (*GetBus)(IStorageController *storageController, PRUint32 *bu= s); + nsresult (*SetControllerType)(IStorageController *storageController, P= RUint32 controllerType); + nsresult (*GetControllerType)(IStorageController *storageController, P= RUint32 *controllerType); } vboxUniformedIStorageController; =20 /* Functions for ISharedFolder */ --=20 2.14.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 01:08:17 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; dkim=fail; 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 1507585163058533.5097217458753; Mon, 9 Oct 2017 14:39:23 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8CD54267D5; Mon, 9 Oct 2017 21:39:21 +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 946C462487; Mon, 9 Oct 2017 21:39:20 +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 9C203410B3; Mon, 9 Oct 2017 21:39:17 +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 v99Ko3ZM022414 for ; Mon, 9 Oct 2017 16:50:03 -0400 Received: by smtp.corp.redhat.com (Postfix) id EC5DD17C5E; Mon, 9 Oct 2017 20:50:03 +0000 (UTC) Received: from mx1.redhat.com (ext-mx09.extmail.prod.ext.phx2.redhat.com [10.5.110.38]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 919C4189D9 for ; Mon, 9 Oct 2017 20:50:01 +0000 (UTC) Received: from mail-qk0-f179.google.com (mail-qk0-f179.google.com [209.85.220.179]) (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 E8DCB4ACA7 for ; Mon, 9 Oct 2017 20:49:59 +0000 (UTC) Received: by mail-qk0-f179.google.com with SMTP id f199so11649613qke.2 for ; Mon, 09 Oct 2017 13:49:59 -0700 (PDT) Received: from dawid-fedora.datto.lan ([47.19.105.250]) by smtp.gmail.com with ESMTPSA id y31sm5505361qta.83.2017.10.09.13.49.58 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 09 Oct 2017 13:49:58 -0700 (PDT) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 8CD54267D5 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=fail (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 8CD54267D5 Authentication-Results: mx1.redhat.com; dkim=fail reason="signature verification failed" (2048-bit key) header.d=datto-com.20150623.gappssmtp.com header.i=@datto-com.20150623.gappssmtp.com header.b="ZDZjd2OE" DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com E8DCB4ACA7 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=pass (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=dzamirski@datto.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com E8DCB4ACA7 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=datto-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=hQr5PZKEYx9vNTe2UqdUkA+1DuSyBg5WdYW4zeSCekM=; b=ZDZjd2OEufuWueNQwyefebe8Co5b4qqg+EI7HH62igVKDhXwlztRAdRdvLEvmcV/oj piLouxakzVGeFyZ/YjT5XW2yh/YSFysvsQqabmVS7/ui1pv3iIslFNDAJDX7s/fnPqZ6 lMRMN61ieVt/cevCbBfT7jTgEA7655D27osMmDoQkeYpBbgcuN28a41elZFNobSjfxzj dlrpGEmF27hst2AXsTnXGeVyISgiON/K3sPpDvRQjKqSY+zaynDfb2j9B/gn8crIwod0 W/sx7SkJDi88iDxKJlZCQooNpvRwn7TGYLc2wuItsa6aMpZPdV5Vpcxn8M/hAC9KmqMo 4swA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=hQr5PZKEYx9vNTe2UqdUkA+1DuSyBg5WdYW4zeSCekM=; b=fCDC08T/GgjLEGUqjinrxHmPze/V7dv221uqCeT5YgaoQS+tw0Hh2LRvtUxO0hPTHF 33qytLC8Bcp10NqnGFrBZ+CCwM/9ia1h16efX3X5XpJXWweH7ZCQhDrYuyqIPv+lTh3s 4L2SlkTJMJdXYP4p5QWnt7YbBdRgCKt5dnIzo5cHxruVuUX3LRfl1LvVYH5SvAQwAghE +gJ1FOMAgLPQFS9DrtCCFcOym+lBfJx/lv2w22xHQgVMsPEHeX38KQx7Lr5tDVjfZgj/ qtKZVgaES2jKNTGVoaXGvqpRJAXaHj9nHJKFjvXqR2zoUbJ2TU3HxPmIKDsp/iNxdoCn 3V9A== X-Gm-Message-State: AMCzsaV4ET8592OI0j5NyJVc69R9jB0LUMfhi1TPC3SWWrcJ0dJVWbwQ YzwIqZO+Qwz1BTZ2y/aDk+p/4l3mlgA= X-Google-Smtp-Source: AOwi7QCdVZE5hz/1IZiJOKFrYFICVR59wzc7nUTBr2OfwPOP4cB55DtlEQpZKZZynGLjK00+usdf6w== X-Received: by 10.55.16.34 with SMTP id a34mr11704491qkh.353.1507582198723; Mon, 09 Oct 2017 13:49:58 -0700 (PDT) From: Dawid Zamirski X-Google-Original-From: Dawid Zamirski To: libvir-list@redhat.com Date: Mon, 9 Oct 2017 16:49:53 -0400 Message-Id: <20171009204954.11382-6-dzrudy@gmail.com> In-Reply-To: <20171009204954.11382-1-dzrudy@gmail.com> References: <20171009204954.11382-1-dzrudy@gmail.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 09 Oct 2017 20:50:00 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 09 Oct 2017 20:50:00 +0000 (UTC) for IP:'209.85.220.179' DOMAIN:'mail-qk0-f179.google.com' HELO:'mail-qk0-f179.google.com' FROM:'dzamirski@datto.com' RCPT:'' X-RedHat-Spam-Score: -0.031 (DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_PASS) 209.85.220.179 mail-qk0-f179.google.com 209.85.220.179 mail-qk0-f179.google.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.38 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 5/6] vbox: Process controller definitions from xml. 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.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 09 Oct 2017 21:39:22 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Dawid Zamirski Until now the vbox driver was completely ignoring element for storage in the XML definition. This patch adds support for interpretting element for storage devices. With this the following other changes were made to the whole storage attachment code: * vboxAttachDrives no longer "computes" deviceSlot and devicePort values based on the disk device name. This was causing the driver to ignore the values set by

element of the device. If that element is omitted in XML, the values produced by default by virDomainDiskDefAssign address should work well. * if any part of storage attachment code fails, i.e wherever we call virReportError, we also fail the DefineXML caller rather than ignoring those issues and moving on. * the DefineXML cleanup part of the code was changed to make sure that any critical failure in device attachment code does not leave any partially defined VM behind. * do not require disk source for removable drives so that "empty" drives can be created for cdrom and floppy types. --- src/vbox/vbox_common.c | 535 ++++++++++++++++++++++++++-------------------= ---- src/vbox/vbox_common.h | 8 + src/vbox/vbox_tmpl.c | 43 ++-- 3 files changed, 310 insertions(+), 276 deletions(-) diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 92ee37164..7645b29a0 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -324,6 +324,9 @@ static bool vboxGetMaxPortSlotValues(IVirtualBox *vbox, gVBoxAPI.UISystemProperties.GetMaxPortCountForStorageBus(sysProps, StorageBus_SC= SI, &maxPortPerIn= st[StorageBus_SCSI]); + gVBoxAPI.UISystemProperties.GetMaxPortCountForStorageBus(sysProps, + StorageBus_SA= S, + &maxPortPerIn= st[StorageBus_SAS]); gVBoxAPI.UISystemProperties.GetMaxPortCountForStorageBus(sysProps, StorageBus_Fl= oppy, &maxPortPerIn= st[StorageBus_Floppy]); @@ -337,6 +340,9 @@ static bool vboxGetMaxPortSlotValues(IVirtualBox *vbox, gVBoxAPI.UISystemProperties.GetMaxDevicesPerPortForStorageBus(sysProps, StorageB= us_SCSI, &maxSlot= PerPort[StorageBus_SCSI]); + gVBoxAPI.UISystemProperties.GetMaxDevicesPerPortForStorageBus(sysProps, + StorageB= us_SAS, + &maxSlot= PerPort[StorageBus_SAS]); gVBoxAPI.UISystemProperties.GetMaxDevicesPerPortForStorageBus(sysProps, StorageB= us_Floppy, &maxSlot= PerPort[StorageBus_Floppy]); @@ -346,68 +352,6 @@ static bool vboxGetMaxPortSlotValues(IVirtualBox *vbox, return true; } =20 -/** - * function to get the StorageBus, Port number - * and Device number for the given devicename - * e.g: hda has StorageBus =3D IDE, port =3D 0, - * device =3D 0 - * - * @returns true on Success, false on failure. - * @param deviceName Input device name - * @param aMaxPortPerInst Input array of max port per device instance - * @param aMaxSlotPerPort Input array of max slot per device port - * @param storageBus Input storage bus type - * @param deviceInst Output device instance number - * @param devicePort Output port number - * @param deviceSlot Output slot number - * - */ -static bool vboxGetDeviceDetails(const char *deviceName, - PRUint32 *aMaxPortPerInst, - PRUint32 *aMaxSlotPerPort, - PRUint32 storageBus, - PRInt32 *deviceInst, - PRInt32 *devicePort, - PRInt32 *deviceSlot) -{ - int total =3D 0; - PRUint32 maxPortPerInst =3D 0; - PRUint32 maxSlotPerPort =3D 0; - - if (!deviceName || - !deviceInst || - !devicePort || - !deviceSlot || - !aMaxPortPerInst || - !aMaxSlotPerPort) - return false; - - if ((storageBus < StorageBus_IDE) || - (storageBus > StorageBus_Floppy)) - return false; - - total =3D virDiskNameToIndex(deviceName); - - maxPortPerInst =3D aMaxPortPerInst[storageBus]; - maxSlotPerPort =3D aMaxSlotPerPort[storageBus]; - - if (!maxPortPerInst || - !maxSlotPerPort || - (total < 0)) - return false; - - *deviceInst =3D total / (maxPortPerInst * maxSlotPerPort); - *devicePort =3D (total % (maxPortPerInst * maxSlotPerPort)) / maxSlotP= erPort; - *deviceSlot =3D (total % (maxPortPerInst * maxSlotPerPort)) % maxSlotP= erPort; - - VIR_DEBUG("name=3D%s, total=3D%d, storageBus=3D%u, deviceInst=3D%d, " - "devicePort=3D%d deviceSlot=3D%d, maxPortPerInst=3D%u maxSlotPer= Port=3D%u", - deviceName, total, storageBus, *deviceInst, *devicePort, - *deviceSlot, maxPortPerInst, maxSlotPerPort); - - return true; -} - /** * function to generate the name for medium, * for e.g: hda, sda, etc @@ -441,7 +385,7 @@ static char *vboxGenerateMediumName(PRUint32 storageBus, return NULL; =20 if ((storageBus < StorageBus_IDE) || - (storageBus > StorageBus_Floppy)) + (storageBus > StorageBus_SAS)) return NULL; =20 maxPortPerInst =3D aMaxPortPerInst[storageBus]; @@ -452,8 +396,9 @@ static char *vboxGenerateMediumName(PRUint32 storageBus, =20 if (storageBus =3D=3D StorageBus_IDE) { prefix =3D "hd"; - } else if ((storageBus =3D=3D StorageBus_SATA) || - (storageBus =3D=3D StorageBus_SCSI)) { + } else if (storageBus =3D=3D StorageBus_SATA || + storageBus =3D=3D StorageBus_SCSI || + storageBus =3D=3D StorageBus_SAS) { prefix =3D "sd"; } else if (storageBus =3D=3D StorageBus_Floppy) { prefix =3D "fd"; @@ -468,6 +413,124 @@ static char *vboxGenerateMediumName(PRUint32 storageB= us, return name; } =20 +static int +vboxSetStorageController(virDomainControllerDefPtr controller, + vboxDriverPtr data, IMachine *machine) +{ + PRUnichar *controllerName =3D NULL; + PRInt32 vboxModel =3D StorageControllerType_Null; + PRInt32 vboxBusType =3D StorageBus_Null; + IStorageController *vboxController =3D NULL; + nsresult rc =3D 0; + int ret =3D -1; + + /* libvirt controller type =3D> vbox bus type */ + switch (controller->type) { + case VIR_DOMAIN_CONTROLLER_TYPE_FDC: + VBOX_UTF8_TO_UTF16(VBOX_CONTROLLER_FLOPPY_NAME, &controllerName); + vboxBusType =3D StorageBus_Floppy; + + break; + case VIR_DOMAIN_CONTROLLER_TYPE_IDE: + VBOX_UTF8_TO_UTF16(VBOX_CONTROLLER_IDE_NAME, &controllerName); + vboxBusType =3D StorageBus_IDE; + + break; + case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: + VBOX_UTF8_TO_UTF16(VBOX_CONTROLLER_SCSI_NAME, &controllerName); + vboxBusType =3D StorageBus_SCSI; + + break; + case VIR_DOMAIN_CONTROLLER_TYPE_SATA: + VBOX_UTF8_TO_UTF16(VBOX_CONTROLLER_SATA_NAME, &controllerName); + vboxBusType =3D StorageBus_SATA; + + break; + } + + /* libvirt scsi model =3D> vbox scsi model */ + if (controller->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_SCSI) { + switch (controller->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC: + vboxModel =3D StorageControllerType_LsiLogic; + + break; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC: + vboxModel =3D StorageControllerType_BusLogic; + + break; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1068: + /* in vbox, lsisas has a dedicated SAS bus type with no model = */ + VBOX_UTF16_FREE(controllerName); + VBOX_UTF8_TO_UTF16(VBOX_CONTROLLER_SAS_NAME, &controllerName); + vboxBusType =3D StorageBus_SAS; + + break; + } + } + + /* libvirt ide model =3D> vbox ide model */ + if (controller->type =3D=3D VIR_DOMAIN_CONTROLLER_TYPE_IDE) { + switch (controller->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_IDE_PIIX3: + vboxModel =3D StorageControllerType_PIIX3; + + break; + case VIR_DOMAIN_CONTROLLER_MODEL_IDE_PIIX4: + vboxModel =3D StorageControllerType_PIIX4; + + break; + case VIR_DOMAIN_CONTROLLER_MODEL_IDE_ICH6: + vboxModel =3D StorageControllerType_ICH6; + + break; + } + } + + rc =3D gVBoxAPI.UIMachine.AddStorageController(machine, controllerName, + vboxBusType, &vboxControl= ler); + + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to add storage controller " + "(type: %s, index=3D%d), rc=3D%08x"), + virDomainControllerTypeToString(controller->type), + controller->idx, (unsigned) rc); + goto cleanup; + } + + if (vboxModel !=3D StorageControllerType_Null) { + rc =3D gVBoxAPI.UIStorageController.SetControllerType(vboxControll= er, + vboxModel); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to change storage controller model, " + "rc=3D%08x"), (unsigned) rc); + goto cleanup; + } + } + + ret =3D 0; + cleanup: + VBOX_UTF16_FREE(controllerName); + VBOX_RELEASE(vboxController); + + return ret; +} + +static int +vboxAttachStorageControllers(virDomainDefPtr def, vboxDriverPtr data, + IMachine *machine) +{ + size_t i; + for (i =3D 0; i < def->ncontrollers; i++) { + if (vboxSetStorageController(def->controllers[i], data, machine) <= 0) + return -1; + } + + return 0; +} + static virDrvOpenStatus vboxConnectOpen(virConnectPtr conn, virConnectAuthPtr auth ATTRIBUTE_UNUSED, @@ -1017,209 +1080,168 @@ vboxSetBootDeviceOrder(virDomainDefPtr def, vboxD= riverPtr data, } } =20 -static void +static int vboxAttachDrives(virDomainDefPtr def, vboxDriverPtr data, IMachine *machin= e) { + int ret =3D 0; size_t i; nsresult rc =3D 0; - PRUint32 maxPortPerInst[StorageBus_Floppy + 1] =3D {}; - PRUint32 maxSlotPerPort[StorageBus_Floppy + 1] =3D {}; PRUnichar *storageCtlName =3D NULL; - bool error =3D false; + virDomainDiskDefPtr disk =3D NULL; =20 - /* get the max port/slots/etc for the given storage bus */ - error =3D !vboxGetMaxPortSlotValues(data->vboxObj, maxPortPerInst, - maxSlotPerPort); - - /* add a storage controller for the mediums to be attached */ - /* this needs to change when multiple controller are supported for - * ver > 3.1 */ - { - IStorageController *storageCtl =3D NULL; - PRUnichar *sName =3D NULL; - - VBOX_UTF8_TO_UTF16("IDE Controller", &sName); - gVBoxAPI.UIMachine.AddStorageController(machine, - sName, - StorageBus_IDE, - &storageCtl); - VBOX_UTF16_FREE(sName); - VBOX_RELEASE(storageCtl); - - VBOX_UTF8_TO_UTF16("SATA Controller", &sName); - gVBoxAPI.UIMachine.AddStorageController(machine, - sName, - StorageBus_SATA, - &storageCtl); - VBOX_UTF16_FREE(sName); - VBOX_RELEASE(storageCtl); - - VBOX_UTF8_TO_UTF16("SCSI Controller", &sName); - gVBoxAPI.UIMachine.AddStorageController(machine, - sName, - StorageBus_SCSI, - &storageCtl); - VBOX_UTF16_FREE(sName); - VBOX_RELEASE(storageCtl); - - VBOX_UTF8_TO_UTF16("Floppy Controller", &sName); - gVBoxAPI.UIMachine.AddStorageController(machine, - sName, - StorageBus_Floppy, - &storageCtl); - VBOX_UTF16_FREE(sName); - VBOX_RELEASE(storageCtl); - } - - for (i =3D 0; i < def->ndisks && !error; i++) { - const char *src =3D virDomainDiskGetSource(def->disks[i]); - int type =3D virDomainDiskGetType(def->disks[i]); - int format =3D virDomainDiskGetFormat(def->disks[i]); - - VIR_DEBUG("disk(%zu) type: %d", i, type); - VIR_DEBUG("disk(%zu) device: %d", i, def->disks[i]->device); - VIR_DEBUG("disk(%zu) bus: %d", i, def->disks[i]->bus); - VIR_DEBUG("disk(%zu) src: %s", i, src); - VIR_DEBUG("disk(%zu) dst: %s", i, def->disks[i]->dst); - VIR_DEBUG("disk(%zu) driverName: %s", i, - virDomainDiskGetDriver(def->disks[i])); - VIR_DEBUG("disk(%zu) driverType: %s", i, - virStorageFileFormatTypeToString(format)); - VIR_DEBUG("disk(%zu) cachemode: %d", i, def->disks[i]->cachemode); - VIR_DEBUG("disk(%zu) readonly: %s", i, (def->disks[i]->src->read= only - ? "True" : "False")); - VIR_DEBUG("disk(%zu) shared: %s", i, (def->disks[i]->src->shar= ed - ? "True" : "False")); - - if (type =3D=3D VIR_STORAGE_TYPE_FILE && src) { - IMedium *medium =3D NULL; - vboxIID mediumUUID; - PRUnichar *mediumFileUtf16 =3D NULL; - PRUint32 storageBus =3D StorageBus_Null; - PRUint32 deviceType =3D DeviceType_Null; - PRUint32 accessMode =3D AccessMode_ReadOnly; - PRInt32 deviceInst =3D 0; - PRInt32 devicePort =3D 0; - PRInt32 deviceSlot =3D 0; + for (i =3D 0; i < def->ndisks; i++) { + disk =3D def->disks[i]; + const char *src =3D virDomainDiskGetSource(disk); + int type =3D virDomainDiskGetType(disk); =20 - VBOX_IID_INITIALIZE(&mediumUUID); - VBOX_UTF8_TO_UTF16(src, &mediumFileUtf16); + if (type !=3D VIR_STORAGE_TYPE_FILE) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported storage type %s, the only suppor= ted " + "type is %s"), + virStorageTypeToString(type), + virStorageTypeToString(VIR_STORAGE_TYPE_FILE)); + return -1; + } =20 - if (def->disks[i]->device =3D=3D VIR_DOMAIN_DISK_DEVICE_DISK) { - deviceType =3D DeviceType_HardDisk; - accessMode =3D AccessMode_ReadWrite; - } else if (def->disks[i]->device =3D=3D VIR_DOMAIN_DISK_DEVICE= _CDROM) { - deviceType =3D DeviceType_DVD; - accessMode =3D AccessMode_ReadOnly; - } else if (def->disks[i]->device =3D=3D VIR_DOMAIN_DISK_DEVICE= _FLOPPY) { - deviceType =3D DeviceType_Floppy; - accessMode =3D AccessMode_ReadWrite; - } else { - VBOX_UTF16_FREE(mediumFileUtf16); - continue; - } + if (!src && disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_DISK) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Missing disk source file path")); + return -1; + } =20 - gVBoxAPI.UIVirtualBox.FindHardDisk(data->vboxObj, mediumFileUt= f16, - deviceType, accessMode, &me= dium); + IMedium *medium =3D NULL; + vboxIID mediumUUID; + PRUnichar *mediumFileUtf16 =3D NULL; + PRUint32 deviceType =3D DeviceType_Null; + PRUint32 accessMode =3D AccessMode_ReadOnly; + PRInt32 deviceSlot =3D disk->info.addr.drive.bus; + PRInt32 devicePort =3D disk->info.addr.drive.unit; + int model =3D -1; + + if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_DISK) { + deviceType =3D DeviceType_HardDisk; + accessMode =3D AccessMode_ReadWrite; + } else if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_CDROM) { + deviceType =3D DeviceType_DVD; + accessMode =3D AccessMode_ReadOnly; + } else if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_FLOPPY) { + deviceType =3D DeviceType_Floppy; + accessMode =3D AccessMode_ReadWrite; + } else { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported disk device type %s"), + virDomainDiskDeviceTypeToString(disk->device)); + ret =3D -1; + goto cleanup; + } =20 - if (!medium) { - PRUnichar *mediumEmpty =3D NULL; + if (src) { + VBOX_IID_INITIALIZE(&mediumUUID); + VBOX_UTF8_TO_UTF16(src, &mediumFileUtf16); =20 - VBOX_UTF8_TO_UTF16("", &mediumEmpty); + rc =3D gVBoxAPI.UIVirtualBox.FindHardDisk(data->vboxObj, mediu= mFileUtf16, + deviceType, accessMode= , &medium); =20 - rc =3D gVBoxAPI.UIVirtualBox.OpenMedium(data->vboxObj, - mediumFileUtf16, - deviceType, accessMo= de, - &medium); - VBOX_UTF16_FREE(mediumEmpty); + /* The following is not needed for vbox 4.2+ but older version= s have + * distinct find and open operations where former looks in vbo= x media + * registry and latter at storage location. In 4.2+, the OpenM= edium call + * takes care of both cases internally. + */ + if (!medium) { + rc =3D gVBoxAPI.UIVirtualBox.OpenMedium(data->vboxObj, med= iumFileUtf16, + deviceType, accessMo= de, &medium); } =20 if (!medium) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("Failed to attach the following disk/dvd/= floppy " - "to the machine: %s, rc=3D%08x"), + _("Failed to open the following disk/dvd/fl= oppy " + "image file: %s, rc=3D%08x"), src, (unsigned)rc); - VBOX_UTF16_FREE(mediumFileUtf16); - continue; + ret =3D -1; + goto cleanup; } =20 rc =3D gVBoxAPI.UIMedium.GetId(medium, &mediumUUID); if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, - _("can't get the uuid of the file to be att= ached " + _("Can't get the uuid of the file to be att= ached " "as harddisk/dvd/floppy: %s, rc=3D%08x"), src, (unsigned)rc); - VBOX_MEDIUM_RELEASE(medium); - VBOX_UTF16_FREE(mediumFileUtf16); - continue; + ret =3D -1; + goto cleanup; } + } =20 - if (def->disks[i]->device =3D=3D VIR_DOMAIN_DISK_DEVICE_DISK) { - if (def->disks[i]->src->readonly) { - gVBoxAPI.UIMedium.SetType(medium, MediumType_Immutable= ); - VIR_DEBUG("setting harddisk to immutable"); - } else if (!def->disks[i]->src->readonly) { - gVBoxAPI.UIMedium.SetType(medium, MediumType_Normal); - VIR_DEBUG("setting harddisk type to normal"); - } + if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_DISK) { + if (disk->src->readonly) { + gVBoxAPI.UIMedium.SetType(medium, MediumType_Immutable); + } else if (!disk->src->readonly) { + gVBoxAPI.UIMedium.SetType(medium, MediumType_Normal); } + } =20 - if (def->disks[i]->bus =3D=3D VIR_DOMAIN_DISK_BUS_IDE) { - VBOX_UTF8_TO_UTF16("IDE Controller", &storageCtlName); - storageBus =3D StorageBus_IDE; - } else if (def->disks[i]->bus =3D=3D VIR_DOMAIN_DISK_BUS_SATA)= { - VBOX_UTF8_TO_UTF16("SATA Controller", &storageCtlName); - storageBus =3D StorageBus_SATA; - } else if (def->disks[i]->bus =3D=3D VIR_DOMAIN_DISK_BUS_SCSI)= { - VBOX_UTF8_TO_UTF16("SCSI Controller", &storageCtlName); - storageBus =3D StorageBus_SCSI; - } else if (def->disks[i]->bus =3D=3D VIR_DOMAIN_DISK_BUS_FDC) { - VBOX_UTF8_TO_UTF16("Floppy Controller", &storageCtlName); - storageBus =3D StorageBus_Floppy; - } + /* asssociate bus to controller */ =20 - /* get the device details i.e instance, port and slot */ - if (!vboxGetDeviceDetails(def->disks[i]->dst, - maxPortPerInst, - maxSlotPerPort, - storageBus, - &deviceInst, - &devicePort, - &deviceSlot)) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("can't get the port/slot number of " - "harddisk/dvd/floppy to be attached: " - "%s, rc=3D%08x"), - src, (unsigned)rc); - VBOX_MEDIUM_RELEASE(medium); - vboxIIDUnalloc(&mediumUUID); - VBOX_UTF16_FREE(mediumFileUtf16); - continue; - } + switch (disk->bus) { + case VIR_DOMAIN_DISK_BUS_IDE: + VBOX_UTF8_TO_UTF16(VBOX_CONTROLLER_IDE_NAME, &storageCtlName); =20 - /* attach the harddisk/dvd/Floppy to the storage controller */ - rc =3D gVBoxAPI.UIMachine.AttachDevice(machine, - storageCtlName, - devicePort, - deviceSlot, - deviceType, - medium); + break; =20 - if (NS_FAILED(rc)) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("could not attach the file as " - "harddisk/dvd/floppy: %s, rc=3D%08x"), - src, (unsigned)rc); - } else { - DEBUGIID("Attached HDD/DVD/Floppy with UUID", &mediumUUID); + case VIR_DOMAIN_DISK_BUS_SATA: + VBOX_UTF8_TO_UTF16(VBOX_CONTROLLER_SATA_NAME, &storageCtlName); + + break; + + case VIR_DOMAIN_DISK_BUS_SCSI: + VBOX_UTF8_TO_UTF16(VBOX_CONTROLLER_SCSI_NAME, &storageCtlName); + + model =3D virDomainDeviceFindControllerModel(def, &disk->info, + VIR_DOMAIN_CONTROLL= ER_TYPE_SCSI); + + /* if the model is lsisas1068, set vbox bus type to SAS */ + if (model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1068) { + VBOX_UTF16_FREE(storageCtlName); + VBOX_UTF8_TO_UTF16(VBOX_CONTROLLER_SAS_NAME, &storageCtlNa= me); } =20 - VBOX_MEDIUM_RELEASE(medium); - vboxIIDUnalloc(&mediumUUID); - VBOX_UTF16_FREE(mediumFileUtf16); - VBOX_UTF16_FREE(storageCtlName); + break; + + case VIR_DOMAIN_DISK_BUS_FDC: + VBOX_UTF8_TO_UTF16(VBOX_CONTROLLER_FLOPPY_NAME, &storageCtlNam= e); + devicePort =3D 0; + deviceSlot =3D disk->info.addr.drive.unit; + + break; } + + /* attach the harddisk/dvd/Floppy to the storage controller */ + rc =3D gVBoxAPI.UIMachine.AttachDevice(machine, + storageCtlName, + devicePort, + deviceSlot, + deviceType, + medium); + + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Could not attach the file as " + "harddisk/dvd/floppy: %s, rc=3D%08x"), + src, (unsigned)rc); + ret =3D -1; + } + + cleanup: + vboxIIDUnalloc(&mediumUUID); + VBOX_MEDIUM_RELEASE(medium); + VBOX_UTF16_FREE(mediumFileUtf16); + VBOX_UTF16_FREE(storageCtlName); + + if (ret < 0) + break; } + + return ret; } =20 static void @@ -1853,6 +1875,7 @@ vboxDomainDefineXMLFlags(virConnectPtr conn, const ch= ar *xml, unsigned int flags char uuidstr[VIR_UUID_STRING_BUFLEN]; virDomainPtr ret =3D NULL; unsigned int parse_flags =3D VIR_DOMAIN_DEF_PARSE_INACTIVE; + int success =3D 0; =20 virCheckFlags(VIR_DOMAIN_DEFINE_VALIDATE, NULL); =20 @@ -1948,7 +1971,10 @@ vboxDomainDefineXMLFlags(virConnectPtr conn, const c= har *xml, unsigned int flags gVBoxAPI.UISession.GetMachine(data->vboxSession, &machine); =20 vboxSetBootDeviceOrder(def, data, machine); - vboxAttachDrives(def, data, machine); + if (vboxAttachStorageControllers(def, data, machine) < 0) + goto cleanup; + if (vboxAttachDrives(def, data, machine) < 0) + goto cleanup; vboxAttachSound(def, machine); if (vboxAttachNetwork(def, data, machine) < 0) goto cleanup; @@ -1959,30 +1985,40 @@ vboxDomainDefineXMLFlags(virConnectPtr conn, const = char *xml, unsigned int flags vboxAttachUSB(def, data, machine); vboxAttachSharedFolder(def, data, machine); =20 - /* Save the machine settings made till now and close the - * session. also free up the mchiid variable used. - */ + success =3D 1; + + cleanup: + /* Save the machine settings made till now, even if incomplete */ rc =3D gVBoxAPI.UIMachine.SaveSettings(machine); - if (NS_FAILED(rc)) { + if (NS_FAILED(rc)) virReportError(VIR_ERR_INTERNAL_ERROR, - _("failed no saving settings, rc=3D%08x"), (unsigne= d)rc); - goto cleanup; + _("failed to save VM settings, rc=3D%08x"), + (unsigned) rc); + + if (success) { + ret =3D virGetDomain(conn, def->name, def->uuid, -1); + } else { + /* Unregister incompletely configured VM to not leave garbage behi= nd */ + gVBoxAPI.UISession.Close(data->vboxSession); + rc =3D gVBoxAPI.unregisterMachine(data, &mchiid, &machine); + if (NS_SUCCEEDED(rc)) { + gVBoxAPI.deleteConfig(machine); + } else { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("could not cleanup partial domain after failu= re " + "to define, rc=3D%08x"), + (unsigned) rc); + } } =20 gVBoxAPI.UISession.Close(data->vboxSession); vboxIIDUnalloc(&mchiid); =20 - ret =3D virGetDomain(conn, def->name, def->uuid, -1); VBOX_RELEASE(machine); =20 virDomainDefFree(def); =20 return ret; - - cleanup: - VBOX_RELEASE(machine); - virDomainDefFree(def); - return NULL; } =20 static virDomainPtr @@ -3057,8 +3093,8 @@ vboxDumpIDEHDDs(virDomainDefPtr def, vboxDriverPtr da= ta, IMachine *machine) bool error =3D false; int diskCount =3D 0; size_t i; - PRUint32 maxPortPerInst[StorageBus_Floppy + 1] =3D {}; - PRUint32 maxSlotPerPort[StorageBus_Floppy + 1] =3D {}; + PRUint32 maxPortPerInst[StorageBus_SAS + 1] =3D {}; + PRUint32 maxSlotPerPort[StorageBus_SAS + 1] =3D {}; =20 def->ndisks =3D 0; gVBoxAPI.UArray.vboxArrayGet(&mediumAttachments, machine, @@ -3151,7 +3187,8 @@ vboxDumpIDEHDDs(virDomainDefPtr def, vboxDriverPtr da= ta, IMachine *machine) def->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_IDE; } else if (storageBus =3D=3D StorageBus_SATA) { def->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_SATA; - } else if (storageBus =3D=3D StorageBus_SCSI) { + } else if (storageBus =3D=3D StorageBus_SCSI || + storageBus =3D=3D StorageBus_SAS) { def->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_SCSI; } else if (storageBus =3D=3D StorageBus_Floppy) { def->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_FDC; diff --git a/src/vbox/vbox_common.h b/src/vbox/vbox_common.h index b08ad1e3e..23940fc63 100644 --- a/src/vbox/vbox_common.h +++ b/src/vbox/vbox_common.h @@ -326,6 +326,14 @@ enum HardDiskVariant # define VBOX_E_INVALID_SESSION_STATE 0x80BB000B # define VBOX_E_OBJECT_IN_USE 0x80BB000C =20 +/* VBOX storage controller name definitions */ +# define VBOX_CONTROLLER_IDE_NAME "IDE Controller" +# define VBOX_CONTROLLER_FLOPPY_NAME "Floppy Controller" +# define VBOX_CONTROLLER_SATA_NAME "SATA Controller" +# define VBOX_CONTROLLER_SCSI_NAME "SCSI Controller" +# define VBOX_CONTROLLER_SAS_NAME "SAS Controller" + + /* Simplied definitions in vbox_CAPI_*.h */ =20 typedef void const *PCVBOXXPCOM; diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c index 6592cbd63..b7ced62dc 100644 --- a/src/vbox/vbox_tmpl.c +++ b/src/vbox/vbox_tmpl.c @@ -684,7 +684,9 @@ _virtualboxCreateHardDisk(IVirtualBox *vboxObj, PRUnich= ar *format, #if VBOX_API_VERSION < 5000000 return vboxObj->vtbl->CreateHardDisk(vboxObj, format, location, medium= ); #elif VBOX_API_VERSION >=3D 5000000 /*VBOX_API_VERSION >=3D 5000000*/ - return vboxObj->vtbl->CreateMedium(vboxObj, format, location, AccessMo= de_ReadWrite, DeviceType_HardDisk, medium); + return vboxObj->vtbl->CreateMedium(vboxObj, format, location, + AccessMode_ReadWrite, + DeviceType_HardDisk, medium); #endif /*VBOX_API_VERSION >=3D 5000000*/ } =20 @@ -696,37 +698,28 @@ _virtualboxRegisterMachine(IVirtualBox *vboxObj, IMac= hine *machine) =20 static nsresult _virtualboxFindHardDisk(IVirtualBox *vboxObj, PRUnichar *location, - PRUint32 deviceType ATTRIBUTE_UNUSED, - PRUint32 accessMode ATTRIBUTE_UNUSED, - IMedium **medium) + PRUint32 deviceType, + PRUint32 accessMode ATTRIBUTE_UNUSED, IMedium **me= dium) { #if VBOX_API_VERSION < 4002000 - return vboxObj->vtbl->FindMedium(vboxObj, location, - deviceType, medium); + return vboxObj->vtbl->FindMedium(vboxObj, location, deviceType, medium= ); #else /* VBOX_API_VERSION >=3D 4002000 */ - return vboxObj->vtbl->OpenMedium(vboxObj, location, - deviceType, accessMode, PR_FALSE, med= ium); + return vboxObj->vtbl->OpenMedium(vboxObj, location, deviceType, access= Mode, + PR_FALSE, medium); #endif /* VBOX_API_VERSION >=3D 4002000 */ } =20 static nsresult -_virtualboxOpenMedium(IVirtualBox *vboxObj ATTRIBUTE_UNUSED, - PRUnichar *location ATTRIBUTE_UNUSED, - PRUint32 deviceType ATTRIBUTE_UNUSED, - PRUint32 accessMode ATTRIBUTE_UNUSED, - IMedium **medium ATTRIBUTE_UNUSED) +_virtualboxOpenMedium(IVirtualBox *vboxObj, PRUnichar *location, + PRUint32 deviceType, PRUint32 accessMode, + IMedium **medium) { #if VBOX_API_VERSION =3D=3D 4000000 - return vboxObj->vtbl->OpenMedium(vboxObj, - location, - deviceType, accessMode, + return vboxObj->vtbl->OpenMedium(vboxObj, location, deviceType, access= Mode, medium); #elif VBOX_API_VERSION >=3D 4001000 - return vboxObj->vtbl->OpenMedium(vboxObj, - location, - deviceType, accessMode, - false, - medium); + return vboxObj->vtbl->OpenMedium(vboxObj, location, deviceType, access= Mode, + false, medium); #endif } =20 @@ -778,12 +771,8 @@ _machineGetStorageControllerByName(IMachine *machine, = PRUnichar *name, } =20 static nsresult -_machineAttachDevice(IMachine *machine ATTRIBUTE_UNUSED, - PRUnichar *name ATTRIBUTE_UNUSED, - PRInt32 controllerPort ATTRIBUTE_UNUSED, - PRInt32 device ATTRIBUTE_UNUSED, - PRUint32 type ATTRIBUTE_UNUSED, - IMedium * medium ATTRIBUTE_UNUSED) +_machineAttachDevice(IMachine *machine, PRUnichar *name, PRInt32 controlle= rPort, + PRInt32 device, PRUint32 type, IMedium * medium) { return machine->vtbl->AttachDevice(machine, name, controllerPort, device, type, medium); --=20 2.14.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Thu May 2 01:08:17 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; dkim=fail; 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 1507583419087518.7696064114668; Mon, 9 Oct 2017 14:10:19 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C0115C058EBD; Mon, 9 Oct 2017 21:10:17 +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 9841F62465; Mon, 9 Oct 2017 21:10:17 +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 5ACFC18355DA; Mon, 9 Oct 2017 21:10:17 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v99Ko6KV022428 for ; Mon, 9 Oct 2017 16:50:06 -0400 Received: by smtp.corp.redhat.com (Postfix) id 575A260E3F; Mon, 9 Oct 2017 20:50:06 +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 4F77D60FA0 for ; Mon, 9 Oct 2017 20:50:02 +0000 (UTC) Received: from mail-qk0-f180.google.com (mail-qk0-f180.google.com [209.85.220.180]) (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 A0D46C04AC46 for ; Mon, 9 Oct 2017 20:50:00 +0000 (UTC) Received: by mail-qk0-f180.google.com with SMTP id 17so24744401qkq.8 for ; Mon, 09 Oct 2017 13:50:00 -0700 (PDT) Received: from dawid-fedora.datto.lan ([47.19.105.250]) by smtp.gmail.com with ESMTPSA id y31sm5505361qta.83.2017.10.09.13.49.58 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 09 Oct 2017 13:49:58 -0700 (PDT) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com C0115C058EBD Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=fail (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com C0115C058EBD Authentication-Results: mx1.redhat.com; dkim=fail reason="signature verification failed" (2048-bit key) header.d=datto-com.20150623.gappssmtp.com header.i=@datto-com.20150623.gappssmtp.com header.b="MSFUHSXO" DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com A0D46C04AC46 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=pass (p=none dis=none) header.from=datto.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=dzamirski@datto.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com A0D46C04AC46 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=datto-com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references; bh=h1AqFmIT/QF7uNWykAm1FmZNDzAx56H6lpKNSz5k3hc=; b=MSFUHSXOlZZZbUvvSpEn/dZ4eFFGgZfqbH/l99JbDB4x/C2EWtVndIqtsCrJt1AY9Y EU377Ta+y/eK2DHOtbSjL9NOewO8SeJkVzjWYeu1Z0a7hWwikOWfemf6SYq4xzc96X/q FtSveuZoP37YbpCznqG6Bc7DFHFABHXZ46IZ+bmXKmrtcnbi+AxYyc6BY3r+4pbiEM6E bF8nRLnm5t9OU6JUOK7UiYpxNwTllATJEj1jurLKjnbuWrfKSSGZ6xVpciADGwT3rNyo gjhMUsXtV65hEyWFMVlEuSW1XlGXlnaUqulwKohid0QMMAWAW9M7jiQTs9vkoMZoLlmv atVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=h1AqFmIT/QF7uNWykAm1FmZNDzAx56H6lpKNSz5k3hc=; b=IlSsv/mxzcI74Ck0HhzOXtHCpuQEmx28EWTh1dhq79XU5vg4RjSlyteJ3fx4Ue9Q4z 7HQH595b3yErBYjujUu/qq+PXNO7mqEKfEFX1n4ZvynOVuN0FTIb2pFH94yM4j0TNWmH Z16OzCZKk52eWVCiiWPdr7yysxivB2BT3O/r8Se3VmVGR9g9EVPjViv191GKEPKzczim khUkVK+rT8R52hZ9HBMgazZoBQUGbiNlQmB0ti9KriMLI8kBofXfDkQ2fEnPhjsP3vn7 TcrjEbpz0YQni2nmnPEqivtWCUISst6oUAV/GogGuMCRflo7Jn0iqGX5S5X8PcM0xZQg I+FQ== X-Gm-Message-State: AMCzsaW+oKBSNcSgHCy25k2PJctukpGbtFhQivs7GQ1J+NCioF5XA+Ty WWvs2D0xBXKoovn6wi50duqcjn2XAI4= X-Google-Smtp-Source: AOwi7QBGataWAIqpLw0yYrZdaVljY7jve+qjSKbuX9tFYH3ZsWuSHGnLMFDd3L5373YQ1u9bpvELlA== X-Received: by 10.55.166.77 with SMTP id p74mr11438632qke.264.1507582199337; Mon, 09 Oct 2017 13:49:59 -0700 (PDT) From: Dawid Zamirski X-Google-Original-From: Dawid Zamirski To: libvir-list@redhat.com Date: Mon, 9 Oct 2017 16:49:54 -0400 Message-Id: <20171009204954.11382-7-dzrudy@gmail.com> In-Reply-To: <20171009204954.11382-1-dzrudy@gmail.com> References: <20171009204954.11382-1-dzrudy@gmail.com> X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 09 Oct 2017 20:50:01 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 09 Oct 2017 20:50:01 +0000 (UTC) for IP:'209.85.220.180' DOMAIN:'mail-qk0-f180.google.com' HELO:'mail-qk0-f180.google.com' FROM:'dzamirski@datto.com' RCPT:'' X-RedHat-Spam-Score: 0.469 (DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, RCVD_IN_SORBS_SPAM, SPF_PASS) 209.85.220.180 mail-qk0-f180.google.com 209.85.220.180 mail-qk0-f180.google.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.31 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 6/6] vbox: Update XML dump of storage devices. 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.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 09 Oct 2017 21:10:18 +0000 (UTC) X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Dawid Zamirski * added vboxDumpStorageControllers * replaced vboxDumpIDEHDDs with vboxDumpDisks which has been refectored quite a bit to handle removable devices, the new SAS controller support etc. * align the logic in vboxSnapshotGetReadWriteDisks and vboxSnapshotGetReadOnlyDisks to more closely resemble vboxDumpDisks. * vboxGenerateMediumName was simplified to no longer "compute" the device name value as deviePort/deviceSlot and their upper bound values are no longer enough to do this accurately due to the added SAS bus support which does not "map" directly into libvirt XML semantics * vboxGetMaxPortSlotValues is now removed as it's no longer used --- src/vbox/vbox_common.c | 691 ++++++++++++++++++++++++++++-----------------= ---- 1 file changed, 393 insertions(+), 298 deletions(-) diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 7645b29a0..dd876645a 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -290,126 +290,44 @@ static int openSessionForMachine(vboxDriverPtr data,= const unsigned char *dom_uu return 0; } =20 -/** - * function to get the values for max port per - * instance and max slots per port for the devices - * - * @returns true on Success, false on failure. - * @param vbox Input IVirtualBox pointer - * @param maxPortPerInst Output array of max port per instance - * @param maxSlotPerPort Output array of max slot per port - * - */ - -static bool vboxGetMaxPortSlotValues(IVirtualBox *vbox, - PRUint32 *maxPortPerInst, - PRUint32 *maxSlotPerPort) -{ - ISystemProperties *sysProps =3D NULL; - - if (!vbox) - return false; - - gVBoxAPI.UIVirtualBox.GetSystemProperties(vbox, &sysProps); - - if (!sysProps) - return false; - - gVBoxAPI.UISystemProperties.GetMaxPortCountForStorageBus(sysProps, - StorageBus_ID= E, - &maxPortPerIn= st[StorageBus_IDE]); - gVBoxAPI.UISystemProperties.GetMaxPortCountForStorageBus(sysProps, - StorageBus_SA= TA, - &maxPortPerIn= st[StorageBus_SATA]); - gVBoxAPI.UISystemProperties.GetMaxPortCountForStorageBus(sysProps, - StorageBus_SC= SI, - &maxPortPerIn= st[StorageBus_SCSI]); - gVBoxAPI.UISystemProperties.GetMaxPortCountForStorageBus(sysProps, - StorageBus_SA= S, - &maxPortPerIn= st[StorageBus_SAS]); - gVBoxAPI.UISystemProperties.GetMaxPortCountForStorageBus(sysProps, - StorageBus_Fl= oppy, - &maxPortPerIn= st[StorageBus_Floppy]); - - gVBoxAPI.UISystemProperties.GetMaxDevicesPerPortForStorageBus(sysProps, - StorageB= us_IDE, - &maxSlot= PerPort[StorageBus_IDE]); - gVBoxAPI.UISystemProperties.GetMaxDevicesPerPortForStorageBus(sysProps, - StorageB= us_SATA, - &maxSlot= PerPort[StorageBus_SATA]); - gVBoxAPI.UISystemProperties.GetMaxDevicesPerPortForStorageBus(sysProps, - StorageB= us_SCSI, - &maxSlot= PerPort[StorageBus_SCSI]); - gVBoxAPI.UISystemProperties.GetMaxDevicesPerPortForStorageBus(sysProps, - StorageB= us_SAS, - &maxSlot= PerPort[StorageBus_SAS]); - gVBoxAPI.UISystemProperties.GetMaxDevicesPerPortForStorageBus(sysProps, - StorageB= us_Floppy, - &maxSlot= PerPort[StorageBus_Floppy]); - - VBOX_RELEASE(sysProps); - - return true; -} - /** * function to generate the name for medium, * for e.g: hda, sda, etc * * @returns null terminated string with device name or NULL * for failures - * @param conn Input Connection Pointer * @param storageBus Input storage bus type - * @param deviceInst Input device instance number * @param devicePort Input port number * @param deviceSlot Input slot number - * @param aMaxPortPerInst Input array of max port per device instance - * @param aMaxSlotPerPort Input array of max slot per device port - * + * @param sdCount Running total of disk devices with "sd" pr= efix */ -static char *vboxGenerateMediumName(PRUint32 storageBus, - PRInt32 deviceInst, - PRInt32 devicePort, - PRInt32 deviceSlot, - PRUint32 *aMaxPortPerInst, - PRUint32 *aMaxSlotPerPort) +static char * +vboxGenerateMediumName(PRUint32 storageBus, PRInt32 devicePort, + PRInt32 deviceSlot, size_t sdCount) { const char *prefix =3D NULL; char *name =3D NULL; int total =3D 0; - PRUint32 maxPortPerInst =3D 0; - PRUint32 maxSlotPerPort =3D 0; - - if (!aMaxPortPerInst || - !aMaxSlotPerPort) - return NULL; =20 if ((storageBus < StorageBus_IDE) || (storageBus > StorageBus_SAS)) return NULL; =20 - maxPortPerInst =3D aMaxPortPerInst[storageBus]; - maxSlotPerPort =3D aMaxSlotPerPort[storageBus]; - total =3D (deviceInst * maxPortPerInst * maxSlotPerPort) - + (devicePort * maxSlotPerPort) - + deviceSlot; - if (storageBus =3D=3D StorageBus_IDE) { prefix =3D "hd"; + total =3D devicePort * 2 + deviceSlot; } else if (storageBus =3D=3D StorageBus_SATA || storageBus =3D=3D StorageBus_SCSI || storageBus =3D=3D StorageBus_SAS) { prefix =3D "sd"; + total =3D sdCount; } else if (storageBus =3D=3D StorageBus_Floppy) { + total =3D deviceSlot; prefix =3D "fd"; } =20 name =3D virIndexToDiskName(total, prefix); =20 - VIR_DEBUG("name=3D%s, total=3D%d, storageBus=3D%u, deviceInst=3D%d, " - "devicePort=3D%d deviceSlot=3D%d, maxPortPerInst=3D%u maxSlotPer= Port=3D%u", - NULLSTR(name), total, storageBus, deviceInst, devicePort, - deviceSlot, maxPortPerInst, maxSlotPerPort); return name; } =20 @@ -3086,162 +3004,300 @@ vboxHostDeviceGetXMLDesc(vboxDriverPtr data, virD= omainDefPtr def, IMachine *mach } =20 static void -vboxDumpIDEHDDs(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) +vboxDumpStorageControllers(virDomainDefPtr def, + vboxDriverPtr data ATTRIBUTE_UNUSED, + IMachine *machine) { - /* dump IDE hdds if present */ - vboxArray mediumAttachments =3D VBOX_ARRAY_INITIALIZER; - bool error =3D false; - int diskCount =3D 0; - size_t i; - PRUint32 maxPortPerInst[StorageBus_SAS + 1] =3D {}; - PRUint32 maxSlotPerPort[StorageBus_SAS + 1] =3D {}; + vboxArray storageControllers =3D VBOX_ARRAY_INITIALIZER; + virDomainControllerDefPtr cont =3D NULL; + size_t i =3D 0; =20 - def->ndisks =3D 0; - gVBoxAPI.UArray.vboxArrayGet(&mediumAttachments, machine, - gVBoxAPI.UArray.handleMachineGetMediumAtt= achments(machine)); + gVBoxAPI.UArray.vboxArrayGet(&storageControllers, machine, + gVBoxAPI.UArray.handleMachineGetStorageControllers(machin= e)); =20 - /* get the number of attachments */ - for (i =3D 0; i < mediumAttachments.count; i++) { - IMediumAttachment *imediumattach =3D mediumAttachments.items[i]; - if (imediumattach) { - IMedium *medium =3D NULL; + for (i =3D 0; i < storageControllers.count; i++) { + IStorageController *controller =3D storageControllers.items[i]; + PRUint32 storageBus =3D StorageBus_Null; + PRUint32 controllerType =3D StorageControllerType_Null; + + gVBoxAPI.UIStorageController.GetBus(controller, &storageBus); + gVBoxAPI.UIStorageController.GetControllerType(controller, + &controllerType); + + switch (storageBus) { + case StorageBus_IDE: + { + int model =3D -1; + switch (controllerType) { + case StorageControllerType_PIIX3: + model =3D VIR_DOMAIN_CONTROLLER_MODEL_IDE_PIIX3; + break; + case StorageControllerType_PIIX4: + model =3D VIR_DOMAIN_CONTROLLER_MODEL_IDE_PIIX4; + break; + case StorageControllerType_ICH6: + model =3D VIR_DOMAIN_CONTROLLER_MODEL_IDE_ICH6; + break; + } =20 - gVBoxAPI.UIMediumAttachment.GetMedium(imediumattach, &medium); - if (medium) { - def->ndisks++; - VBOX_RELEASE(medium); + cont =3D virDomainDefAddController(def, VIR_DOMAIN_CONTROLLER_= TYPE_IDE, + -1, model); + + break; + } + case StorageBus_SCSI: + { + int model =3D -1; + switch (controllerType) { + case StorageControllerType_BusLogic: + model =3D VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC; + break; + case StorageControllerType_LsiLogic: + model =3D VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC; + break; } + + cont =3D virDomainDefAddController(def, VIR_DOMAIN_CONTROLLER_= TYPE_SCSI, + -1, model); + + break; + } + case StorageBus_SAS: + cont =3D virDomainDefAddController(def, + VIR_DOMAIN_CONTROLLER_TYPE_SC= SI, -1, + VIR_DOMAIN_CONTROLLER_MODEL_S= CSI_LSISAS1068); + break; + case StorageBus_SATA: + cont =3D virDomainDefAddController(def, + VIR_DOMAIN_CONTROLLER_TYPE_SA= TA, -1, -1); + break; + case StorageBus_Floppy: + cont =3D virDomainDefAddController(def, + VIR_DOMAIN_CONTROLLER_TYPE_FDC, -1, = -1); + break; } } =20 - /* Allocate mem, if fails return error */ - if (VIR_ALLOC_N(def->disks, def->ndisks) >=3D 0) { - for (i =3D 0; i < def->ndisks; i++) { - virDomainDiskDefPtr disk =3D virDomainDiskDefNew(NULL); - if (!disk) { - error =3D true; - break; + if (!cont) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Failed to add controller definition")); + } +} + +static void +vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) +{ + vboxArray mediumAttachments =3D VBOX_ARRAY_INITIALIZER; + IMediumAttachment *mediumattach =3D NULL; + IMedium *medium =3D NULL; + nsresult rc; + size_t sdCount =3D 0, i, j; + + def->ndisks =3D 0; + rc =3D gVBoxAPI.UArray.vboxArrayGet(&mediumAttachments, machine, + gVBoxAPI.UArray.handleMachineGetMediumAttachments(machin= e)); + + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Could not get machine's medium attachments")); + goto error; + } + + /* get the number of attachments */ + for (i =3D 0; i < mediumAttachments.count; i++) { + mediumattach =3D mediumAttachments.items[i]; + if (mediumattach) { + rc =3D gVBoxAPI.UIMediumAttachment.GetMedium(mediumattach, &me= dium); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("cannot get medium")); + goto error; } - def->disks[i] =3D disk; + + def->ndisks++; + VBOX_RELEASE(medium); } - } else { - error =3D true; } =20 - if (!error) - error =3D !vboxGetMaxPortSlotValues(data->vboxObj, maxPortPerInst,= maxSlotPerPort); + if (VIR_ALLOC_N(def->disks, def->ndisks) < 0) + goto error; + + for (i =3D 0; i < def->ndisks; i++) { + virDomainDiskDefPtr disk =3D virDomainDiskDefNew(NULL); + if (!disk) + goto error; + + def->disks[i] =3D disk; + } =20 /* get the attachment details here */ - for (i =3D 0; i < mediumAttachments.count && diskCount < def->ndisks &= & !error; i++) { - IMediumAttachment *imediumattach =3D mediumAttachments.items[i]; + for (i =3D 0; i < mediumAttachments.count; i++) { + mediumattach =3D mediumAttachments.items[i]; IStorageController *storageController =3D NULL; PRUnichar *storageControllerName =3D NULL; PRUint32 deviceType =3D DeviceType_Null; PRUint32 storageBus =3D StorageBus_Null; PRBool readOnly =3D PR_FALSE; - IMedium *medium =3D NULL; PRUnichar *mediumLocUtf16 =3D NULL; char *mediumLocUtf8 =3D NULL; - PRUint32 deviceInst =3D 0; PRInt32 devicePort =3D 0; PRInt32 deviceSlot =3D 0; + virDomainDiskDefPtr disk =3D def->disks[i]; =20 - if (!imediumattach) - continue; + if (!mediumattach) + goto skip; =20 - gVBoxAPI.UIMediumAttachment.GetMedium(imediumattach, &medium); - if (!medium) - continue; + rc =3D gVBoxAPI.UIMediumAttachment.GetController(mediumattach, + &storageControllerN= ame); + if (NS_FAILED(rc)) { + VIR_WARN("Could not get storage controller name for medium " + "attachment, rc=3D%08x", (unsigned) rc); + goto skip; + } =20 - gVBoxAPI.UIMediumAttachment.GetController(imediumattach, &storageC= ontrollerName); - if (!storageControllerName) { - VBOX_RELEASE(medium); - continue; + rc =3D gVBoxAPI.UIMachine.GetStorageControllerByName(machine, + storageControll= erName, + &storageControl= ler); + if (NS_FAILED(rc)) { + VIR_WARN("Could not get storage controller for medium attachme= nt, " + "rc=3D%08x", (unsigned) rc); + goto skip; } =20 - gVBoxAPI.UIMachine.GetStorageControllerByName(machine, - storageControllerNam= e, - &storageController); - VBOX_UTF16_FREE(storageControllerName); - if (!storageController) { - VBOX_RELEASE(medium); - continue; + rc =3D gVBoxAPI.UIStorageController.GetBus(storageController, + &storageBus); + if (NS_FAILED(rc)) { + VIR_WARN("Could not get storage controller bus type, rc=3D%08x= ", + (unsigned) rc); + goto skip; } =20 - gVBoxAPI.UIMedium.GetLocation(medium, &mediumLocUtf16); - VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8); - VBOX_UTF16_FREE(mediumLocUtf16); - ignore_value(virDomainDiskSetSource(def->disks[diskCount], - mediumLocUtf8)); - VBOX_UTF8_FREE(mediumLocUtf8); + rc =3D gVBoxAPI.UIMediumAttachment.GetType(mediumattach, &deviceTy= pe); + if (NS_FAILED(rc)) { + VIR_WARN("Could not get device type for medium attachment, rc= =3D%08x", + (unsigned) rc); + goto skip; + } =20 - if (!virDomainDiskGetSource(def->disks[diskCount])) { - VBOX_RELEASE(medium); - VBOX_RELEASE(storageController); - error =3D true; - break; + rc =3D gVBoxAPI.UIMediumAttachment.GetPort(mediumattach, &devicePo= rt); + if (NS_FAILED(rc)) { + VIR_WARN("Could not get device port for medium attachment, rc= =3D%08x", + (unsigned) rc); + goto skip; + } + + rc =3D gVBoxAPI.UIMediumAttachment.GetDevice(mediumattach, &device= Slot); + if (NS_FAILED(rc)) { + VIR_WARN("Could not get device slot for medium attachment, rc= =3D%08x", + (unsigned) rc); + goto skip; } =20 - gVBoxAPI.UIStorageController.GetBus(storageController, &storageBus= ); + rc =3D gVBoxAPI.UIMediumAttachment.GetMedium(mediumattach, &medium= ); + if (NS_FAILED(rc)) { + VIR_WARN("Could not get medium for medium attachment, rc=3D%08= x", + (unsigned) rc); + goto skip; + } + + /* removable drives might not have mediums */ + if (medium) { + rc =3D gVBoxAPI.UIMedium.GetLocation(medium, &mediumLocUtf16); + if (NS_FAILED(rc)) { + VIR_WARN("Clould not get storage location for medium, rc= =3D%08x", + (unsigned) rc); + goto skip; + } + + rc =3D gVBoxAPI.UIMedium.GetReadOnly(medium, &readOnly); + if (NS_FAILED(rc)) { + VIR_WARN("Clould not get read-only status for medium, rc= =3D%08x", + (unsigned) rc); + goto skip; + } + + VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8); + if (virDomainDiskSetSource(disk, mediumLocUtf8) < 0) { + VIR_WARN("Could not set disk source for medium %s", + mediumLocUtf8); + goto skip; + } + } + + disk->info.type =3D VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE; + disk->info.addr.drive.bus =3D 0; + disk->info.addr.drive.unit =3D devicePort; + + disk->dst =3D vboxGenerateMediumName(storageBus, devicePort, devic= eSlot, + sdCount); if (storageBus =3D=3D StorageBus_IDE) { - def->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_IDE; + disk->bus =3D VIR_DOMAIN_DISK_BUS_IDE; + disk->info.addr.drive.bus =3D devicePort; /* primary, secondar= y */ + disk->info.addr.drive.unit =3D deviceSlot; /* master, slave */ + disk->dst =3D virIndexToDiskName(devicePort * 2 + deviceSlot, = "hd"); + disk->info.addr.drive.controller =3D + virDomainControllerFindByType(def, + VIR_DOMAIN_CONTROLLER_TYPE_I= DE); } else if (storageBus =3D=3D StorageBus_SATA) { - def->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_SATA; + disk->bus =3D VIR_DOMAIN_DISK_BUS_SATA; + disk->info.addr.drive.controller =3D + virDomainControllerFindByType(def, + VIR_DOMAIN_CONTROLLER_TYPE_S= ATA); + sdCount++; } else if (storageBus =3D=3D StorageBus_SCSI || storageBus =3D=3D StorageBus_SAS) { - def->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_SCSI; + disk->bus =3D VIR_DOMAIN_DISK_BUS_SCSI; + sdCount++; + /* find scsi controller index with matching model for vbox bus= type */ + for (j =3D 0; j < def->ncontrollers; j++) { + virDomainControllerDefPtr ctrl =3D def->controllers[j]; + + if (ctrl->type !=3D VIR_DOMAIN_CONTROLLER_TYPE_SCSI) + continue; + + if (storageBus =3D=3D StorageBus_SAS && + ctrl->model =3D=3D VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LS= ISAS1068) { + disk->info.addr.drive.controller =3D ctrl->idx; + } else if (storageBus =3D=3D StorageBus_SCSI && + ctrl->model !=3D VIR_DOMAIN_CONTROLLER_MODEL_SC= SI_LSISAS1068) { + disk->info.addr.drive.controller =3D ctrl->idx; + } + } } else if (storageBus =3D=3D StorageBus_Floppy) { - def->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_FDC; + disk->bus =3D VIR_DOMAIN_DISK_BUS_FDC; + disk->info.addr.drive.unit =3D deviceSlot; } =20 - gVBoxAPI.UIMediumAttachment.GetType(imediumattach, &deviceType); if (deviceType =3D=3D DeviceType_HardDisk) - def->disks[diskCount]->device =3D VIR_DOMAIN_DISK_DEVICE_DISK; + disk->device =3D VIR_DOMAIN_DISK_DEVICE_DISK; else if (deviceType =3D=3D DeviceType_Floppy) - def->disks[diskCount]->device =3D VIR_DOMAIN_DISK_DEVICE_FLOPP= Y; + disk->device =3D VIR_DOMAIN_DISK_DEVICE_FLOPPY; else if (deviceType =3D=3D DeviceType_DVD) - def->disks[diskCount]->device =3D VIR_DOMAIN_DISK_DEVICE_CDROM; - - gVBoxAPI.UIMediumAttachment.GetPort(imediumattach, &devicePort); - gVBoxAPI.UIMediumAttachment.GetDevice(imediumattach, &deviceSlot); - def->disks[diskCount]->dst =3D vboxGenerateMediumName(storageBus, - deviceInst, - devicePort, - deviceSlot, - maxPortPerInst, - maxSlotPerPort= ); - if (!def->disks[diskCount]->dst) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Could not generate medium name for the disk " - "at: controller instance:%u, port:%d, slot:%d= "), - deviceInst, devicePort, deviceSlot); - VBOX_RELEASE(medium); - VBOX_RELEASE(storageController); - error =3D true; - break; - } + disk->device =3D VIR_DOMAIN_DISK_DEVICE_CDROM; =20 - gVBoxAPI.UIMedium.GetReadOnly(medium, &readOnly); if (readOnly =3D=3D PR_TRUE) - def->disks[diskCount]->src->readonly =3D true; + disk->src->readonly =3D true; =20 - virDomainDiskSetType(def->disks[diskCount], - VIR_STORAGE_TYPE_FILE); + virDomainDiskSetType(disk, VIR_STORAGE_TYPE_FILE); =20 + skip: + VBOX_UTF16_FREE(storageControllerName); + VBOX_UTF8_FREE(mediumLocUtf8); + VBOX_UTF16_FREE(mediumLocUtf16); VBOX_RELEASE(medium); VBOX_RELEASE(storageController); - diskCount++; } =20 gVBoxAPI.UArray.vboxArrayRelease(&mediumAttachments); =20 - /* cleanup on error */ - if (error) { - for (i =3D 0; i < def->ndisks; i++) - VIR_FREE(def->disks[i]); - VIR_FREE(def->disks); - def->ndisks =3D 0; - } + return; + + error: + for (i =3D 0; i < def->ndisks; i++) + VIR_FREE(def->disks[i]); + VIR_FREE(def->disks); + def->ndisks =3D 0; + gVBoxAPI.UArray.vboxArrayRelease(&mediumAttachments); } =20 static int @@ -3934,8 +3990,8 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, u= nsigned int flags) if (vboxDumpDisplay(def, data, machine) < 0) goto cleanup; =20 - vboxDumpIDEHDDs(def, data, machine); - + vboxDumpStorageControllers(def, data, machine); + vboxDumpDisks(def, data, machine); vboxDumpSharedFolders(def, data, machine); vboxDumpNetwork(def, data, machine, networkAdapterCount); vboxDumpAudio(def, data, machine); @@ -5490,8 +5546,9 @@ vboxDomainSnapshotGet(vboxDriverPtr data, return snapshot; } =20 -static int vboxSnapshotGetReadWriteDisks(virDomainSnapshotDefPtr def, - virDomainSnapshotPtr snapshot) +static int +vboxSnapshotGetReadWriteDisks(virDomainSnapshotDefPtr def, + virDomainSnapshotPtr snapshot) { virDomainPtr dom =3D snapshot->domain; vboxDriverPtr data =3D dom->conn->privateData; @@ -5500,9 +5557,7 @@ static int vboxSnapshotGetReadWriteDisks(virDomainSna= pshotDefPtr def, ISnapshot *snap =3D NULL; IMachine *snapMachine =3D NULL; vboxArray mediumAttachments =3D VBOX_ARRAY_INITIALIZER; - PRUint32 maxPortPerInst[StorageBus_Floppy + 1] =3D {}; - PRUint32 maxSlotPerPort[StorageBus_Floppy + 1] =3D {}; - int diskCount =3D 0; + size_t diskCount =3D 0, sdCount =3D 0; nsresult rc; vboxIID snapIid; char *snapshotUuidStr =3D NULL; @@ -5571,9 +5626,6 @@ static int vboxSnapshotGetReadWriteDisks(virDomainSna= pshotDefPtr def, goto cleanup; } =20 - if (!vboxGetMaxPortSlotValues(data->vboxObj, maxPortPerInst, maxSlotPe= rPort)) - goto cleanup; - /* get the attachment details here */ for (i =3D 0; i < mediumAttachments.count && diskCount < def->ndisks; = i++) { IStorageController *storageController =3D NULL; @@ -5583,7 +5635,6 @@ static int vboxSnapshotGetReadWriteDisks(virDomainSna= pshotDefPtr def, IMedium *disk =3D NULL; PRUnichar *childLocUtf16 =3D NULL; char *childLocUtf8 =3D NULL; - PRUint32 deviceInst =3D 0; PRInt32 devicePort =3D 0; PRInt32 deviceSlot =3D 0; vboxArray children =3D VBOX_ARRAY_INITIALIZER; @@ -5592,31 +5643,76 @@ static int vboxSnapshotGetReadWriteDisks(virDomainS= napshotDefPtr def, void *handle; size_t j =3D 0; size_t k =3D 0; + if (!imediumattach) continue; - rc =3D gVBoxAPI.UIMediumAttachment.GetMedium(imediumattach, &disk); + + rc =3D gVBoxAPI.UIMediumAttachment.GetController(imediumattach, + &storageControllerN= ame); if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot get medium")); + _("cannot get controller")); goto cleanup; } - if (!disk) + + if (!storageControllerName) continue; - rc =3D gVBoxAPI.UIMediumAttachment.GetController(imediumattach, &s= torageControllerName); + + rc =3D gVBoxAPI.UIMachine.GetStorageControllerByName(machine, + storageControll= erName, + &storageControl= ler); + VBOX_UTF16_FREE(storageControllerName); + if (!storageController) + continue; + + rc =3D gVBoxAPI.UIStorageController.GetBus(storageController, &sto= rageBus); if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot get controller")); + _("cannot get storage controller bus")); + VBOX_RELEASE(storageController); goto cleanup; } - if (!storageControllerName) { - VBOX_RELEASE(disk); - continue; + rc =3D gVBoxAPI.UIMediumAttachment.GetType(imediumattach, &deviceT= ype); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("cannot get medium attachment type")); + VBOX_RELEASE(storageController); + goto cleanup; + } + rc =3D gVBoxAPI.UIMediumAttachment.GetPort(imediumattach, &deviceP= ort); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("cannot get medium attachment type")); + VBOX_RELEASE(storageController); + goto cleanup; } + rc =3D gVBoxAPI.UIMediumAttachment.GetDevice(imediumattach, &devic= eSlot); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("cannot get medium attachment device")); + VBOX_RELEASE(storageController); + goto cleanup; + } + + rc =3D gVBoxAPI.UIMediumAttachment.GetMedium(imediumattach, &disk); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("cannot get medium")); + VBOX_RELEASE(storageController); + goto cleanup; + } + + /* skip removable disk */ + if (!disk) + goto skip; + handle =3D gVBoxAPI.UArray.handleMediumGetChildren(disk); rc =3D gVBoxAPI.UArray.vboxArrayGet(&children, disk, handle); if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot get children disk")); + VBOX_RELEASE(storageController); + VBOX_RELEASE(disk); goto cleanup; } handle =3D gVBoxAPI.UArray.handleMediumGetSnapshotIds(disk); @@ -5625,8 +5721,11 @@ static int vboxSnapshotGetReadWriteDisks(virDomainSn= apshotDefPtr def, if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot get snapshot ids")); + VBOX_RELEASE(storageController); + VBOX_RELEASE(disk); goto cleanup; } + for (j =3D 0; j < children.count; ++j) { IMedium *child =3D children.items[j]; for (k =3D 0; k < snapshotIids.count; ++k) { @@ -5634,18 +5733,13 @@ static int vboxSnapshotGetReadWriteDisks(virDomainS= napshotDefPtr def, char *diskSnapIdStr =3D NULL; VBOX_UTF16_TO_UTF8(diskSnapId, &diskSnapIdStr); if (STREQ(diskSnapIdStr, snapshotUuidStr)) { - rc =3D gVBoxAPI.UIMachine.GetStorageControllerByName(m= achine, - sto= rageControllerName, - &st= orageController); - VBOX_UTF16_FREE(storageControllerName); - if (!storageController) { - VBOX_RELEASE(child); - break; - } rc =3D gVBoxAPI.UIMedium.GetLocation(child, &childLocU= tf16); if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot get disk location")); + VBOX_RELEASE(child); + VBOX_RELEASE(storageController); + VBOX_RELEASE(disk); goto cleanup; } VBOX_UTF16_TO_UTF8(childLocUtf16, &childLocUtf8); @@ -5653,52 +5747,37 @@ static int vboxSnapshotGetReadWriteDisks(virDomainS= napshotDefPtr def, if (VIR_STRDUP(def->disks[diskCount].src->path, childL= ocUtf8) < 0) { VBOX_RELEASE(child); VBOX_RELEASE(storageController); + VBOX_RELEASE(disk); goto cleanup; } VBOX_UTF8_FREE(childLocUtf8); =20 - rc =3D gVBoxAPI.UIStorageController.GetBus(storageCont= roller, &storageBus); - if (NS_FAILED(rc)) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot get storage controller bu= s")); - goto cleanup; - } - rc =3D gVBoxAPI.UIMediumAttachment.GetType(imediumatta= ch, &deviceType); - if (NS_FAILED(rc)) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot get medium attachment typ= e")); - goto cleanup; - } - rc =3D gVBoxAPI.UIMediumAttachment.GetPort(imediumatta= ch, &devicePort); - if (NS_FAILED(rc)) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot get medium attachment typ= e")); - goto cleanup; - } - rc =3D gVBoxAPI.UIMediumAttachment.GetDevice(imediumat= tach, &deviceSlot); - if (NS_FAILED(rc)) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot get medium attachment dev= ice")); - goto cleanup; - } def->disks[diskCount].src->type =3D VIR_STORAGE_TYPE_F= ILE; def->disks[diskCount].name =3D vboxGenerateMediumName(= storageBus, - de= viceInst, de= vicePort, de= viceSlot, - ma= xPortPerInst, - ma= xSlotPerPort); + sd= Count); } VBOX_UTF8_FREE(diskSnapIdStr); } } + + diskCount++; + + skip: VBOX_RELEASE(storageController); VBOX_RELEASE(disk); - diskCount++; + + if (storageBus =3D=3D StorageBus_SATA || storageBus =3D=3D Storage= Bus_SCSI || + storageBus =3D=3D StorageBus_SAS) + sdCount++; + } + gVBoxAPI.UArray.vboxArrayRelease(&mediumAttachments); =20 ret =3D 0; + cleanup: if (ret < 0) { for (i =3D 0; i < def->ndisks; i++) @@ -5710,9 +5789,9 @@ static int vboxSnapshotGetReadWriteDisks(virDomainSna= pshotDefPtr def, return ret; } =20 -static -int vboxSnapshotGetReadOnlyDisks(virDomainSnapshotPtr snapshot, - virDomainSnapshotDefPtr def) +static int +vboxSnapshotGetReadOnlyDisks(virDomainSnapshotDefPtr def, + virDomainSnapshotPtr snapshot) { virDomainPtr dom =3D snapshot->domain; vboxDriverPtr data =3D dom->conn->privateData; @@ -5725,9 +5804,7 @@ int vboxSnapshotGetReadOnlyDisks(virDomainSnapshotPtr= snapshot, nsresult rc; vboxArray mediumAttachments =3D VBOX_ARRAY_INITIALIZER; size_t i =3D 0; - PRUint32 maxPortPerInst[StorageBus_Floppy + 1] =3D {}; - PRUint32 maxSlotPerPort[StorageBus_Floppy + 1] =3D {}; - int diskCount =3D 0; + size_t diskCount =3D 0, sdCount =3D 0; int ret =3D -1; =20 if (!data->vboxObj) @@ -5790,9 +5867,6 @@ int vboxSnapshotGetReadOnlyDisks(virDomainSnapshotPtr= snapshot, goto cleanup; } =20 - if (!vboxGetMaxPortSlotValues(data->vboxObj, maxPortPerInst, maxSlotPe= rPort)) - goto cleanup; - /* get the attachment details here */ for (i =3D 0; i < mediumAttachments.count && diskCount < def->dom->ndi= sks; i++) { PRUnichar *storageControllerName =3D NULL; @@ -5805,16 +5879,17 @@ int vboxSnapshotGetReadOnlyDisks(virDomainSnapshotP= tr snapshot, PRInt32 devicePort =3D 0; PRInt32 deviceSlot =3D 0; IMediumAttachment *imediumattach =3D mediumAttachments.items[i]; + if (!imediumattach) continue; + rc =3D gVBoxAPI.UIMediumAttachment.GetMedium(imediumattach, &disk); if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot get medium")); goto cleanup; } - if (!disk) - continue; + rc =3D gVBoxAPI.UIMediumAttachment.GetController(imediumattach, &s= torageControllerName); if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -5834,41 +5909,85 @@ int vboxSnapshotGetReadOnlyDisks(virDomainSnapshotP= tr snapshot, VBOX_UTF16_FREE(storageControllerName); if (!storageController) continue; - rc =3D gVBoxAPI.UIMedium.GetLocation(disk, &mediumLocUtf16); + + rc =3D gVBoxAPI.UIStorageController.GetBus(storageController, &sto= rageBus); if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot get disk location")); + _("cannot get storage controller bus")); goto cleanup; } - VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8); - VBOX_UTF16_FREE(mediumLocUtf16); - if (VIR_STRDUP(def->dom->disks[diskCount]->src->path, mediumLocUtf= 8) < 0) + + rc =3D gVBoxAPI.UIMediumAttachment.GetPort(imediumattach, &deviceP= ort); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("cannot get medium attachment port")); goto cleanup; + } =20 - VBOX_UTF8_FREE(mediumLocUtf8); + rc =3D gVBoxAPI.UIMediumAttachment.GetDevice(imediumattach, &devic= eSlot); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("cannot get device")); + goto cleanup; + } =20 - rc =3D gVBoxAPI.UIStorageController.GetBus(storageController, &sto= rageBus); + + rc =3D gVBoxAPI.UIMediumAttachment.GetType(imediumattach, &deviceT= ype); if (NS_FAILED(rc)) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot get storage controller bus")); + _("cannot get medium attachment type")); goto cleanup; } + + if (disk) { + rc =3D gVBoxAPI.UIMedium.GetLocation(disk, &mediumLocUtf16); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("cannot get disk location")); + goto cleanup; + } + VBOX_UTF16_TO_UTF8(mediumLocUtf16, &mediumLocUtf8); + VBOX_UTF16_FREE(mediumLocUtf16); + if (VIR_STRDUP(def->dom->disks[diskCount]->src->path, mediumLo= cUtf8) < 0) + goto cleanup; + + VBOX_UTF8_FREE(mediumLocUtf8); + + rc =3D gVBoxAPI.UIMedium.GetReadOnly(disk, &readOnly); + if (NS_FAILED(rc)) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("cannot get read only attribute")); + goto cleanup; + } + } else { + /* for removable drives, bump sdCount according to type so that + * device names are properly generated, and then skip it + */ + if (storageBus =3D=3D StorageBus_SATA || + storageBus =3D=3D StorageBus_SCSI || + storageBus =3D=3D StorageBus_SAS) + sdCount++; + + continue; + } + + def->dom->disks[diskCount]->dst =3D vboxGenerateMediumName(storage= Bus, + devicePor= t, + deviceSlo= t, + sdCount); if (storageBus =3D=3D StorageBus_IDE) { def->dom->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_IDE; } else if (storageBus =3D=3D StorageBus_SATA) { def->dom->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_SATA; - } else if (storageBus =3D=3D StorageBus_SCSI) { + sdCount++; + } else if (storageBus =3D=3D StorageBus_SCSI || + storageBus =3D=3D StorageBus_SAS) { def->dom->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_SCSI; + sdCount++; } else if (storageBus =3D=3D StorageBus_Floppy) { def->dom->disks[diskCount]->bus =3D VIR_DOMAIN_DISK_BUS_FDC; } =20 - rc =3D gVBoxAPI.UIMediumAttachment.GetType(imediumattach, &deviceT= ype); - if (NS_FAILED(rc)) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot get medium attachment type")); - goto cleanup; - } if (deviceType =3D=3D DeviceType_HardDisk) def->dom->disks[diskCount]->device =3D VIR_DOMAIN_DISK_DEVICE_= DISK; else if (deviceType =3D=3D DeviceType_Floppy) @@ -5876,33 +5995,9 @@ int vboxSnapshotGetReadOnlyDisks(virDomainSnapshotPt= r snapshot, else if (deviceType =3D=3D DeviceType_DVD) def->dom->disks[diskCount]->device =3D VIR_DOMAIN_DISK_DEVICE_= CDROM; =20 - rc =3D gVBoxAPI.UIMediumAttachment.GetPort(imediumattach, &deviceP= ort); - if (NS_FAILED(rc)) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot get medium attachment port")); - goto cleanup; - } - rc =3D gVBoxAPI.UIMediumAttachment.GetDevice(imediumattach, &devic= eSlot); - if (NS_FAILED(rc)) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot get device")); - goto cleanup; - } - rc =3D gVBoxAPI.UIMedium.GetReadOnly(disk, &readOnly); - if (NS_FAILED(rc)) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot get read only attribute")); - goto cleanup; - } if (readOnly =3D=3D PR_TRUE) def->dom->disks[diskCount]->src->readonly =3D true; def->dom->disks[diskCount]->src->type =3D VIR_STORAGE_TYPE_FILE; - def->dom->disks[diskCount]->dst =3D vboxGenerateMediumName(storage= Bus, - deviceIns= t, - devicePor= t, - deviceSlo= t, - maxPortPe= rInst, - maxSlotPe= rPort); if (!def->dom->disks[diskCount]->dst) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Could not generate medium name for the disk " @@ -5995,7 +6090,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, if (vboxSnapshotGetReadWriteDisks(def, snapshot) < 0) VIR_DEBUG("Could not get read write disks for snapshot"); =20 - if (vboxSnapshotGetReadOnlyDisks(snapshot, def) < 0) + if (vboxSnapshotGetReadOnlyDisks(def, snapshot) < 0) VIR_DEBUG("Could not get Readonly disks for snapshot"); } =20 --=20 2.14.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list