[pve-devel] [PATCH storage] fix #2085: Handle non-default mount point in path() by introducing new mountpoint property

Fabian Grünbichler f.gruenbichler at proxmox.com
Thu Nov 7 12:59:42 CET 2019


On November 7, 2019 12:52 pm, Fabian Ebner wrote:
> On 11/7/19 9:34 AM, Fabian Grünbichler wrote:
>> On November 6, 2019 1:46 pm, Fabian Ebner wrote:
>>> A new mountpoint property is added to the schema for ZFSPool storages.
>>> When needed for the first time, the current mount point is determined and
>>> written to the storage config.
>>>
>>> Signed-off-by: Fabian Ebner <f.ebner at proxmox.com>
>>> ---
>>>   PVE/Storage/ZFSPoolPlugin.pm | 25 +++++++++++++++++++++++--
>>>   1 file changed, 23 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm
>>> index 16fb0d6..44c8123 100644
>>> --- a/PVE/Storage/ZFSPoolPlugin.pm
>>> +++ b/PVE/Storage/ZFSPoolPlugin.pm
>>> @@ -32,6 +32,10 @@ sub properties {
>>>   	    description => "use sparse volumes",
>>>   	    type => 'boolean',
>>>   	},
>>> +	mountpoint => {
>>> +	    description => "mount point",
>>> +	    type => 'string', format => 'pve-storage-path',
>>> +	},
>>>       };
>>>   }
>>>   
>>> @@ -44,6 +48,7 @@ sub options {
>>>   	disable => { optional => 1 },
>>>   	content => { optional => 1 },
>>>   	bwlimit => { optional => 1 },
>>> +	mountpoint => { optional => 1 },
>>>       };
>>>   }
>>>   
>>> @@ -148,11 +153,27 @@ sub path {
>>>       my ($vtype, $name, $vmid) = $class->parse_volname($volname);
>>>   
>>>       my $path = '';
>>> +    my $mountpoint = $scfg->{mountpoint};
>>> +
>>> +    # automatically write mountpoint to storage config if it is not present
>>> +    if (!$mountpoint) {
>>> +	$mountpoint = $class->zfs_request($scfg, undef, 'get', '-o', 'value',
>>> +					  'mountpoint', '-H', $scfg->{pool});
>>> +	chomp($mountpoint);
>>> +
>>> +	eval {
>>> +	    PVE::Storage::lock_storage_config(sub {
>>> +		my $cfg = PVE::Storage::config();
>>> +		$cfg->{ids}->{$storeid}->{mountpoint} = $mountpoint;
>>> +		PVE::Storage::write_config($cfg);
>>> +	    }, "update storage config failed");
>>> +	};
>>> +	warn $@ if $@;
>>> +    }
>>>   
>>>       if ($vtype eq "images") {
>>>   	if ($name =~ m/^subvol-/ || $name =~ m/^basevol-/) {
>>> -	    # fixme: we currently assume standard mount point?!
>>> -	    $path = "/$scfg->{pool}/$name";
>>> +	    $path = "$mountpoint/$name";
>>>   	} else {
>>>   	    $path = "/dev/zvol/$scfg->{pool}/$name";
>>>   	}
>> 
>> it would be great if this "get mountpoint property of dataset" (or better:
>> even "get arbitrary properties of dataset") helper could be factored out.
>> we already have two calls to "zfs get -Hp '...' $dataset" that could
>> re-use such a helper.
>> 
>> then we could add a single check in activate_storage (maybe just for the
>> branch where we actually just imported the pool?) to verify that the
>> stored mountpoint value is correct, and if not update it (or warn about
>> the problem). that check could have a very low timeout, and errors could
>> be ignored since it is just a double-check.
>> 
>> _______________________________________________
>> pve-devel mailing list
>> pve-devel at pve.proxmox.com
>> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>> 
> 
> I noticed that the $scfg parameter in zfs_request is never used. Should 
> I clean that up? Otherwise I'd need to include the $scfg parameter in 
> the helper function as well, where it also isn't needed.

it's used by ZFS over iSCSI, where the plugin is derived from 
ZFSPoolPlugin, so it's not safe to remove ;)




More information about the pve-devel mailing list