202 lines
6.7 KiB
Diff
202 lines
6.7 KiB
Diff
--- /mnt/c/Users/Kevin/eclipse-workspace/freenas-proxmox/stable-8/perl5/PVE/Storage/ZFSPlugin.pm.orig 2026-05-20 12:28:37.312211300 -0400
|
|
+++ /tmp/ZFSPlugin-8x-work.pm 2026-05-22 08:57:21.728470343 -0400
|
|
@@ -10,6 +10,7 @@
|
|
|
|
use base qw(PVE::Storage::ZFSPoolPlugin);
|
|
use PVE::Storage::LunCmd::Comstar;
|
|
+use PVE::Storage::LunCmd::FreeNAS;
|
|
use PVE::Storage::LunCmd::Istgt;
|
|
use PVE::Storage::LunCmd::Iet;
|
|
use PVE::Storage::LunCmd::LIO;
|
|
@@ -26,13 +27,14 @@
|
|
modify_lu => 1,
|
|
add_view => 1,
|
|
list_view => 1,
|
|
+ list_extent => 1,
|
|
list_lu => 1,
|
|
};
|
|
|
|
my $zfs_unknown_scsi_provider = sub {
|
|
my ($provider) = @_;
|
|
|
|
- die "$provider: unknown iscsi provider. Available [comstar, istgt, iet, LIO]";
|
|
+ die "$provider: unknown iscsi provider. Available [comstar, freenas, istgt, iet, LIO]";
|
|
};
|
|
|
|
my $zfs_get_base = sub {
|
|
@@ -40,6 +42,8 @@
|
|
|
|
if ($scfg->{iscsiprovider} eq 'comstar') {
|
|
return PVE::Storage::LunCmd::Comstar::get_base;
|
|
+ } elsif ($scfg->{iscsiprovider} eq 'freenas') {
|
|
+ return PVE::Storage::LunCmd::FreeNAS::get_base;
|
|
} elsif ($scfg->{iscsiprovider} eq 'istgt') {
|
|
return PVE::Storage::LunCmd::Istgt::get_base;
|
|
} elsif ($scfg->{iscsiprovider} eq 'iet') {
|
|
@@ -62,6 +66,8 @@
|
|
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 'freenas') {
|
|
+ $msg = PVE::Storage::LunCmd::FreeNAS::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') {
|
|
@@ -157,7 +163,7 @@
|
|
sub zfs_get_lun_number {
|
|
my ($class, $scfg, $guid) = @_;
|
|
|
|
- die "could not find lun_number for guid $guid" if !$guid;
|
|
+ die "could not find lun_number for guid $guid" if !defined $guid;
|
|
|
|
if ($class->zfs_request($scfg, undef, 'list_view', $guid) =~ /^(\d+)$/) {
|
|
return $1;
|
|
@@ -166,6 +172,15 @@
|
|
die "lun_number for guid $guid is not a number";
|
|
}
|
|
|
|
+# Part of the multipath enhancement
|
|
+sub zfs_get_wwid_number {
|
|
+ my ($class, $scfg, $guid) = @_;
|
|
+
|
|
+ die "could not find lun_number for guid $guid" if !defined $guid;
|
|
+
|
|
+ return $class->zfs_request($scfg, undef, 'list_extent', $guid);
|
|
+}
|
|
+
|
|
# Configuration
|
|
|
|
sub type {
|
|
@@ -184,6 +199,32 @@
|
|
description => "iscsi provider",
|
|
type => 'string',
|
|
},
|
|
+ # This is for FreeNAS iscsi and API intergration
|
|
+ # And some enhancements asked by the community
|
|
+ freenas_user => {
|
|
+ description => "FreeNAS API Username",
|
|
+ type => 'string',
|
|
+ },
|
|
+ freenas_password => {
|
|
+ description => "FreeNAS API Password (Deprecated)",
|
|
+ type => 'string',
|
|
+ },
|
|
+ truenas_secret => {
|
|
+ description => "TrueNAS API Secret",
|
|
+ type => 'string',
|
|
+ },
|
|
+ truenas_token_auth => {
|
|
+ description => "TrueNAS API Authentication with Token",
|
|
+ type => 'boolean',
|
|
+ },
|
|
+ freenas_use_ssl => {
|
|
+ description => "FreeNAS API access via SSL",
|
|
+ type => 'boolean',
|
|
+ },
|
|
+ freenas_apiv4_host => {
|
|
+ description => "FreeNAS API Host",
|
|
+ type => 'string',
|
|
+ },
|
|
# this will disable write caching on comstar and istgt.
|
|
# it is not implemented for iet. iet blockio always operates with
|
|
# writethrough caching when not in readonly mode
|
|
@@ -211,14 +252,20 @@
|
|
nodes => { optional => 1 },
|
|
disable => { optional => 1 },
|
|
portal => { fixed => 1 },
|
|
- target => { fixed => 1 },
|
|
- pool => { fixed => 1 },
|
|
+ target => { fixed => 0 },
|
|
+ pool => { fixed => 0 },
|
|
blocksize => { fixed => 1 },
|
|
iscsiprovider => { fixed => 1 },
|
|
nowritecache => { optional => 1 },
|
|
sparse => { optional => 1 },
|
|
comstar_hg => { optional => 1 },
|
|
comstar_tg => { optional => 1 },
|
|
+ freenas_user => { optional => 1 },
|
|
+ freenas_password => { optional => 1 },
|
|
+ truenas_secret => { optional => 1 },
|
|
+ truenas_token_auth => { optional => 1 },
|
|
+ freenas_use_ssl => { optional => 1 },
|
|
+ freenas_apiv4_host => { optional => 1 },
|
|
lio_tpg => { optional => 1 },
|
|
content => { optional => 1 },
|
|
bwlimit => { optional => 1 },
|
|
@@ -243,6 +290,40 @@
|
|
|
|
my $path = "iscsi://$portal/$target/$lun";
|
|
|
|
+ # Multipath enhancement
|
|
+ eval {
|
|
+ my $wwid = $class->zfs_get_wwid_number($scfg, $guid);
|
|
+# syslog(info,"JD: path get_lun_number guid $guid");
|
|
+
|
|
+ if ($wwid =~ /^([-\@\w.]+)$/) {
|
|
+ $wwid = $1; # $data now untainted
|
|
+ } else {
|
|
+ die "Bad data in '$wwid'"; # log this somewhere
|
|
+ }
|
|
+ my $wwid_end = substr $wwid, 16;
|
|
+
|
|
+ my $mapper = '';
|
|
+ sleep 3;
|
|
+ run_command("iscsiadm -m session --rescan");
|
|
+ sleep 3;
|
|
+ my $line = `/usr/sbin/multipath -ll | grep \"$wwid_end\"`;
|
|
+ my ($mapper_device) = split(' ', $line);
|
|
+ $mapper_device = "" unless $mapper_device;
|
|
+ $mapper .= $mapper_device;
|
|
+
|
|
+ if ($mapper =~ /^([-\@\w.]+)$/) {
|
|
+ $mapper = $1; # $data now untainted
|
|
+ } else {
|
|
+ $mapper = '';
|
|
+ }
|
|
+
|
|
+# syslog(info,"Multipath mapper found: $mapper\n");
|
|
+ if ($mapper ne "") {
|
|
+ $path = "/dev/mapper/$mapper";
|
|
+ sleep 5;
|
|
+ }
|
|
+ };
|
|
+
|
|
return ($path, $vmid, $vtype);
|
|
}
|
|
|
|
@@ -299,7 +380,33 @@
|
|
my $volname = $name;
|
|
|
|
$volname = $class->find_free_diskname($storeid, $scfg, $vmid, $fmt) if !$volname;
|
|
-
|
|
+
|
|
+ # Auto-detect ZFS blocksize from TrueNAS API and override if wrong.
|
|
+ # SCALE requires >= 16k; CORE works with 8k. If the configured blocksize is
|
|
+ # less than recommended (or unset), correct it now and persist to storage.cfg.
|
|
+ if ( eq 'freenas') {
|
|
+ eval {
|
|
+ my = PVE::Storage::LunCmd::FreeNAS::freenas_get_recommended_blocksize(HASH(0x6158b91f5240));
|
|
+ if (defined ) {
|
|
+ my = PVE::Storage::LunCmd::FreeNAS::freenas_parse_blocksize();
|
|
+ if (! || < ) {
|
|
+ warn "freenas-proxmox: blocksize " . ( ? : 'unset') . " < recommended -- correcting storage ''\n";
|
|
+ = ;
|
|
+ eval {
|
|
+ require PVE::Storage;
|
|
+ PVE::Storage::lock_storage_config(sub {
|
|
+ my HASH(0x6158b91f52a0) = PVE::Storage::config();
|
|
+ = if HASH(0x6158b91f5420);
|
|
+ PVE::Storage::write_config(HASH(0x6158b91f52a0));
|
|
+ });
|
|
+ };
|
|
+ warn "freenas-proxmox: could not persist blocksize to storage config: \n" if ;
|
|
+ }
|
|
+ }
|
|
+ };
|
|
+ warn "TrueNAS blocksize detection failed: " if ;
|
|
+ }
|
|
+
|
|
$class->zfs_create_zvol($scfg, $volname, $size);
|
|
|
|
my $guid = $class->zfs_create_lu($scfg, $volname);
|