From nobody Tue Sep 9 03:13:56 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1748860316; cv=none; d=zohomail.com; s=zohoarc; b=MK56hngwkUq1EljOoVFU8y1+tlJffrBFRAuYR3BRuLJ3OW2uKNmrnGrxd9+90qV+pPnZZzjMLZrjdfICG84cTQr4jCz2oh9WemiWb8nfXBkdaliqghDAxgA4ssnr41O0Xl17sH9TUFPuTH2fpd2nPNnqSTJpsW7lGGnIGedc7gY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1748860316; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=k+CDE71taglmMhf72RAMwL8UDaiDdt05MaNswT5otZ4=; b=fUszl3wsFfgweiT2t4SxvYvAokToUZdqYsjq14cZ1p2x9ZuLdotDhPhmv9gBDstYK0X1AOlQwtA/dJ5/JdoOW//+YHCHypvLGLScRgSrKzXTRXvoG1vNR2NXWbPyNss/rfjwim8j90nXQfYzWYuAWPg9710rCdIg+ckXKsq8Nk0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 17488603165951013.4453172434734; Mon, 2 Jun 2025 03:31:56 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 818B91085; Mon, 2 Jun 2025 06:31:55 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 1620A10F2; Mon, 2 Jun 2025 06:31:08 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id 8D5C6E77; Mon, 2 Jun 2025 06:31:04 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 29D0FE77 for ; Mon, 2 Jun 2025 06:31:02 -0400 (EDT) Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-609-zyrXXYWrPbaZfIE_kBoPPA-1; Mon, 02 Jun 2025 06:31:00 -0400 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-451deff247cso2280225e9.1 for ; Mon, 02 Jun 2025 03:31:00 -0700 (PDT) Received: from wheatley.localdomain ([85.93.96.130]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-450d8000e3esm116758025e9.22.2025.06.02.03.30.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 02 Jun 2025 03:30:57 -0700 (PDT) Received: from wheatley.brq.redhat.com (wheatley.k8r.cz [127.0.0.1]) by wheatley.localdomain (Postfix) with ESMTP id 57DA9B55DC73 for ; Mon, 02 Jun 2025 12:30:57 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H5, RCVD_IN_MSPIKE_WL,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1748860261; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SG2TAULP+rgVRsnjFoNBnQJRSpAN/XOkTEHdBfNs7xs=; b=cIzdoXIFxPAo1cHbwF1KTGDS8Az8W546wLFP31SRXnLn4NReqm2Z62HmeU7cNTRqz1pZrq cJlSJHvIbMT+AYjcE4RbVekFATuBSAONwwxBExpyJfEwu8FJv7Qoq4bXmx11RSkWNDpfat o3DyzQkJpUT/3FCiwjvEO66l1/gmQJE= X-MC-Unique: zyrXXYWrPbaZfIE_kBoPPA-1 X-Mimecast-MFC-AGG-ID: zyrXXYWrPbaZfIE_kBoPPA_1748860259 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748860259; x=1749465059; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SG2TAULP+rgVRsnjFoNBnQJRSpAN/XOkTEHdBfNs7xs=; b=APECxjPhHaZPeTLqs4XMsOjiAwrNzMRlBF/cYQeILv/c3CbofBzvDu6X8NnPp8iKi+ 3TtXhyZdltR3YPJ9ycy9Ucg+vu6IpTaL2GPDZrrvGgY8xSMdpaEslYFJA6SthCYzuHKG 6VI4WRvHP3KW/UUpPzsZLQdFBjCUrqKvWwBzvfBwvCd9eR+FGF/hWG5BvNH4z23PhlQK l8s/RUqopUf4hd5oqS6WiqfLP7xBqsUqomjS2YTppeeMpcImQzNY7Pxjl1km3JH0VpaX bxU3MulYDNUrBYja/hIlsJZ/4z9P7jyE7Yk0/DIi0Z5WC7Wl0BF8uct30KHRf52jFcxK 4F8A== X-Gm-Message-State: AOJu0YwWr9azG/8w+EcygAz0E1MBrCZi0lDJKaXxM3BA+oA3iG1OrsmO ZHruZmsVZsm1LFCsz6B2+4ZfGfvDo0bTRu1soxodb7jBYm/K9l1XFaHJQqmvuNfELq6y8tHxkxU 10jqJSuA4GUDfHkgFRF5HzJORdTwRSMuoWV4rHdUIIxrBEiZm0WMEEQtrMPiGNiQQ3NM2au6ywf y4aKtWRv8SzJj33LytBmD/GjukqAkuNXEYvTn3dy4BjtQ= X-Gm-Gg: ASbGncu7HF9Qzs9DI/j5cM6kM770gF2VmJxt308WZ/2Ds4NVSBKv1lHWGTSc3R1s24C 6/X0ugEQT3Zl2G4IPAQvJpGfkGT5WFSrgQZLGqkzAuNEiquU5uRJ9sKI6aBl4Z2xEOYyhP8X//K dTb45VND6PIuursibMgJ8CuKgHlRUGZg3fYvJ9RdCvHa9IEuGGfa5QyE5ujGwij49XwLFsLBtkL ZTpVv6zPy7YWypXKwaZ06J6PxaXvuCcfHI4bJIA32CcLiCWBPkrhENv7STXRvyXtWJ5qg3DbS4k vhx0F7tdbYmpM8MJ++Bs X-Received: by 2002:a05:600c:810c:b0:442:cd12:c68a with SMTP id 5b1f17b1804b1-450d6b356bfmr112929955e9.1.1748860259008; Mon, 02 Jun 2025 03:30:59 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHvi/CBJcs8DFt0HvHvTbS5u1PtVmRxtZNbiq+qwVuYj41wyD2kjQCe5pOHhdz9B8er0WnGxw== X-Received: by 2002:a05:600c:810c:b0:442:cd12:c68a with SMTP id 5b1f17b1804b1-450d6b356bfmr112929625e9.1.1748860258465; Mon, 02 Jun 2025 03:30:58 -0700 (PDT) To: devel@lists.libvirt.org Subject: [PATCH 02/11] util: Add support for parsing nvmeXnY(pZ) strings Date: Mon, 2 Jun 2025 12:30:45 +0200 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: jfO4tF4ut5vE4UOq3SF-5i1z_8dK1s7MHbgCycZ8Nhk_1748860259 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 3GX32HHHHH7MXU73OLIIDMEBHY7WIXEM X-Message-ID-Hash: 3GX32HHHHH7MXU73OLIIDMEBHY7WIXEM X-MailFrom: mkletzan@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Martin Kletzander via Devel Reply-To: Martin Kletzander X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1748860320784116600 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Martin Kletzander We do not guarantee that the disk names will be the same in guest as they are in the XML, but that should not stop us from trying to be consistent with the naming. And since we use the same naming as the linux kernel does, let's stick with it with nvme drives too. Signed-off-by: Martin Kletzander --- src/libxl/libxl_driver.c | 2 +- src/qemu/qemu_validate.c | 2 +- src/util/virutil.c | 94 +++++++++++++++++++++++++++++++++++++--- src/util/virutil.h | 7 ++- src/vbox/vbox_common.c | 2 +- src/vmx/vmx.c | 2 +- src/vz/vz_sdk.c | 6 +-- tests/utiltest.c | 38 +++++++++++----- 8 files changed, 126 insertions(+), 27 deletions(-) diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 0fb256e5c06d..308c0372aaf4 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -5440,7 +5440,7 @@ libxlDiskPathToID(const char *virtpath) /* Find any disk prefixes we know about */ for (i =3D 0; i < G_N_ELEMENTS(drive_prefix); i++) { if (STRPREFIX(virtpath, drive_prefix[i]) && - !virDiskNameParse(virtpath, &disk, &partition)) { + !virDiskNameParse(virtpath, NULL, &disk, &partition)) { fmt =3D i; break; } diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 23a4d70b3441..8acc44747456 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -3445,7 +3445,7 @@ qemuValidateDomainDeviceDefDisk(const virDomainDiskDe= f *disk, return -1; } =20 - if (virDiskNameParse(disk->dst, &idx, &partition) < 0) { + if (virDiskNameParse(disk->dst, NULL, &idx, &partition) < 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("invalid disk target '%1$s'"), disk->dst); return -1; diff --git a/src/util/virutil.c b/src/util/virutil.c index 2abcb282fe52..fb64237692bb 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -314,15 +314,82 @@ virFormatIntPretty(unsigned long long val, } =20 =20 +static int +virDiskNameParseNvme(const char *name, int *controller, int *disk, int *pa= rtition) +{ + int ctrl =3D 0; + int ns =3D 0; + int part =3D 0; + char *end_ptr =3D NULL; + const char *tmp =3D STRSKIP(name, "nvme"); + + if (!controller) + return -1; + + if (!tmp) + return -1; + + if (virStrToLong_i(tmp, &end_ptr, 10, &ctrl) < 0) + return -1; + + if (*end_ptr !=3D 'n') + return -1; + + if (ctrl < 0) + return -1; + + tmp =3D end_ptr + 1; + + if (virStrToLong_i(tmp, &end_ptr, 10, &ns) < 0) + return -1; + + if (*end_ptr !=3D '\0' && *end_ptr !=3D 'p') + return -1; + + /* NSIDs start from 1, but we need to map them to [0..] for the contro= ller + * address. */ + if (ns < 1) + return -1; + ns--; + + if (partition) { + *partition =3D 0; + + if (*end_ptr !=3D '\0') { + tmp =3D end_ptr + 1; + + if (virStrToLong_i(tmp, NULL, 10, &part) < 0) + return -1; + + /* Partitions on NVMe disks also from 1 */ + if (part < 1) + return -1; + + *partition =3D part - 1; + } + } + + *controller =3D ctrl; + *disk =3D ns; + + return 0; +} + + /* Translates a device name of the form (regex) /^[fhv]d[a-z]+[0-9]*$/ - * into the corresponding index and partition number - * (e.g. sda0 =3D> (0,0), hdz2 =3D> (25,2), vdaa12 =3D> (26,12)) + * or nvme[0-9]+n[0-9]+(p[0-9]+) for NVMe devices + * into the corresponding nvme controller (see below), index and partition= number + * (e.g. sda0 =3D> (0,0,0), hdz2 =3D> (0,25,2), vdaa12 =3D> (0,26,12)) as = these do not + * support namespaces and controller is calculated from the disk index + * for nvme disks disks: (nvme1n2p3 =3D> (1, 1, 2) as nvme namespaces and + * partitions are numbered from 1 and not 0). * @param name The name of the device + * @param nvme_ctrl The disk namespace to be returned * @param disk The disk index to be returned * @param partition The partition index to be returned * @return 0 on success, or -1 on failure */ -int virDiskNameParse(const char *name, int *disk, int *partition) +int virDiskNameParse(const char *name, int *nvme_ctrl, int *disk, int *par= tition) { const char *ptr =3D NULL; char *rem; @@ -331,6 +398,12 @@ int virDiskNameParse(const char *name, int *disk, int = *partition) size_t i; size_t n_digits; =20 + if (STRPREFIX(name, "nvme")) + return virDiskNameParseNvme(name, nvme_ctrl, disk, partition); + + if (nvme_ctrl) + *nvme_ctrl =3D 0; + for (i =3D 0; i < G_N_ELEMENTS(drive_prefix); i++) { if (STRPREFIX(name, drive_prefix[i])) { ptr =3D name + strlen(drive_prefix[i]); @@ -381,6 +454,8 @@ int virDiskNameParse(const char *name, int *disk, int *= partition) /* Translates a device name of the form (regex) /^[fhv]d[a-z]+[0-9]*$/ * into the corresponding index (e.g. sda =3D> 0, hdz =3D> 25, vdaa =3D> 2= 6) * Note that any trailing string of digits is simply ignored. + * Since NVMe disks require controller devices, this function should not b= e used + * for nvme* names unless the caller does not need to know then controller= index * @param name The name of the device * @return name's index, or -1 on failure */ @@ -388,17 +463,24 @@ int virDiskNameToIndex(const char *name) { int idx; =20 - if (virDiskNameParse(name, &idx, NULL) < 0) + if (virDiskNameParse(name, NULL, &idx, NULL) < 0) idx =3D -1; =20 return idx; } =20 -char *virIndexToDiskName(unsigned int idx, const char *prefix) +char *virIndexToDiskName(unsigned int nvme_ctrl, + unsigned int idx, + const char *prefix) { - GString *str =3D g_string_new(NULL); + GString *str =3D NULL; long long ctr; =20 + if (STREQ_NULLABLE(prefix, "nvme")) + return g_strdup_printf("nvme%dn%d", nvme_ctrl, idx + 1); + + str =3D g_string_new(NULL); + for (ctr =3D idx; ctr >=3D 0; ctr =3D ctr / 26 - 1) g_string_prepend_c(str, 'a' + (ctr % 26)); =20 diff --git a/src/util/virutil.h b/src/util/virutil.h index 6c07aa42c8b5..ca6fd95363b5 100644 --- a/src/util/virutil.h +++ b/src/util/virutil.h @@ -51,9 +51,12 @@ unsigned long long virFormatIntPretty(unsigned long long val, const char **unit); =20 -int virDiskNameParse(const char *name, int *disk, int *partition); +int virDiskNameParse(const char *name, int *nvme_ctrl, + int *disk, int *partition); int virDiskNameToIndex(const char* str); -char *virIndexToDiskName(unsigned int idx, const char *prefix); +char *virIndexToDiskName(unsigned int nvme_ctrl, + unsigned int idx, + const char *prefix); =20 /* No-op workarounds for functionality missing in mingw. */ #ifndef WITH_GETUID diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 6ffe7cc20bde..95c70671a752 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -447,7 +447,7 @@ vboxGenerateMediumName(PRUint32 storageBus, return NULL; } =20 - name =3D virIndexToDiskName(total, prefix); + name =3D virIndexToDiskName(0, total, prefix); =20 return name; } diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 0dd03c1a88e7..4a9ad11b42c4 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -2257,7 +2257,7 @@ virVMXGenerateDiskTarget(virDomainDiskDef *def, return -1; } =20 - def->dst =3D virIndexToDiskName(idx, prefix); + def->dst =3D virIndexToDiskName(0, idx, prefix); return 0; } =20 diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index c2226c409dee..684b76ffa057 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -596,16 +596,16 @@ prlsdkGetDiskId(PRL_HANDLE disk, virDomainDiskBus *bu= s, char **dst) switch (ifType) { case PMS_IDE_DEVICE: *bus =3D VIR_DOMAIN_DISK_BUS_IDE; - *dst =3D virIndexToDiskName(pos, "hd"); + *dst =3D virIndexToDiskName(0, pos, "hd"); break; case PMS_SCSI_DEVICE: case PMS_UNKNOWN_DEVICE: *bus =3D VIR_DOMAIN_DISK_BUS_SCSI; - *dst =3D virIndexToDiskName(pos, "sd"); + *dst =3D virIndexToDiskName(0, pos, "sd"); break; case PMS_SATA_DEVICE: *bus =3D VIR_DOMAIN_DISK_BUS_SATA; - *dst =3D virIndexToDiskName(pos, "sd"); + *dst =3D virIndexToDiskName(0, pos, "sd"); break; default: virReportError(VIR_ERR_INTERNAL_ERROR, diff --git a/tests/utiltest.c b/tests/utiltest.c index b30bfbed70fb..0bef502a84c8 100644 --- a/tests/utiltest.c +++ b/tests/utiltest.c @@ -22,19 +22,25 @@ static const char* diskNames[] =3D { struct testDiskName { const char *name; + int ctrl; int idx; int partition; }; =20 static struct testDiskName diskNamesPart[] =3D { - {"sda0", 0, 0}, - {"sdb10", 1, 10}, - {"sdc2147483647", 2, 2147483647}, + {"sda", 0, 0, 0}, + {"sda0", 0, 0, 0}, + {"sdb10", 0, 1, 10}, + {"sdc2147483647", 0, 2, 2147483647}, + {"nvme0n1", 0, 0, 0}, + {"nvme0n1p1", 0, 0, 0}, + {"nvme1n2p3", 1, 1, 2}, }; =20 static const char* diskNamesInvalid[] =3D { "sda00", "sda01", "sdb-1", - "vd2" + "vd2", + "nvme0n0", "nvme0n1p0", }; =20 static int @@ -45,7 +51,7 @@ testIndexToDiskName(const void *data G_GNUC_UNUSED) for (i =3D 0; i < G_N_ELEMENTS(diskNames); ++i) { g_autofree char *diskName =3D NULL; =20 - diskName =3D virIndexToDiskName(i, "sd"); + diskName =3D virIndexToDiskName(0, i, "sd"); =20 if (virTestCompareToString(diskNames[i], diskName) < 0) { return -1; @@ -66,7 +72,7 @@ testDiskNameToIndex(const void *data G_GNUC_UNUSED) for (i =3D 0; i < 100000; ++i) { g_autofree char *diskName =3D NULL; =20 - diskName =3D virIndexToDiskName(i, "sd"); + diskName =3D virIndexToDiskName(0, i, "sd"); idx =3D virDiskNameToIndex(diskName); =20 if (idx < 0 || idx !=3D i) { @@ -85,30 +91,38 @@ static int testDiskNameParse(const void *data G_GNUC_UNUSED) { size_t i; + int nvme_ctrl; int idx; int partition; struct testDiskName *disk =3D NULL; =20 for (i =3D 0; i < G_N_ELEMENTS(diskNamesPart); ++i) { disk =3D &diskNamesPart[i]; - if (virDiskNameParse(disk->name, &idx, &partition)) + partition =3D 0; + if (virDiskNameParse(disk->name, &nvme_ctrl, &idx, &partition)) return -1; =20 + if (disk->ctrl !=3D nvme_ctrl) { + VIR_TEST_DEBUG("\nExpect NVMe controller [%d]", disk->ctrl); + VIR_TEST_DEBUG("Actual NVMe controller [%d]", nvme_ctrl); + return -1; + } + if (disk->idx !=3D idx) { - VIR_TEST_DEBUG("\nExpect [%d]", disk->idx); - VIR_TEST_DEBUG("Actual [%d]", idx); + VIR_TEST_DEBUG("\nExpect index [%d]", disk->idx); + VIR_TEST_DEBUG("Actual index [%d]", idx); return -1; } =20 if (disk->partition !=3D partition) { - VIR_TEST_DEBUG("\nExpect [%d]", disk->partition); - VIR_TEST_DEBUG("Actual [%d]", partition); + VIR_TEST_DEBUG("\nExpect partition [%d]", disk->partition); + VIR_TEST_DEBUG("Actual partition [%d]", partition); return -1; } } =20 for (i =3D 0; i < G_N_ELEMENTS(diskNamesInvalid); ++i) { - if (!virDiskNameParse(diskNamesInvalid[i], &idx, &partition)) { + if (!virDiskNameParse(diskNamesInvalid[i], &nvme_ctrl, &idx, &part= ition)) { VIR_TEST_DEBUG("Should Fail [%s]", diskNamesInvalid[i]); return -1; } --=20 2.49.0