From nobody Sun Feb 8 17:13:21 2026 Delivered-To: importer@patchew.org Received-SPF: none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=none (zohomail.com: 8.43.85.245 is neither permitted nor denied by domain of lists.libvirt.org) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1711555543193992.8628086219668; Wed, 27 Mar 2024 09:05:43 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 996) id AE9F81F73; Wed, 27 Mar 2024 12:05:41 -0400 (EDT) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 553641DF6; Wed, 27 Mar 2024 12:04:32 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 996) id C4C4F1D9C; Wed, 27 Mar 2024 12:04:28 -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 12A691D9C for ; Wed, 27 Mar 2024 12:04:28 -0400 (EDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-517-h4UEer6XOcSxgmm55MAzOg-1; Wed, 27 Mar 2024 12:04:26 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C0266185A789 for ; Wed, 27 Mar 2024 16:04:25 +0000 (UTC) Received: from speedmetal.lan (unknown [10.45.242.6]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2A7773C20 for ; Wed, 27 Mar 2024 16:04:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 X-MC-Unique: h4UEer6XOcSxgmm55MAzOg-1 From: Peter Krempa To: devel@lists.libvirt.org Subject: [PATCH 1/3] virpcivpd: Revert error reporting from PCI VPD parser Date: Wed, 27 Mar 2024 17:04:03 +0100 Message-ID: <7ebe604fd5423911e2b1eeb111ac27b46ace7326.1711554455.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Message-ID-Hash: UTBDXGQC4R4RD5R4EJ6E77OQL6EA7KT5 X-Message-ID-Hash: UTBDXGQC4R4RD5R4EJ6E77OQL6EA7KT5 X-MailFrom: pkrempa@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: Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZM-MESSAGEID: 1711555544507100001 The VPD parsing is fragile and depends on hardware vendor's adherance to standards. Since libvirt only ever uses this data to report it in the nodedev XML which ignores any errors there's no much point in having error reporting which I've added recently. Turn the errors into VIR_DEBUG statements in preparation for upcoming patch which completely removes the expectation to report errors. This effectively reverts commits dfc85658bd0 and f85a382a0e7. Signed-off-by: Peter Krempa --- po/POTFILES | 1 - src/util/virpci.c | 8 ++++++- src/util/virpcivpd.c | 50 ++++++++++++++++++-------------------------- 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/po/POTFILES b/po/POTFILES index 428919815d..6fbff4bef2 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -313,7 +313,6 @@ src/util/virnuma.c src/util/virnvme.c src/util/virobject.c src/util/virpci.c -src/util/virpcivpd.c src/util/virperf.c src/util/virpidfile.c src/util/virpolkit.c diff --git a/src/util/virpci.c b/src/util/virpci.c index 780b4f9eec..8becec4aa5 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -3104,6 +3104,7 @@ virPCIVPDResource * virPCIDeviceGetVPD(virPCIDevice *dev) { g_autofree char *vpdPath =3D virPCIFile(dev->name, "vpd"); + virPCIVPDResource *ret =3D NULL; VIR_AUTOCLOSE fd =3D -1; if (!virPCIDeviceHasVPD(dev)) { @@ -3117,7 +3118,12 @@ virPCIDeviceGetVPD(virPCIDevice *dev) return NULL; } - return virPCIVPDParse(fd); + if (!(ret =3D virPCIVPDParse(fd))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Failed to parse de= vice VPD data")); + return NULL; + } + + return ret; } #else diff --git a/src/util/virpcivpd.c b/src/util/virpcivpd.c index 16df468875..02d405f038 100644 --- a/src/util/virpcivpd.c +++ b/src/util/virpcivpd.c @@ -361,9 +361,9 @@ virPCIVPDResourceUpdateKeyword(virPCIVPDResource *res, * @offset: The offset at which bytes need to be read. * @csum: A pointer to a byte containing the current checksum value. Mutat= ed by this function. * - * Returns 0 if exactly @count bytes were read from @vpdFileFd. The csum v= alue is - * also modified as bytes are read. If an error occurs while reading data = from the VPD file - * descriptor, it is reported and -1 is returned to the caller. + * Returns 0 if exactly @count bytes were read from @vpdFileFd. The csum v= alue + * is also modified as bytes are read. If an error occurs while reading da= ta + * from the VPD file descriptor -1 is returned to the caller. */ static int virPCIVPDReadVPDBytes(int vpdFileFd, @@ -375,8 +375,7 @@ virPCIVPDReadVPDBytes(int vpdFileFd, ssize_t numRead =3D pread(vpdFileFd, buf, count, offset); if (numRead !=3D count) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("failed to read the PCI VPD data")); + VIR_DEBUG("read=3D'%zd' expected=3D'%zu'", numRead, count); return -1; } @@ -447,8 +446,7 @@ virPCIVPDParseVPDLargeResourceFields(int vpdFileFd, case VIR_PCI_VPD_RESOURCE_FIELD_VALUE_FORMAT_RDWR: if (readOnly) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("failed to read the PCI VPD data: une= xpected RW keyword in read-only section")); + VIR_DEBUG("unexpected RW keyword in read-only section"= ); return -1; } @@ -457,8 +455,7 @@ virPCIVPDParseVPDLargeResourceFields(int vpdFileFd, case VIR_PCI_VPD_RESOURCE_FIELD_VALUE_FORMAT_RESVD: if (!readOnly) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("failed to read the PCI VPD data: une= xpected RV keyword in read-write section")); + VIR_DEBUG("unexpected RV keyword in read-write section= "); return -1; } /* Only need one byte to be read and accounted towards @@ -477,8 +474,7 @@ virPCIVPDParseVPDLargeResourceFields(int vpdFileFd, if (resPos + resDataLen < fieldPos + fieldDataLen) { /* In this case the field cannot simply be skipped since the p= osition of the * next field is determined based on the length of a previous = field. */ - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("failed to read the PCI VPD data: data field = length invalid")); + VIR_DEBUG("data field length invalid"); return -1; } @@ -517,8 +513,7 @@ virPCIVPDParseVPDLargeResourceFields(int vpdFileFd, case VIR_PCI_VPD_RESOURCE_FIELD_VALUE_FORMAT_RESVD: if (*csum) { /* All bytes up to and including the checksum byte sho= uld add up to 0. */ - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("failed to read the PCI VPD data: inv= alid checksum")); + VIR_DEBUG("invalid checksum"); return -1; } hasChecksum =3D true; @@ -546,14 +541,12 @@ virPCIVPDParseVPDLargeResourceFields(int vpdFileFd, * they were not the last fields in the section. */ if ((fieldPos < resPos + resDataLen)) { /* unparsed data still present */ - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("failed to read the PCI VPD data: parsing ended p= rematurely")); + VIR_DEBUG("parsing ended prematurely"); return -1; } if (readOnly && !hasChecksum) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("failed to read the PCI VPD data: missing mandato= ry checksum")); + VIR_DEBUG("missing mandatory checksum"); return -1; } @@ -568,7 +561,7 @@ virPCIVPDParseVPDLargeResourceFields(int vpdFileFd, * @resDataLen: A length of the data portion of a resource. * @csum: A pointer to a 1-byte checksum. * - * Returns: 0 on success -1 and an error on failure + * Returns: 0 on success -1 on failure. No libvirt errors are reported. */ static int virPCIVPDParseVPDLargeResourceString(int vpdFileFd, uint16_t resPos, @@ -584,8 +577,7 @@ virPCIVPDParseVPDLargeResourceString(int vpdFileFd, uin= t16_t resPos, resValue =3D g_strdup(g_strstrip(buf)); if (!virPCIVPDResourceIsValidTextValue(resValue)) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("failed to parse PCI VPD string value with invali= d characters")); + VIR_DEBUG("PCI VPD string contains invalid characters"); return -1; } res->name =3D g_steal_pointer(&resValue); @@ -599,7 +591,7 @@ virPCIVPDParseVPDLargeResourceString(int vpdFileFd, uin= t16_t resPos, * Parse a PCI device's Vital Product Data (VPD) contained in a file descr= iptor. * * Returns: a pointer to a GList of VPDResource types which needs to be fr= eed by the caller or - * NULL if getting it failed for some reason. + * NULL if getting it failed for some reason. No libvirt errors are report= ed. */ virPCIVPDResource * virPCIVPDParse(int vpdFileFd) @@ -629,7 +621,8 @@ virPCIVPDParse(int vpdFileFd) if (tag & PCI_VPD_LARGE_RESOURCE_FLAG) { if (resPos > PCI_VPD_ADDR_MASK + 1 - 3) { /* Bail if the large resource starts at the position where= the end tag should be. */ - goto malformed; + VIR_DEBUG("expected end tag, got more data"); + return NULL; } /* Read the two length bytes of the large resource record. */ @@ -652,8 +645,7 @@ virPCIVPDParse(int vpdFileFd) if (tag =3D=3D PCI_VPD_RESOURCE_END_TAG) { /* Stop VPD traversal since the end tag was encountered. */ if (!hasReadOnly) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("failed to read the PCI VPD data: missing= read-only section")); + VIR_DEBUG("missing read-only section"); return NULL; } @@ -662,7 +654,8 @@ virPCIVPDParse(int vpdFileFd) if (resDataLen > PCI_VPD_ADDR_MASK + 1 - resPos) { /* Bail if the resource is too long to fit into the VPD addres= s space. */ - goto malformed; + VIR_DEBUG("VPD resource too long"); + return NULL; } switch (tag) { @@ -698,9 +691,7 @@ virPCIVPDParse(int vpdFileFd) resPos +=3D resDataLen; } - malformed: - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("failed to read the PCI VPD data: malformed data")); + VIR_DEBUG("unexpected end of VPD data, expected end tag"); return NULL; } @@ -709,8 +700,7 @@ virPCIVPDParse(int vpdFileFd) virPCIVPDResource * virPCIVPDParse(int vpdFileFd G_GNUC_UNUSED) { - virReportError(VIR_ERR_NO_SUPPORT, "%s", - _("PCI VPD reporting not available on this platform")); + VIR_DEBUG("not implemented"); return NULL; } --=20 2.44.0 _______________________________________________ Devel mailing list -- devel@lists.libvirt.org To unsubscribe send an email to devel-leave@lists.libvirt.org