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 0E9701FF0F0 for ; Sun, 02 Aug 2026 05:32:56 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id CD320207D6; Sun, 02 Aug 2026 05:32:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=neatech-ar.20251104.gappssmtp.com; s=20251104; t=1785641561; x=1786246361; darn=lists.proxmox.com; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=EXG2Zbc6Ik7CIEmlmwgsZolgSWzkno/n4hBtvTJwI3I=; b=mQ/Hovg5attZEUKOG/vlb4bTNmHI27HFLUpMFWcaHIpFPGr2izvDzKvQ2PCcU5nYN7 YF93Rres7iJdpMPM5Wy8BjmhG9DnjvR8Xp+onAYpzaJv1A+V5tIejvboJ0eiapex2yzu C9ilPQ/oPccSR6103fqOtzutPCh9sITwqi8amIQ7qXF8dziVYbfmMUU/yJO5ehWlgXCq 7QifYHDb/50lQOvFotOX0f7ZxHnpnfLcL3e4ssLglVrKFlCJhnHCoXzf+aujF93BLAUX Kcau2JzCHSOWp8msfOWBIJ6E0kyRAhLsXxrKuuH8Y491feg4CrGakIVrlqLOyqeSpse/ P0Cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785641561; x=1786246361; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=EXG2Zbc6Ik7CIEmlmwgsZolgSWzkno/n4hBtvTJwI3I=; b=hAjPU4bcAxmyiBEnMIM3/j7HF0FN98Rme9nPtPkO7j4C7s+l4GZNxriDxPwtsvHXQa gSsPam4IDSC1Q6m+poi27DXaejohijQLrI+ko3nmRmG/qIHRgwC4/TOdVvj39FwdvgyB f09S6eRF3bG3kZ2mtMf/NsNtUY7nYvs5Jsq5Yx3igbJjBsDcCVwGPNU0BEeZUP0tOL6h Pq/X+lC62yWDHdReZqKAW27W+wCTbw0jndadEUOnVmHzwKh92CnERAL64cU29Lyz5v8n hWq1trU1YKfXWlMZC3Qt3Ho4tDk1+hK/nlcDUsXZaYMXJvhQZWKk1ZSUyn9cuNlUH3VM u9KA== X-Gm-Message-State: AOJu0YxDVt4GVo0sH0oYR8v8j9/MSKjHUB1FlBBnPgcLnHOXm2CRnEt6 Z6qdnfKEVdKarx/Kjy9y2N+0FiOK/bojrCgPhk7uMo6ufOKgZdElxLjmUpYFMJeHSsSZ6/Fo9xt hsPEnDOo= X-Gm-Gg: AR+sD13f96WUqjqfN9gD7PUI1UQQXNl/EG7F/bw6RBh6qOjpbq+OuesgjtQCw/tNsQ2 UEqXgbcxOgNuzV3812tXyJVAlT/rndCytFJ5pl5DNjX7RwMK7gIuKazVE1LUbkFJoQLWkpeWMie geyw2gE3qQneHZOJmvlevHpC8CiyNS6vL4MXcFuP8pJrK+Z1otzLBP5IO3FzpMTR25z1hY3ludR EyiHLqdZBN0XGW2q/YkwAjML8rEYTw/JbZMjutSovIAIJJ6bjkijYzULjZvyEdqFKJMlWP21gLo UkEgU1G6r3uglGVxFv3TpNJyZJL+ptyoTc+6RiKzJN2ANMUM5DrPQGnB859r51vGe670vs+9PeL Ga4/FjwLazIC/8/vO8wXJQBIgrMJUEmsnEIub1+waJpG5f8seVxO+0pGQpTQjgVlwKmQWHWHPLl l2ghyL3J6VLtqwpoJC4rj3TQ2N7xaYY0Wjs455Zsgvj5pvJQFKV1MvQzYwoXRjJycS1E4BqtGOH iWqF4Q5jPhPKOe3YhADsoxAdfVyQc+2f0SnRXczhziD X-Received: by 2002:a17:903:190:b0:2cf:7dfa:7f56 with SMTP id d9443c01a7336-2d052404e64mr77009115ad.2.1785641561336; Sat, 01 Aug 2026 20:32:41 -0700 (PDT) From: Joaquin Varela To: pve-devel@lists.proxmox.com Subject: [PATCH storage v2 1/7] zfs: make LUN provider dispatch overridable Date: Sun, 2 Aug 2026 00:31:35 -0300 Message-ID: X-Mailer: git-send-email 2.54.0.windows.1 In-Reply-To: References: 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 DMARC_PASS -0.1 DMARC pass policy 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: ELJXWRGSXX2QXMHV7YJEWF7FZMHSGHRX X-Message-ID-Hash: ELJXWRGSXX2QXMHV7YJEWF7FZMHSGHRX X-MailFrom: joaquinvarela@neatech.ar 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 CC: Joaquin Varela X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: ZFSPlugin hard-codes the LUN command provider in several lifecycle paths. Move that selection behind zfs_lun_provider() so subclasses can reuse the mature ZFS lifecycle with another transport instead of copying it. The default remains PVE::Storage::LunCmd::LIO. Existing ZFS over iSCSI configurations keep their current behavior. Signed-off-by: Joaquin Varela --- src/PVE/Storage/ZFSPlugin.pm | 45 ++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/PVE/Storage/ZFSPlugin.pm b/src/PVE/Storage/ZFSPlugin.pm index 74e0a08..c633e4d 100644 --- a/src/PVE/Storage/ZFSPlugin.pm +++ b/src/PVE/Storage/ZFSPlugin.pm @@ -35,21 +35,30 @@ my $zfs_unknown_scsi_provider = sub { die "$provider: unknown iscsi provider. Available [comstar, istgt, iet, LIO]"; }; -my $zfs_get_base = sub { - my ($scfg) = @_; +sub zfs_lun_provider { + my ($class, $scfg) = @_; if ($scfg->{iscsiprovider} eq 'comstar') { - return PVE::Storage::LunCmd::Comstar::get_base($scfg); + return 'PVE::Storage::LunCmd::Comstar'; } elsif ($scfg->{iscsiprovider} eq 'istgt') { - return PVE::Storage::LunCmd::Istgt::get_base($scfg); + return 'PVE::Storage::LunCmd::Istgt'; } elsif ($scfg->{iscsiprovider} eq 'iet') { - return PVE::Storage::LunCmd::Iet::get_base($scfg); + return 'PVE::Storage::LunCmd::Iet'; } elsif ($scfg->{iscsiprovider} eq 'LIO') { - return PVE::Storage::LunCmd::LIO::get_base($scfg); + return 'PVE::Storage::LunCmd::LIO'; } else { $zfs_unknown_scsi_provider->($scfg->{iscsiprovider}); } -}; +} + +sub zfs_get_base { + my ($class, $scfg) = @_; + + my $provider = $class->zfs_lun_provider($scfg); + my $get_base = $provider->can('get_base') + or die "$provider does not implement get_base\n"; + return $get_base->($scfg); +} sub zfs_request { my ($class, $scfg, $timeout, $method, @params) = @_; @@ -60,18 +69,10 @@ sub zfs_request { my $msg = ''; if ($lun_cmds->{$method}) { - if ($scfg->{iscsiprovider} eq 'comstar') { - $msg = - PVE::Storage::LunCmd::Comstar::run_lun_command($scfg, $timeout, $method, @params); - } elsif ($scfg->{iscsiprovider} eq 'istgt') { - $msg = PVE::Storage::LunCmd::Istgt::run_lun_command($scfg, $timeout, $method, @params); - } elsif ($scfg->{iscsiprovider} eq 'iet') { - $msg = PVE::Storage::LunCmd::Iet::run_lun_command($scfg, $timeout, $method, @params); - } elsif ($scfg->{iscsiprovider} eq 'LIO') { - $msg = PVE::Storage::LunCmd::LIO::run_lun_command($scfg, $timeout, $method, @params); - } else { - $zfs_unknown_scsi_provider->($scfg->{iscsiprovider}); - } + my $provider = $class->zfs_lun_provider($scfg); + my $run_lun_command = $provider->can('run_lun_command') + or die "$provider does not implement run_lun_command\n"; + $msg = $run_lun_command->($scfg, $timeout, $method, @params); } else { my $target = 'root@' . $scfg->{portal}; @@ -100,7 +101,7 @@ sub zfs_request { sub zfs_get_lu_name { my ($class, $scfg, $zvol) = @_; - my $base = $zfs_get_base->($scfg); + my $base = $class->zfs_get_base($scfg); $zvol = ($class->parse_volname($zvol))[1]; @@ -134,7 +135,7 @@ sub zfs_delete_lu { sub zfs_create_lu { my ($class, $scfg, $zvol) = @_; - my $base = $zfs_get_base->($scfg); + my $base = $class->zfs_get_base($scfg); my $guid = $class->zfs_request($scfg, undef, 'create_lu', "$base/$scfg->{pool}/$zvol"); return $guid; @@ -143,7 +144,7 @@ sub zfs_create_lu { sub zfs_import_lu { my ($class, $scfg, $zvol) = @_; - my $base = $zfs_get_base->($scfg); + my $base = $class->zfs_get_base($scfg); $class->zfs_request($scfg, undef, 'import_lu', "$base/$scfg->{pool}/$zvol"); } -- 2.54.0.windows.1