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 7B2951FF0ED for ; Fri, 31 Jul 2026 12:22:06 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id AD40D21509; Fri, 31 Jul 2026 12:22:02 +0200 (CEST) From: Dietmar Maurer To: pve-devel@lists.proxmox.com Subject: [RFC pve-storage 05/27] diskmanage: include iSCSI session devices in disk enumeration Date: Fri, 31 Jul 2026 12:21:34 +0200 Message-ID: <20260731102156.3947857-6-dietmar@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260731102156.3947857-1-dietmar@proxmox.com> References: <20260731102156.3947857-1-dietmar@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 2 AWL -0.664 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods 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 PROLO_LEO1 0.1 Meta Catches all Leo drug variations so far RDNS_NONE 1.274 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record Message-ID-Hash: 23KJMRYS4YRYG36S4RFG5WXVBYA6JP5F X-Message-ID-Hash: 23KJMRYS4YRYG36S4RFG5WXVBYA6JP5F X-MailFrom: dietmar@zilli.proxmox.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: iSCSI attached disks were excluded from disk enumeration since forever, which made them invisible to every API client, so tooling working with SAN LUNs, like the SAN LUN scan, could not see them at all. Enumerate them instead. The transport property reports 'iscsi', so the disk list keeps hiding them unless include-remote is set, while clients wanting the full picture can filter on their own. This also turns iSCSI LUNs into valid targets for volume group creation via the disks API, as used for shared LVM on iSCSI setups. Signed-off-by: Dietmar Maurer --- src/PVE/API2/Disks.pm | 4 ++-- src/PVE/Diskmanage.pm | 13 ------------ src/test/disk_tests/iscsi/disklist | 1 + .../disk_tests/iscsi/disklist_expected.json | 19 +++++++++++++++++ src/test/disk_tests/iscsi/lsblk | 5 +++++ src/test/disk_tests/iscsi/sda/device/model | 1 + src/test/disk_tests/iscsi/sda/device/vendor | 1 + .../disk_tests/iscsi/sda/queue/rotational | 1 + src/test/disk_tests/iscsi/sda/size | 1 + src/test/disk_tests/iscsi/sda_udevadm | 21 +++++++++++++++++++ src/test/disklist_test.pm | 6 ------ 11 files changed, 52 insertions(+), 21 deletions(-) create mode 100644 src/test/disk_tests/iscsi/disklist create mode 100644 src/test/disk_tests/iscsi/disklist_expected.json create mode 100644 src/test/disk_tests/iscsi/lsblk create mode 100644 src/test/disk_tests/iscsi/sda/device/model create mode 100644 src/test/disk_tests/iscsi/sda/device/vendor create mode 100644 src/test/disk_tests/iscsi/sda/queue/rotational create mode 100644 src/test/disk_tests/iscsi/sda/size create mode 100644 src/test/disk_tests/iscsi/sda_udevadm diff --git a/src/PVE/API2/Disks.pm b/src/PVE/API2/Disks.pm index 673bbcb..ee287f7 100644 --- a/src/PVE/API2/Disks.pm +++ b/src/PVE/API2/Disks.pm @@ -145,8 +145,8 @@ __PACKAGE__->register_method({ health => { type => 'string', optional => 1 }, transport => { type => 'string', - description => 'The bus type the disk is attached with ' - . '(for example sata, sas, fc, nvme, usb).', + description => 'The bus type the disk is attached with (for ' + . 'example sata, sas, usb, fc, iscsi, nvme, nvme-fc, nvme-tcp).', optional => 1, }, parent => { diff --git a/src/PVE/Diskmanage.pm b/src/PVE/Diskmanage.pm index 7ab8119..ed270e9 100644 --- a/src/PVE/Diskmanage.pm +++ b/src/PVE/Diskmanage.pm @@ -475,16 +475,6 @@ sub dir_is_empty { return 1; } -sub is_iscsi { - my ($sysdir) = @_; - - if (-l $sysdir && readlink($sysdir) =~ m|host[^/]*/session[^/]*|) { - return 1; - } - - return 0; -} - # Returns the NVMe transport (pcie, fc, tcp, rdma, loop) of a namespace, either directly from # its controller, or from any controller of its subsystem for native NVMe multipath setups. sub get_nvme_transport { @@ -603,9 +593,6 @@ sub get_disks { my $sysdir = "/sys/block/$dev"; - # we do not want iscsi devices - return if is_iscsi($sysdir); - my $nvme_transport; $nvme_transport = get_nvme_transport($sysdir) if $dev =~ m/^nvme/; diff --git a/src/test/disk_tests/iscsi/disklist b/src/test/disk_tests/iscsi/disklist new file mode 100644 index 0000000..9191c61 --- /dev/null +++ b/src/test/disk_tests/iscsi/disklist @@ -0,0 +1 @@ +sda diff --git a/src/test/disk_tests/iscsi/disklist_expected.json b/src/test/disk_tests/iscsi/disklist_expected.json new file mode 100644 index 0000000..ca33410 --- /dev/null +++ b/src/test/disk_tests/iscsi/disklist_expected.json @@ -0,0 +1,19 @@ +{ + "sda": { + "devpath": "/dev/sda", + "size": 10737418240, + "vendor": "LIO-ORG", + "model": "vdisk1", + "serial": "ISER1", + "wwn": "0x60014051111111111", + "gpt": 0, + "rpm": -1, + "type": "unknown", + "health": "UNKNOWN", + "wearout": "N/A", + "osdid": -1, + "osdid-list": null, + "by_id_link": "/dev/disk/by-id/scsi-360014051111111111", + "transport": "iscsi" + } +} diff --git a/src/test/disk_tests/iscsi/lsblk b/src/test/disk_tests/iscsi/lsblk new file mode 100644 index 0000000..526d27c --- /dev/null +++ b/src/test/disk_tests/iscsi/lsblk @@ -0,0 +1,5 @@ +{ + "blockdevices": [ + {"path":"/dev/sda", "parttype":null, "fstype":null, "tran":"iscsi"} + ] +} diff --git a/src/test/disk_tests/iscsi/sda/device/model b/src/test/disk_tests/iscsi/sda/device/model new file mode 100644 index 0000000..b14d6fe --- /dev/null +++ b/src/test/disk_tests/iscsi/sda/device/model @@ -0,0 +1 @@ +vdisk1 diff --git a/src/test/disk_tests/iscsi/sda/device/vendor b/src/test/disk_tests/iscsi/sda/device/vendor new file mode 100644 index 0000000..968831c --- /dev/null +++ b/src/test/disk_tests/iscsi/sda/device/vendor @@ -0,0 +1 @@ +LIO-ORG diff --git a/src/test/disk_tests/iscsi/sda/queue/rotational b/src/test/disk_tests/iscsi/sda/queue/rotational new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/src/test/disk_tests/iscsi/sda/queue/rotational @@ -0,0 +1 @@ +1 diff --git a/src/test/disk_tests/iscsi/sda/size b/src/test/disk_tests/iscsi/sda/size new file mode 100644 index 0000000..14faeec --- /dev/null +++ b/src/test/disk_tests/iscsi/sda/size @@ -0,0 +1 @@ +20971520 diff --git a/src/test/disk_tests/iscsi/sda_udevadm b/src/test/disk_tests/iscsi/sda_udevadm new file mode 100644 index 0000000..ca9f781 --- /dev/null +++ b/src/test/disk_tests/iscsi/sda_udevadm @@ -0,0 +1,21 @@ +P: /devices/platform/host5/session1/target5:0:0/5:0:0:0/block/sda +N: sda +S: disk/by-id/scsi-360014051111111111 +S: disk/by-id/wwn-0x60014051111111111 +S: disk/by-path/ip-192.168.1.10:3260-iscsi-iqn.2003-01.org.linux-iscsi.storage:target1-lun-0 +E: DEVLINKS=/dev/disk/by-id/scsi-360014051111111111 /dev/disk/by-id/wwn-0x60014051111111111 /dev/disk/by-path/ip-192.168.1.10:3260-iscsi-iqn.2003-01.org.linux-iscsi.storage:target1-lun-0 +E: DEVNAME=/dev/sda +E: DEVPATH=/devices/platform/host5/session1/target5:0:0/5:0:0:0/block/sda +E: DEVTYPE=disk +E: ID_BUS=scsi +E: ID_MODEL=vdisk1 +E: ID_PATH=ip-192.168.1.10:3260-iscsi-iqn.2003-01.org.linux-iscsi.storage:target1-lun-0 +E: ID_SCSI=1 +E: ID_SERIAL=36001405111111111 +E: ID_SERIAL_SHORT=ISER1 +E: ID_TYPE=disk +E: ID_VENDOR=LIO-ORG +E: ID_WWN=0x60014051111111111 +E: MAJOR=8 +E: MINOR=0 +E: SUBSYSTEM=block diff --git a/src/test/disklist_test.pm b/src/test/disklist_test.pm index 9e35430..dc84510 100644 --- a/src/test/disklist_test.pm +++ b/src/test/disklist_test.pm @@ -105,10 +105,6 @@ sub mocked_get_sysdir_size { return &$originalsub($param); } -sub mocked_is_iscsi { - return 0; -} - sub mocked_file_read_firstline { my ($path) = @_; @@ -262,8 +258,6 @@ $diskmanage_module->mock('get_sysdir_info' => \&mocked_get_sysdir_info); print("\tMocked get_sysdir_info\n"); $diskmanage_module->mock('get_sysdir_size' => \&mocked_get_sysdir_size); print("\tMocked get_sysdir_size\n"); -$diskmanage_module->mock('is_iscsi' => \&mocked_is_iscsi); -print("\tMocked is_iscsi\n"); $diskmanage_module->mock('assert_blockdev' => sub { return 1; }); print("\tMocked assert_blockdev\n"); $diskmanage_module->mock( -- 2.47.3