]> git.proxmox.com Git - pve-storage.git/commitdiff
fix #2641: allow mounting of CIFS subdirectories
authorLeo Nunner <l.nunner@proxmox.com>
Thu, 1 Dec 2022 11:32:55 +0000 (12:32 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Tue, 7 Feb 2023 14:47:08 +0000 (15:47 +0100)
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@proxmox.com>
PVE/Storage/CIFSPlugin.pm
PVE/Storage/CephFSPlugin.pm
PVE/Storage/Plugin.pm

index d238844e85af9ea95739eacb90510bac1d674dce..37db882c7a10cc723c63f85316f6514fe29dddbf 100644 (file)
@@ -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'];
 
@@ -131,6 +141,7 @@ sub options {
        'content-dirs' => { optional => 1 },
        server => { fixed => 1 },
        share => { fixed => 1 },
+       subdir => { optional => 1 },
        nodes => { optional => 1 },
        disable => { optional => 1 },
        maxfiles => { optional => 1 },
@@ -205,12 +216,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);
 }
@@ -222,17 +229,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});
     }
 
@@ -246,10 +251,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');
     }
index 497674729e20f5982b915391979395dd9050938f..944f0b872d1ea95ba98366d90f565c9def609370 100644 (file)
@@ -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',
index a3aac611b5a77fa7a5bb07b7bb00eaa2b84cbf2d..ca7a0d4ed4dcc8f50043caf1e726c0dd56e509b7 100644 (file)
@@ -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',