From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id A12641FF0E1 for ; Mon, 13 Jul 2026 11:20:00 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 1E0C721350; Mon, 13 Jul 2026 11:20:00 +0200 (CEST) Message-ID: <229b5f15-eb3f-405f-bf4f-f3b99ee084a4@proxmox.com> Date: Mon, 13 Jul 2026 11:19:25 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 storage 04/15] iscsi: introduce mapping support To: Mira Limbeck , pve-devel@lists.proxmox.com References: <20260430173220.441001-1-m.limbeck@proxmox.com> <20260430173220.441001-5-m.limbeck@proxmox.com> Content-Language: en-US From: Dietmar Maurer In-Reply-To: <20260430173220.441001-5-m.limbeck@proxmox.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1783934350352 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.350 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) RCVD_IN_DNSWL_LOW -0.7 Sender listed at https://www.dnswl.org/, low 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: FVPAITPSUSPGEA4TZZWEZVFLFNZROZGE X-Message-ID-Hash: FVPAITPSUSPGEA4TZZWEZVFLFNZROZGE X-MailFrom: dietmar@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: This is a miss-understanding. The iscsi "portal" property is not really the iscsi "portal" - instead, this refers to the "discovery address" (we probably want to rename that in the future). The iscsiadm tool has the same name confusion, using "portal" in the discovery command cli instead of discovery-address. So I would leave "portal" a required property. I also wonder what happens when we have both, a "target" and a "mapping"? - Dietmar On 4/30/26 7:31 PM, Mira Limbeck wrote: > `portal` and `target` should be optional then. There is no need for > those when a mapping is specified. In return the config needs to be > checked to make sure either portal and target are defined, or a mapping. > > Signed-off-by: Mira Limbeck > --- > src/PVE/Storage/ISCSIPlugin.pm | 18 ++++++++++++++++-- > 1 file changed, 16 insertions(+), 2 deletions(-) > > diff --git a/src/PVE/Storage/ISCSIPlugin.pm b/src/PVE/Storage/ISCSIPlugin.pm > index 30f4178..88a35be 100644 > --- a/src/PVE/Storage/ISCSIPlugin.pm > +++ b/src/PVE/Storage/ISCSIPlugin.pm > @@ -9,6 +9,7 @@ use IO::File; > > use PVE::JSONSchema qw(get_standard_option); > use PVE::Storage::Plugin; > +use PVE::Storage::Mapping; > use PVE::Tools > qw(run_command file_read_firstline trim dir_glob_regex dir_glob_foreach $IPV4RE $IPV6RE); > > @@ -354,8 +355,9 @@ sub properties { > > sub options { > return { > - portal => { fixed => 1 }, > - target => { fixed => 1 }, > + portal => { fixed => 1, optional => 1 }, > + target => { fixed => 1, optional => 1 }, > + mapping => { optional => 1 }, > nodes => { optional => 1 }, > disable => { optional => 1 }, > content => { optional => 1 }, > @@ -703,4 +705,16 @@ sub volume_import { > die "volume import is not possible on iscsi storage\n"; > } > > +sub check_config { > + my ($class, $sectionId, $config, $create, $skipSchemaCheck) = @_; > + > + my $checked = $class->SUPER::check_config($sectionId, $config, $create, $skipSchemaCheck); > + > + # check if either target or mapping is set > + die "iscsi storage '$sectionId' has neither 'target' nor 'mapping' defined\n" > + if !defined($checked->{target}) && !defined($checked->{mapping}); > + > + return $checked; > +} > + > 1;