[pve-devel] [PATCH storage 1/1] fix #2641: allow mounting of CIFS subdirectories

Leo Nunner l.nunner at proxmox.com
Thu Dec 1 12:32:55 CET 2022


CIFS/SMB supports directly mounting subdirectories, so it makes sense to
also allow the --subdir parameter for these storages. The subdir
parameter was moved from CephFSPlugin.pm to Plugin.pm, because it isn't
specific to CephFS anymore.

Signed-off-by: Leo Nunner <l.nunner at proxmox.com>
---
 PVE/Storage/CIFSPlugin.pm   | 39 ++++++++++++++++++++-----------------
 PVE/Storage/CephFSPlugin.pm |  4 ----
 PVE/Storage/Plugin.pm       |  5 +++++
 3 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/PVE/Storage/CIFSPlugin.pm b/PVE/Storage/CIFSPlugin.pm
index 982040a..dc41e0b 100644
--- a/PVE/Storage/CIFSPlugin.pm
+++ b/PVE/Storage/CIFSPlugin.pm
@@ -13,11 +13,16 @@ use base qw(PVE::Storage::Plugin);
 
 # CIFS helper functions
 
-sub cifs_is_mounted {
-    my ($server, $share, $mountpoint, $mountdata) = @_;
+sub cifs_is_mounted : prototype($$) {
+    my ($scfg, $mountdata) = @_;
+
+    my $mountpoint = $scfg->{path};
+    my $server = $scfg->{server};
+    my $share = $scfg->{share};
+    my $subdir = $scfg->{subdir} // "/";
 
     $server = "[$server]" if Net::IP::ip_is_ipv6($server);
-    my $source = "//${server}/$share";
+    my $source = "//${server}/$share$subdir";
     $mountdata = PVE::ProcFSTools::parse_proc_mounts() if !$mountdata;
 
     return $mountpoint if grep {
@@ -63,11 +68,16 @@ sub get_cred_file {
     return undef;
 }
 
-sub cifs_mount {
-    my ($server, $share, $mountpoint, $storeid, $smbver, $user, $domain) = @_;
+sub cifs_mount : prototype($$$$$) {
+    my ($scfg, $storeid, $smbver, $user, $domain) = @_;
+
+    my $mountpoint = $scfg->{path};
+    my $server = $scfg->{server};
+    my $share = $scfg->{share};
+    my $subdir = $scfg->{subdir} // "/";
 
     $server = "[$server]" if Net::IP::ip_is_ipv6($server);
-    my $source = "//${server}/$share";
+    my $source = "//${server}/$share$subdir";
 
     my $cmd = ['/bin/mount', '-t', 'cifs', $source, $mountpoint, '-o', 'soft', '-o'];
 
@@ -130,6 +140,7 @@ sub options {
 	path => { fixed => 1 },
 	server => { fixed => 1 },
 	share => { fixed => 1 },
+	subdir => { optional => 1 },
 	nodes => { optional => 1 },
 	disable => { optional => 1 },
 	maxfiles => { optional => 1 },
@@ -204,12 +215,8 @@ sub status {
     $cache->{mountdata} = PVE::ProcFSTools::parse_proc_mounts()
 	if !$cache->{mountdata};
 
-    my $path = $scfg->{path};
-    my $server = $scfg->{server};
-    my $share = $scfg->{share};
-
     return undef
-	if !cifs_is_mounted($server, $share, $path, $cache->{mountdata});
+	if !cifs_is_mounted($scfg, $cache->{mountdata});
 
     return $class->SUPER::status($storeid, $scfg, $cache);
 }
@@ -221,17 +228,15 @@ sub activate_storage {
 	if !$cache->{mountdata};
 
     my $path = $scfg->{path};
-    my $server = $scfg->{server};
-    my $share = $scfg->{share};
 
-    if (!cifs_is_mounted($server, $share, $path, $cache->{mountdata})) {
+    if (!cifs_is_mounted($scfg, $cache->{mountdata})) {
 
 	mkpath $path if !(defined($scfg->{mkdir}) && !$scfg->{mkdir});
 
 	die "unable to activate storage '$storeid' - " .
 	    "directory '$path' does not exist\n" if ! -d $path;
 
-	cifs_mount($server, $share, $path, $storeid, $scfg->{smbversion},
+	cifs_mount($scfg, $storeid, $scfg->{smbversion},
 	    $scfg->{username}, $scfg->{domain});
     }
 
@@ -245,10 +250,8 @@ sub deactivate_storage {
 	if !$cache->{mountdata};
 
     my $path = $scfg->{path};
-    my $server = $scfg->{server};
-    my $share = $scfg->{share};
 
-    if (cifs_is_mounted($server, $share, $path, $cache->{mountdata})) {
+    if (cifs_is_mounted($scfg, $cache->{mountdata})) {
 	my $cmd = ['/bin/umount', $path];
 	run_command($cmd, errmsg => 'umount error');
     }
diff --git a/PVE/Storage/CephFSPlugin.pm b/PVE/Storage/CephFSPlugin.pm
index 4976747..944f0b8 100644
--- a/PVE/Storage/CephFSPlugin.pm
+++ b/PVE/Storage/CephFSPlugin.pm
@@ -127,10 +127,6 @@ sub properties {
 	    description => "Mount CephFS through FUSE.",
 	    type => 'boolean',
 	},
-	subdir => {
-	    description => "Subdir to mount.",
-	    type => 'string', format => 'pve-storage-path',
-	},
 	'fs-name' => {
 	    description => "The Ceph filesystem name.",
 	    type => 'string', format => 'pve-configid',
diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm
index 8a41df1..af53a99 100644
--- a/PVE/Storage/Plugin.pm
+++ b/PVE/Storage/Plugin.pm
@@ -169,6 +169,11 @@ my $defaultData = {
 	    type => 'boolean',
 	    optional => 1,
 	},
+	subdir => {
+	    description => "Subdir to mount.",
+	    type => 'string', format => 'pve-storage-path',
+	    optional => 1,
+	},
 	'format' => {
 	    description => "Default image format.",
 	    type => 'string', format => 'pve-storage-format',
-- 
2.30.2






More information about the pve-devel mailing list