From nobody Tue Mar 3 03:04:40 2026 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=pass; 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=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1771814797; cv=none; d=zohomail.com; s=zohoarc; b=jqArhFst8aHvIC0LQ1ppOFTh3fcLWdSPnH8WF1M/ppBLaIWX/fomgqtc9OioecpwGUSuee43iLgX8H6/8VR8WFXK4WiCzUMsjWi4hekrtbsaOCgc8J3yNXM+e/P0RyqIxc81zLBCO1kH1G64ZvlNvdegplnCsiIQcMH5054i5uQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1771814797; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=v5WVg4hoHAZu+0BTmYQlsPNP5CacPhzXSgTfF/D/4Ow=; b=E7I6yPfwhJ3myzpYg4Rrwe8PTY7Dz/7ty8nzMsyRu64+FN1YqEy6AGv1WTYzahDaSSv4bdATyJ/D0s7qWGUPMtW7wKCVAKSfUbisSqfqqSKnevQk69UCUolGHdiiKkddqEXkNcK+hdA7/sft1EH1b3UpgwnAMGyx1jTjktCdc+Q= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=none dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1771814797206294.01283437873735; Sun, 22 Feb 2026 18:46:37 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 993) id C7234418EC; Sun, 22 Feb 2026 21:46:35 -0500 (EST) Received: from [172.19.199.9] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id 90837419B7; Sun, 22 Feb 2026 21:45:54 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 993) id 2E2554187D; Sun, 22 Feb 2026 21:45:50 -0500 (EST) Received: from mail-ua1-f53.google.com (mail-ua1-f53.google.com [209.85.222.53]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id AD5C13F35B for ; Sun, 22 Feb 2026 21:45:49 -0500 (EST) Received: by mail-ua1-f53.google.com with SMTP id a1e0cc1a2514c-948c2035a27so984574241.1 for ; Sun, 22 Feb 2026 18:45:49 -0800 (PST) Received: from localhost.localdomain ([2804:29b8:5090:5879:e968:d1bb:87d4:1175]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-94da8d0662esm5725390241.12.2026.02.22.18.45.45 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sun, 22 Feb 2026 18:45:47 -0800 (PST) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,HELO_MISC_IP,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771814749; x=1772419549; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=v5WVg4hoHAZu+0BTmYQlsPNP5CacPhzXSgTfF/D/4Ow=; b=WRDSmYUt6dSpi63JEDRu9tnBaxEdVSdYeywgpZG9ZJNuR3XDOujNEZE+4aeOi0tcqV ur+Ddv1Wb7vBRx0gDdZ6QttKq+OwU3hQI2xqNBCt45wPevD5j9BX/l4E3lQhkkxhaOkh n8JlMmPX/VTYT9366MT2+vYG6QVJV26VonrIKzVFDuxE56irPJ5RMmqV6i/Uw8+Bw0pN 9fLAapcYb3kOIfLqNokDXVedozh5dFJmJX9qtsa0Kqc+P68t+NBAtGSQ/xZsvTuDaAaS kw0Rr9lKDQVweiz+nI85LqoZb8uBoovoT6COK3mfMtVLis/1L9p9LlM+j8twb98fYN0k e1yg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771814749; x=1772419549; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=v5WVg4hoHAZu+0BTmYQlsPNP5CacPhzXSgTfF/D/4Ow=; b=TwG9mU9n4D2ZnqYsDPe2criK07KpkLWXNCdSMos7nFZum/KG5SzJWA548m+tgpFuf8 TECobYuES27mP186aYJC9x0sZU1O8ahgVcyoOfYizkDMEhu0qW2X/qONCVFSQ6VjoKQZ 8PpCt4IknFedvKYVoJwrZGunViKXWPDcYod2d3Qx+U/uFA7jz+cFvErV4Ua204PijB3N CeDEFTHOCSb9nc3He90O9rHmXQE7wHDXM6njvN/atZ2QJRuAeCQJvndwDqwwmRHMKY+m E/kSIJAxYbe8tOEKMG/5u+/eSCEkCXTI2NH75ItU5PX2Miw0Q5P/j1tk8Q+ISqq9PNIr 9ngA== X-Gm-Message-State: AOJu0YxxYjc7EqxUFDJ/0YgQ7e9DFCV5YSmbOIzTyxlIf5C9VfpqFTXW h7HUM5UwwZ/ofIJQCCCv9mu3npygtm6M1RLcbc58Ccwh/poj6IzsxKAAMoIWlQ== X-Gm-Gg: AZuq6aJj/t3eFMjOO1rwvmw3D2CpMO/Ar1FRBgpXHijhtEITWXe92uXjl/digc81lDO SSFrlnKULo6Q2xF57pkbsX8T2AR2Wv3VCqOEL7XMHLHM8as0asK1X+wb4tYMFksjPojG0eCKU8V FaJEbEtObBET24E/6sROLfKjA9fjP8QiUPfY+5yu6eMM8pXpydfBImscSnOj3msFJ98mQI4NDOr M8BQ+Sp7nwoIRInhXN6SNiBykw2cn2HekiOsjsdo+URSNLkpOq4JnWnEYAFMGza2lz3MiRzWcBS OMNbDjwMM+Q1kLFQngHNQ/Bth+pzZLAX65y/ukB5hRB7K3SCv0AJhi/uSpR2LgFUo1bS2bHHSgj jkyoonyUPu9wbxZcXiJ0EoABHMrXjSQ3H4F+XSZOXw3L5CuGrS3ASZurAPWjMxpnSbHDtyzf+zc /y5v7EO6z6NnpZ9lHsncg/qmHWk3HxHj9MRsRb0ovup02LP5ayF8iiOBQm2y8= X-Received: by 2002:a05:6102:3ed0:b0:5f5:25a4:c6a9 with SMTP id ada2fe7eead31-5feb3028cd1mr2312661137.20.1771814748524; Sun, 22 Feb 2026 18:45:48 -0800 (PST) From: Lucas Amaral To: devel@lists.libvirt.org Subject: [PATCH] storage: mpath: use device-mapper UUID for volume key Date: Sun, 22 Feb 2026 23:45:41 -0300 Message-ID: <20260223024541.37847-1-lucaaamaral@gmail.com> X-Mailer: git-send-email 2.52.0 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: KN4436FCYL6RJB4G6QRWT2DX6DPUUJKU X-Message-ID-Hash: KN4436FCYL6RJB4G6QRWT2DX6DPUUJKU X-MailFrom: lucaaamaral@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Lucas Amaral X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1771814800463154100 Content-Type: text/plain; charset="utf-8" The multipath storage backend used the device path (e.g., /dev/mapper/mpathX) as the volume key. Device paths can change across reboots when devices are enumerated in a different order. Use dm_task_get_uuid() to retrieve the device-mapper UUID, which is derived from the underlying hardware identifier and remains stable. Fall back to the device path when a UUID is not available. Signed-off-by: Lucas Amaral --- Build-tested and passed full test suite on CentOS Stream 9 (226 OK, 0 failures). Verified dm_task_get_uuid() behavior using a standalone C program that mimics the patched vol->key logic, run against simulated device-mapper devices in a privileged container: $ dmsetup create testmpath0 \ -u "mpath-3600508b4000c4a5d0000300000490000" \ --table "0 1000 zero" $ dmsetup create testmpath1 --table "0 1000 zero" Results: Device: testmpath0 vol->key =3D mpath-3600508b4000c4a5d0000300000490000 (UUID) Device: testmpath1 (no UUID set) vol->key =3D /dev/mapper/testmpath1 (path fallback) Device: nonexistent vol->key =3D /dev/mapper/nonexistent (path fallback) All three cases (UUID present, UUID absent, device missing) behave correctly. Not tested with a running libvirtd and a real mpath pool. --- src/storage/storage_backend_mpath.c | 48 +++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/src/storage/storage_backend_mpath.c b/src/storage/storage_back= end_mpath.c index 9fc3983c52..a36400502f 100644 --- a/src/storage/storage_backend_mpath.c +++ b/src/storage/storage_backend_mpath.c @@ -40,13 +40,43 @@ =20 VIR_LOG_INIT("storage.storage_backend_mpath"); =20 +static int +virStorageBackendGetDeviceUUID(const char *dev_name, char **uuid) +{ + int ret =3D -1; + struct dm_task *dmt; + const char *dm_uuid; + + if (!(dmt =3D dm_task_create(DM_DEVICE_INFO))) + goto out; + + if (!dm_task_set_name(dmt, dev_name)) + goto out; + + if (!dm_task_run(dmt)) + goto out; + + if (!(dm_uuid =3D dm_task_get_uuid(dmt)) || !*dm_uuid) + goto out; + + *uuid =3D g_strdup(dm_uuid); + ret =3D 0; + + out: + if (dmt !=3D NULL) + dm_task_destroy(dmt); + return ret; +} + + static int virStorageBackendMpathNewVol(virStoragePoolObj *pool, const int devnum, - const char *dev) + const char *dev_name) { virStoragePoolDef *def =3D virStoragePoolObjGetDef(pool); g_autoptr(virStorageVolDef) vol =3D NULL; + g_autofree char *dev_uuid =3D NULL; =20 vol =3D g_new0(virStorageVolDef, 1); =20 @@ -54,15 +84,18 @@ virStorageBackendMpathNewVol(virStoragePoolObj *pool, =20 (vol->name) =3D g_strdup_printf("dm-%u", devnum); =20 - vol->target.path =3D g_strdup_printf("/dev/%s", dev); + vol->target.path =3D g_strdup_printf("/dev/mapper/%s", dev_name); =20 if (virStorageBackendUpdateVolInfo(vol, true, VIR_STORAGE_VOL_OPEN_DEFAULT, 0) < = 0) { return -1; } =20 - /* XXX should use logical unit's UUID instead */ - vol->key =3D g_strdup(vol->target.path); + virStorageBackendGetDeviceUUID(dev_name, &dev_uuid); + if (dev_uuid) + vol->key =3D g_steal_pointer(&dev_uuid); + else + vol->key =3D g_strdup(vol->target.path); =20 if (virStoragePoolObjAddVol(pool, vol) < 0) return -1; @@ -151,7 +184,6 @@ virStorageBackendCreateVols(virStoragePoolObj *pool, { uint32_t minor =3D -1; uint32_t next; - g_autofree char *map_device =3D NULL; =20 do { int is_mpath =3D virStorageBackendIsMultipath(names->name); @@ -161,8 +193,6 @@ virStorageBackendCreateVols(virStoragePoolObj *pool, =20 if (is_mpath =3D=3D 1) { =20 - map_device =3D g_strdup_printf("mapper/%s", names->name); - if (virStorageBackendGetMinorNumber(names->name, &minor) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to get %1$s minor number"), @@ -170,10 +200,8 @@ virStorageBackendCreateVols(virStoragePoolObj *pool, return -1; } =20 - if (virStorageBackendMpathNewVol(pool, minor, map_device) < 0) + if (virStorageBackendMpathNewVol(pool, minor, names->name) < 0) return -1; - - VIR_FREE(map_device); } =20 /* Given the way libdevmapper returns its data, I don't see --=20 2.52.0