From: Leo Nunner <l.nunner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH storage 1/1] fix #2641: allow mounting of CIFS subdirectories
Date: Thu, 1 Dec 2022 12:32:55 +0100 [thread overview]
Message-ID: <20221201113257.57225-2-l.nunner@proxmox.com> (raw)
In-Reply-To: <20221201113257.57225-1-l.nunner@proxmox.com>
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 | 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
next prev parent reply other threads:[~2022-12-01 11:34 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-01 11:32 [pve-devel] [PATCH storage manager docs] Allow " Leo Nunner
2022-12-01 11:32 ` Leo Nunner [this message]
2023-02-07 14:58 ` [pve-devel] applied: [PATCH storage 1/1] fix #2641: allow " Thomas Lamprecht
2022-12-01 11:32 ` [pve-devel] [PATCH manager 1/1] fix #2641: expose CIFS subdir parameter through GUI Leo Nunner
2022-12-01 11:32 ` [pve-devel] [PATCH docs 1/1] fix #2641: document subdir parameter for CIFS backend Leo Nunner
2023-02-02 14:20 ` [pve-devel] [PATCH storage manager docs] Allow mounting of CIFS subdirectories Leo Nunner
2023-02-07 14:58 ` [pve-devel] applied: " Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221201113257.57225-2-l.nunner@proxmox.com \
--to=l.nunner@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox