From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id 6CF841FF0EC for ; Sat, 07 Nov 2026 23:09:19 +0100 (CET) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 7EED521435; Sat, 07 Nov 2026 23:09:15 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20260707; t=1794089343; x=1794694143; darn=lists.proxmox.com; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=vDc2BKz9z9upoXOMJwyiZk2xevMNY11JkyYP5G3QsSo=; b=PxWIGkNKFyzh2fNObV4rdlwAp4QKbJrjiNVqM+NHkf0/Xthlx6pBebp/rmNGK/izIW yXuQfbnjvN79q5Jbm4XhCMowlVEwgjNKauqISj7HkztHPSaoYEwFgEx6fInV83H7nvSy xcBFoNqbsqjXjcM/Id+aYfJ39bNDAu+WDC/E0UJyi82rQPXOdBsMO7AdXjlgTAWVzQQh AVbY55ADOHVK/AhTZP8IdICP/0Pe4ACNYvpUxDTE8CBAuWmF0uyEHZG+n7BXJvw2y6R7 Rehn61Zv+5sEvy7tuoI087Pxx0zbaWF99pUU3Ekc1bVSTGVdl+Wo0z3GSZwuZWczcpPh w2mQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1794089343; x=1794694143; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to:content-type; bh=vDc2BKz9z9upoXOMJwyiZk2xevMNY11JkyYP5G3QsSo=; b=jOrJkUWoHvx/A0L2XmDNDZxPUJM5ANgsi40a1R6jtX/jU6NVQ4CDUmQ/lM9CXOJ+lk CvRD17WzdOg660Zzj5pc//z7D5ni8q4iHImsww4wN5Lcajn7FjSPuGkYFi41sUorHiaj F+L1pzs4sOh+eRU5beulGeG6+/23jMqU8HXfUtmz1Of8P/Pj6ZgrYtSwDc9nkohjstK4 DGHFUp4atQzA+uqrA4PVz9oamTctd3v3GfijMhjNTkR3dsPIwv9BMaRv3qDWjCXw3ftE q/2N+20VtGjMWvXKG7moPdDOu86hGlUfbiTEZbwIuIRE4EaNle/n08JB4ZlH3Z+xdi8W eZ7w== X-Gm-Message-State: APuU4Z/zMPWhL+E7YlgYAAuXmTZsqB6gYMrdqYhcs1otZKmdtnVewc5f hwOGc1r+7gi7bDTxUAQv7vGGGASN7kKkKcf3vCAIYvLVibrj3iV6Sk8WMqY03akl X-Gm-Gg: AYBFou0SRb0ILATf2j+vDIh9Yk1PVolhaeSOIh06Rzviop4d6GJm4SGObpobXgfK+Ut SczmJxwnlZm1U8kz6GOYtuAfIaSKiutb91+CJhEzqnC+AJSxpesTO3RLWX5HgeCioph0QpHVZCT qbp0nSv0MLyG0ApC5FCdx/TgKGlU6+EQI/pJYDFw6G1gWDMAdheCmlNhqQOTCxAp44bBUgI8qLP 7huRSbT/rx89pxbC7UHkdEQIsI0jgUVspisQ9p9eIg39M1+xy0zarlo0rfwnAstqr8zTrIXlg1U cyCYXAi51bd5BwhvE1vuxY+k7lezLsohMa8tTQ9MzZQ0wORrp+s+TvtYoCuOGYFggfiCFoXf/rr wLvq8lEH1gmyGODNYmAQpsX5p250J9W+m180TE3OOk8PZUIHZL0sZ+wRGJ0mczRwACcUnFihaL+ n0jNxjt4Qugn0WqYBibVBI4pIWk+E4x5zVzq2WgSRJg9bpOrRCVNWM6fuUiYPB6a7z22oxk63eX k0qRiX3PMle4wLSwIJU4mGOBdHFz9RCUVKnUnSTivtVAec9hPXWc+uLBCAE8m7iQuc1HWeh+vWJ isRiPaU4AZN1LhyScmpgTXmjmtLQSytFJPof8gzJ6gmA34RCC3cSByT51oTi7UTF3aSQLYjXqII qJk7gM4YrB+bvdkXB0DDP7Xm7GwKqbKrfChSPHqNfLrc7ZgMdu1ZvVFA= X-Received: by 2002:a05:690e:13c6:b0:679:ad95:8ef9 with SMTP id 956f58d0204a3-67c3d7ccbf1mr103965d50.1.1794089342777; Sat, 07 Nov 2026 14:09:02 -0800 (PST) From: Lucas Barros To: pve-devel@lists.proxmox.com Subject: [PATCH storage] fix #8211: disks: detect SAS hard disks as hdd Date: Sat, 7 Nov 2026 19:08:58 -0300 Message-ID: <20261107220858.12119-1-lucasbarros.kam@gmail.com> X-Mailer: git-send-email 2.50.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's domain DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from domain DMARC_PASS -0.1 DMARC pass policy FREEMAIL_FROM 0.001 Sender email is commonly abused enduser mail provider POISEN_SPAM_PILL 0.1 Meta: its spam POISEN_SPAM_PILL_1 0.1 random spam to be learned in bayes POISEN_SPAM_PILL_3 0.1 random spam to be learned in bayes RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: 4QQA3AS2MIP2ZH4B5226SB26RXVCL5QM X-Message-ID-Hash: 4QQA3AS2MIP2ZH4B5226SB26RXVCL5QM X-MailFrom: lucasbarros.kam@gmail.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: SAS hard disks were listed with type 'unknown' and rpm -1. For a rotational device the type 'hdd' is only set if a rotation rate is known, and that rate is only read from the ID_ATA_ROTATION_RATE_RPM udev property, which only exists for ATA devices. SCSI devices report their nominal rotation rate in the block device characteristics VPD page (0xb1), which the kernel exposes as device/vpd_pgb1 in sysfs. Use that as a fallback if udev does not provide a rotation rate, so SAS hard disks are listed as 'hdd' with their actual rpm. Devices without that page, or which do not report a rotation rate there, keep the current behavior. Add a test case for a SAS hard disk with such a VPD page. Signed-off-by: Lucas Barros --- Tested with the disk list tests in src/test (disklist_test.pm), including the new sas_hdd case, which fails without this change. Not tested on real SAS hardware, the VPD page layout is taken from SBC (Block Device Characteristics VPD page, medium rotation rate in bytes 4-5); the kernel exposes it as device/vpd_pgb1 since 5.19. The fixture contains a small binary file (the raw VPD page). This patch was prepared with the help of an LLM based coding assistant; I reviewed the change and ran the tests mentioned above myself. src/PVE/Diskmanage.pm | 13 ++++++++ src/test/disk_tests/sas_hdd/disklist | 1 + .../disk_tests/sas_hdd/disklist_expected.json | 18 ++++++++++ src/test/disk_tests/sas_hdd/sda/device/model | 1 + src/test/disk_tests/sas_hdd/sda/device/vendor | 1 + .../disk_tests/sas_hdd/sda/device/vpd_pgb1 | Bin 0 -> 64 bytes .../disk_tests/sas_hdd/sda/queue/rotational | 1 + src/test/disk_tests/sas_hdd/sda/size | 1 + src/test/disk_tests/sas_hdd/sda_udevadm | 31 ++++++++++++++++++ 9 files changed, 67 insertions(+) create mode 100644 src/test/disk_tests/sas_hdd/disklist create mode 100644 src/test/disk_tests/sas_hdd/disklist_expected.json create mode 100644 src/test/disk_tests/sas_hdd/sda/device/model create mode 100644 src/test/disk_tests/sas_hdd/sda/device/vendor create mode 100644 src/test/disk_tests/sas_hdd/sda/device/vpd_pgb1 create mode 100644 src/test/disk_tests/sas_hdd/sda/queue/rotational create mode 100644 src/test/disk_tests/sas_hdd/sda/size create mode 100644 src/test/disk_tests/sas_hdd/sda_udevadm diff --git a/src/PVE/Diskmanage.pm b/src/PVE/Diskmanage.pm index d5bd147..13a9702 100644 --- a/src/PVE/Diskmanage.pm +++ b/src/PVE/Diskmanage.pm @@ -416,6 +416,18 @@ sub get_sysdir_info { $data->{$attr} = trim(file_read_firstline("$sysdir/device/$attr")) || 'unknown'; } + # SCSI devices do not have the ATA rotation rate in udev, but report it in + # bytes 4-5 of the block device characteristics VPD page (0xb1), where + # values from 0x0401 to 0xfffe are the nominal rotation rate in rpm + my $vpd_pgb1 = "$sysdir/device/vpd_pgb1"; + if (-f $vpd_pgb1) { + my $raw = eval { file_get_contents($vpd_pgb1, 4096) } // ''; + if (length($raw) >= 6) { + my $rate = unpack('n', substr($raw, 4, 2)); + $data->{rpm} = $rate if $rate >= 0x0401 && $rate <= 0xfffe; + } + } + return $data; } @@ -587,6 +599,7 @@ sub get_disks { $type = 'nvme' if $dev =~ m/^nvme\d+n\d+$/; $data->{rpm} = 0; } elsif ($sysdata->{rotational} == 1) { + $data->{rpm} = $sysdata->{rpm} if $data->{rpm} == -1 && defined($sysdata->{rpm}); if ($data->{rpm} != -1) { $type = 'hdd'; } elsif ($data->{usb}) { diff --git a/src/test/disk_tests/sas_hdd/disklist b/src/test/disk_tests/sas_hdd/disklist new file mode 100644 index 0000000..9191c61 --- /dev/null +++ b/src/test/disk_tests/sas_hdd/disklist @@ -0,0 +1 @@ +sda diff --git a/src/test/disk_tests/sas_hdd/disklist_expected.json b/src/test/disk_tests/sas_hdd/disklist_expected.json new file mode 100644 index 0000000..6492219 --- /dev/null +++ b/src/test/disk_tests/sas_hdd/disklist_expected.json @@ -0,0 +1,18 @@ +{ + "sda" : { + "gpt" : 1, + "devpath" : "/dev/sda", + "type" : "hdd", + "model" : "MODEL1", + "health" : "UNKNOWN", + "osdid" : -1, + "osdid-list" : null, + "wwn" : "0x0000000000000000", + "vendor" : "VENDOR1", + "rpm" : 10000, + "size" : 5120000, + "serial" : "SER2", + "wearout" : "N/A", + "by_id_link" : "/dev/disk/by-id/scsi-00000000000000000" + } +} diff --git a/src/test/disk_tests/sas_hdd/sda/device/model b/src/test/disk_tests/sas_hdd/sda/device/model new file mode 100644 index 0000000..6b69674 --- /dev/null +++ b/src/test/disk_tests/sas_hdd/sda/device/model @@ -0,0 +1 @@ +MODEL1 diff --git a/src/test/disk_tests/sas_hdd/sda/device/vendor b/src/test/disk_tests/sas_hdd/sda/device/vendor new file mode 100644 index 0000000..a7894eb --- /dev/null +++ b/src/test/disk_tests/sas_hdd/sda/device/vendor @@ -0,0 +1 @@ +VENDOR1 diff --git a/src/test/disk_tests/sas_hdd/sda/device/vpd_pgb1 b/src/test/disk_tests/sas_hdd/sda/device/vpd_pgb1 new file mode 100644 index 0000000000000000000000000000000000000000..3dbd0c4aa8fc30d5e1c671feca4e93b4b368a342 GIT binary patch literal 64 QcmZSB$Y7%`z(6(t07mZtB>(^b literal 0 HcmV?d00001 diff --git a/src/test/disk_tests/sas_hdd/sda/queue/rotational b/src/test/disk_tests/sas_hdd/sda/queue/rotational new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/src/test/disk_tests/sas_hdd/sda/queue/rotational @@ -0,0 +1 @@ +1 diff --git a/src/test/disk_tests/sas_hdd/sda/size b/src/test/disk_tests/sas_hdd/sda/size new file mode 100644 index 0000000..5caff40 --- /dev/null +++ b/src/test/disk_tests/sas_hdd/sda/size @@ -0,0 +1 @@ +10000 diff --git a/src/test/disk_tests/sas_hdd/sda_udevadm b/src/test/disk_tests/sas_hdd/sda_udevadm new file mode 100644 index 0000000..ac0744d --- /dev/null +++ b/src/test/disk_tests/sas_hdd/sda_udevadm @@ -0,0 +1,31 @@ +P: /devices/pci0000:00/0000:00:03.0/0000:02:00.0/host4/port-4:0/end_device-4:0/target4:0:0/4:0:0:0/block/sda +N: sda +S: disk/by-id/scsi-00000000000000000 +S: disk/by-id/wwn-0x0000000000000000 +S: disk/by-path/pci-0000:02:00.0-sas-0x0000000000000000-lun-0 +E: DEVLINKS=/dev/disk/by-id/scsi-00000000000000000 /dev/disk/by-id/wwn-0x0000000000000000 /dev/disk/by-path/pci-0000:02:00.0-sas-0x0000000000000000-lun-0 +E: DEVNAME=/dev/sda +E: DEVPATH=/devices/pci0000:00/0000:00:03.0/0000:02:00.0/host4/port-4:0/end_device-4:0/target4:0:0/4:0:0:0/block/sda +E: DEVTYPE=disk +E: ID_BUS=scsi +E: ID_MODEL=MODEL1 +E: ID_MODEL_ENC=MODEL1\x20\x20\x20\x20\x20\x20 +E: ID_PART_TABLE_TYPE=gpt +E: ID_PART_TABLE_UUID=605740f0-44a1-4dc5-9fea-bde166df963e +E: ID_PATH=pci-0000:02:00.0-sas-0x0000000000000000-lun-0 +E: ID_PATH_TAG=pci-0000_02_00_0-sas-0x0000000000000000-lun-0 +E: ID_REVISION=ES64 +E: ID_SCSI=1 +E: ID_SCSI_SERIAL=SERIAL +E: ID_SERIAL=SERIAL2 +E: ID_SERIAL_SHORT=SER2 +E: ID_TYPE=disk +E: ID_VENDOR=VENDOR1 +E: ID_VENDOR_ENC=VENDOR1\x20 +E: ID_WWN=0x0000000000000000 +E: ID_WWN_WITH_EXTENSION=0x0000000000000000 +E: MAJOR=8 +E: MINOR=0 +E: SUBSYSTEM=block +E: TAGS=:systemd: +E: USEC_INITIALIZED=667541 -- 2.50.1 (Apple Git-155)